MySql主從複製(Master-Slave)(1主2從)

先簡單的說一下MySql複製的過程,但是實際的每個步驟比這要複雜。
1.主(master)服務器把數據更改的記錄或者事件記錄到二進制日誌裏。
2.從(slave)服務器把主服務器的二進制日誌複製到自己的中繼日誌裏。
3.從(slave)服務器根據中繼日誌的內容應用到自己的數據上。

假設我們的主從複製結構是由3臺服務器構成,1臺master,2臺slave。

文章中的命令行提示符的含義:

[root@m/s/s ~]#  表示要在master slave slave三臺服務器裏都要執行的命令  [root@master ~]# 表示只在master服務器裏執行的命令  [root@s/s ~]#    表示要在2臺slave服務器裏都要執行的命令  

第一步,分別在3臺機器上安裝MySql,並使用MySql自帶的my-medium.cnf作爲初始配置文件,在3臺服務器裏分別執行如下命令。

[root@m/s/s ~]# yum -y install mysql mysql-server  [root@m/s/s ~]# \cp -f /usr/share/doc/mysql-server-*/my-medium.cnf /etc/my.cnf  

第二步,創建用於複製的賬戶,我們不管主從,在3臺MySql創建相同用戶名密碼的用戶。
1.首先啓動MySql,並設置root密碼,我這裏是測試,所以你千萬別把密碼設置的這麼簡單。

[root@m/s/s ~]# /etc/init.d/mysqld start  [root@m/s/s ~]# /usr/bin/mysqladmin -u root password 'masterpass'  

2.創建並授權用於從服務器複製的複製賬戶。

[root@m/s/s ~]# mysql -uroot -p  Enter password:  mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repluser'@'192.168.  0.%' IDENTIFIED BY 'replpass';  Query OK, 0 rows affected (0.00 sec)  

★:如果你瞭解MySql,可能你會說只需要在主服務器上添加一個從服務器用於複製的賬戶即可,也不需要REPLICATION SLAVE權限,但是我這樣做的好處有2個方面,1是監視和管理複製,2是方便將來主從交換角色。

第三步,配置主(Master)服務器配置文件,此步在主(Master)裏操作。
在/etc/my.cnf的[mysqld]域後追加

server_id           = 100  log_bin             = mysql-bin  log_bin_index       = mysql-bin.index  sync_binlog   = 1  max_binlog_size     = 200M  
server_id        服務器ID,不要和別的服務器衝突了,在同一個局域網裏,我習慣使用ip的最後一位  log_bin          顯式的指定二進制日誌的文件名  log_bin_index    注意這裏指定的文件名不是記錄的表的索引,而是記錄了二進制日誌的文件名  sync_binlog      設爲1就是把MySql每次發生的修改和事件的日誌即時同步到硬盤上  max_binlog_size  指定二進制日誌的大小  

添加完設置後,重啓MySql,並確認主服務器狀態。

[root@master ~]# /etc/init.d/mysqld restart  [root@master ~]# mysql -uroot -p  Enter password:  mysql> show master status;  +------------------+----------+--------------+------------------+  | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |  +------------------+----------+--------------+------------------+  | mysql-bin.000004 |       98 |              |                  |  +------------------+----------+--------------+------------------+  1 row in set (0.00 sec)  

可見,二進制日誌已經開啓並生效了,接下來該配置從(Slave)服務器了。

第三步,配置2臺從(Slave)服務器配置文件,此步分別在2臺從(Slave)裏操作。
1.在192.168.0.101的/etc/my.cnf的[mysqld]域後追加

server_id           = 101  log_bin             = mysql-bin  log_bin_index       = mysql-bin.index  log_slave_updates   = 1  relay_log           = mysql-relay-bin  relay_log_index     = mysql-relay-bin.index  max_binlog_size     = 200M  read_only   = 1  slave-skip-errors   = 1062,1053  skip_slave_start    = 1  

2.在192.168.0.102的/etc/my.cnf的[mysqld]域後追加

server_id           = 102  log_bin             = mysql-bin  log_bin_index       = mysql-bin.index  log_slave_updates   = 1  relay_log           = mysql-relay-bin  relay_log_index     = mysql-relay-bin.index  max_binlog_size     = 200M  read_only   = 1  slave-skip-errors   = 1062,1053  skip_slave_start    = 1  

前面解釋的參數,這裏就不解釋了。

log_slave_updates    讓從服務器把自身複製的事件和記錄都寫到自己的二進制日誌裏  relay_log            中繼日誌  read_only            讓從服務器只讀,可以防止有人誤從服務器插入數據,導致主從數據不一致。  slave-skip-errors    在複製過程中忽略一些錯誤,讓複製繼續進行,在這裏我忽略了1062和1053號錯誤,如果要忽略所有錯誤就設成all  skip_slave_start     防止從服務器在崩潰後自動開啓,以給你足夠的時間修復。  

另外,你可能發現我把主(Master)服務器裏的一些配置,比如二進制日誌的設置也拿過來了,同樣是方便將來不停服務實現主從交換角色。

★:有人肯定要疑問了,爲什麼在從(Slave)服務器的配置裏沒有從主服務器複製的賬戶等相關信息?
回答:直接把這些的信息寫到配置文件是沒有好處的,根據一些高手的經驗,還可以能出不可以預知的錯誤,因此我們將在下一步啓動複製的時候,
在MySql命令行裏執行命令來指定這些信息,這樣做還有一個很大的好處,在我們要變換主服務器的時候不需要重啓MySql。
★:關於過濾複製對象的問題,但是如果不是特殊需要,不要使用複製過濾,因爲同樣有機率在一些事件觸發的時候導致一些錯誤。介紹幾種過濾參數。
binlog_do_db 只複製指定的數據庫(主服務器配置文件裏設置)
binlog_ignore_db 不復制指定的數據庫(主服務器配置文件裏設置)
replicate_ignore_table 不復制指定的表(從服務器配置文件裏設置)
replicate_wild_ignore_table 使用wild匹配來不復制的指定表(從服務器配置文件裏設置),比如參數設爲abc.%,表示不復制abc的所有表。

3.在2臺從(Slave)服務器裏重啓MySql服務器

[root@s/s ~]# /etc/init.d/mysqld restart  

★:因爲我們是新裝的MySql服務器,所以接下來我們就可以開啓複製了,如果你是給已經有大量數據的MySql服務器添加從(Slave)服務器,那麼先從主(Master)服務器把數據導入到從(Slave)服務器裏,讓2者的數據一致,然後再開啓複製。最簡單的方法就是關閉主服務器MySql的寫入,用mysqldump工具導出所有主(Master)服務器數據並上傳到從(Slave)服務器:

[root@master ~]# mysqldump -u root -p --all-databases > /tmp/dbbackup.sql  [root@master ~]# scp /tmp/dbbackup.sql [email protected]:/tmp/dbbackup.sql  [root@master ~]# scp /tmp/dbbackup.sql [email protected]:/tmp/dbbackup.sql  [root@master ~]# rm -f /tmp/dbbackup.sql  

然後把備份導入到從(Slave)服務器裏:

[root@s/s ~]# mysql -u root -p < /tmp/dbbackup.sql  [root@s/s ~]# rm -f /tmp/dbbackup.sql  

如果你要在主服務器MySql正常運行的狀態下進行熱拷貝等方法,我建議你不要用mysqldump這個命令,如果是MyISAM存儲引擎,用mysqlhotcopy進行熱備份會更好,如果是InnoDB存儲引擎,使用ibbacup這樣的工具更好。

第四步,在從(Slave)服務器裏開啓複製,次步的操作在2臺從(Slave)服務器裏執行。

[root@s/s ~]# mysql -uroot -p  Enter password:  mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.100',      -> MASTER_PORT=3306,      -> MASTER_USER='repluser',      -> MASTER_PASSWORD='replpass',      -> MASTER_LOG_FILE='mysql-bin.000001',      -> MASTER_LOG_POS=0;  Query OK, 0 rows affected (0.20 sec)  mysql> START SLAVE;  Query OK, 0 rows affected (0.00 sec)  mysql> SHOW SLAVE STATUS\G  *************************** 1. row ***************************               Slave_IO_State: Waiting for master to send event                  Master_Host: 192.168.0.100                  Master_User: repluser                  Master_Port: 3306     ............             Slave_IO_Running: Yes            Slave_SQL_Running: Yes     ............  1 row in set (0.00 sec)  

最後我用了SHOW SLAVE STATUS來查看複製情況,從第一行可以看出從服務器已經在等待主服務器的event了,也可以看到Slave_IO,Slave_SQL線程都正常開啓,最好同時查看從(Slave)服務器的日誌/var/log/mysqld.log,確認沒有錯誤信息,接下來你就可以去主服務器進行一些操作看看同步是否正常。

另外,在上面的操作中MASTER_LOG_POS=0,這裏0的意思是從日誌開頭開始複製的意思,並不是實際的日誌裏的位置,實際的日誌裏的開始位置默認應該是4。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章