詳解MySQL集羣下的複製(replicate)原理

7. 集羣下的複製

7.1. 簡述

MySQL 5.1 開始,就支持集羣+複製了,這對於想要構建一個高可用方案的用戶來說,無疑是個驚喜。在這種模式下,既有主從的實時備份,又有基於集羣的負載均衡,不足指出在於,從我的測試結果來看,這種方案下的性能還不是太高,仍有待改進。

集羣+複製的配置其實很簡單,就是配置好2個獨立的集羣后,把其中一個的SQL節點作爲另一個集羣SQL節點的slave即可。甚至可以使用下面幾種架構

3個集羣,6個SQL節點,形成一個3個點環形的複製。

3個集羣,6個SQL節點,形成一個6個點環形的複製,把另一個SQL節點也利用起來。

7.2. 開始配置

7.2.1. master上的配置

由於集羣下的複製是基於row-based複製的,因此需要設置logbin-format的格式爲:ROW 或者 MIXED。
相對於普通的mysqld服務器配置,只需要增加類似如下2行:

  1. server-id = 1  
  2. binlog_format = "ROW" #or MIXED 

7.2.2. slave上的配置

新版本的MySQL已經不再通過 my.cnf 來指定master相關的信息了,而是通過 CHANGE MASTER 指令來管理。因此,slave上只需簡單增加類似如下幾行:

  1. server-id = 2 
  2. relay-log-purge=1 
  3. skip-slave-start  
  4. replicate-ignore-db=mysql 

7.3. 啓動slave

先按照正常的方式啓動master和slave上的mysqld後,執行SHOW PROCESSLIST 可以看到2個mysqld都只有2個進程:

  1. mysql> SHOW PROCESSLIST;  
  2. +----+-------------+-----------+------+---------+------+-----------------------------------+------------------+  
  3. | Id | User        | Host      | db   | Command | Time | State                             | Info             |  
  4. +----+-------------+-----------+------+---------+------+-----------------------------------+------------------+  
  5. |  1 | system user |           |      | Daemon  |    0 | Waiting for event from ndbcluster | NULL             |  
  6. |  2 | root        | localhost | NULL | Query   |    0 | NULL                              | show processlist |  
  7. +----+-------------+-----------+------+---------+------+-----------------------------------+------------------+  
  8. 2 rows in set (0.00 sec) 

在slave上執行 SHOW SLAVE STATUS 再看看:

  1. mysql> show slave status\G  
  2. Empty set (0.00 sec) 

可以看到,現在還沒有任何複製相關的配置。因此,我們需要先在master上添加一個賬戶用於複製:

  1. mysql> GRANT REPLICATION SLAVE, GRANT REPLICATION CLIENT ON *.* TO rep@’192.168.1.2’ IDENTIFIED BY ‘rep’;  
  2. Query OK, 0 rows affected (0.00 sec) 

然後,我們用 CHANGE MASTER 指令來指定一下 master 相關的參數:

  1. mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.2'MASTER_USER='rep'MASTER_PASSWORD='rep';   
  2. Query OK, 0 rows affected (0.01 sec)  
  3.  
  4. mysql> SHOW SLAVE STATUS\G  
  5. *************************** 1. row ***************************  
  6.                Slave_IO_State:   
  7.                   Master_Host: 192.168.0.2  
  8.                   Master_User: rep  
  9.                   Master_Port: 3306  
  10.                 Connect_Retry: 60  
  11.               Master_Log_File:   
  12.           Read_Master_Log_Pos: 4  
  13.                Relay_Log_File: slave-relay-bin.000001  
  14.                 Relay_Log_Pos: 4  
  15.         Relay_Master_Log_File:   
  16.              Slave_IO_Running: No  
  17.             Slave_SQL_Running: No  
  18.               Replicate_Do_DB:   
  19.           Replicate_Ignore_DB: mysql  
  20.            Replicate_Do_Table:   
  21.        Replicate_Ignore_Table:   
  22.       Replicate_Wild_Do_Table:   
  23.   Replicate_Wild_Ignore_Table:   
  24.                    Last_Errno: 0  
  25.                    Last_Error:   
  26.                  Skip_Counter: 0  
  27.           Exec_Master_Log_Pos: 0  
  28.               Relay_Log_Space: 106  
  29.               Until_Condition: None  
  30.                Until_Log_File:   
  31.                 Until_Log_Pos: 0  
  32.            Master_SSL_Allowed: No  
  33.            Master_SSL_CA_File:   
  34.            Master_SSL_CA_Path:   
  35.               Master_SSL_Cert:   
  36.             Master_SSL_Cipher:   
  37.                Master_SSL_Key:   
  38.         Seconds_Behind_Master: NULL  
  39. Master_SSL_Verify_Server_Cert: No  
  40.                 Last_IO_Errno: 0  
  41.                 Last_IO_Error:   
  42.                Last_SQL_Errno: 0  
  43.                Last_SQL_Error:   
  44. 1 row in set (0.00 sec) 

執行 START SLAVE 來啓動它。

  1. mysql> start slave;  
  2. Query OK, 0 rows affected (0.00 sec) 

再來看看:

  1. mysql> SHOW SLAVE STATUS\G  
  2. *************************** 1. row ***************************  
  3.                Slave_IO_State: Waiting for master to send event  
  4.                   Master_Host: 192.168.0.2  
  5.                   Master_User: rep  
  6.                   Master_Port: 3306  
  7.                 Connect_Retry: 60  
  8.               Master_Log_File: binlog.000001  
  9.           Read_Master_Log_Pos: 256  
  10.                Relay_Log_File: slave-relay-bin.000002  
  11.                 Relay_Log_Pos: 398  
  12.         Relay_Master_Log_File: binlog.000001  
  13.              Slave_IO_Running: Yes  
  14.             Slave_SQL_Running: Yes  
  15.               Replicate_Do_DB:   
  16.           Replicate_Ignore_DB: mysql  
  17.            Replicate_Do_Table:   
  18.        Replicate_Ignore_Table:   
  19.       Replicate_Wild_Do_Table:   
  20.   Replicate_Wild_Ignore_Table:   
  21.                    Last_Errno: 0  
  22.                    Last_Error:   
  23.                  Skip_Counter: 0  
  24.           Exec_Master_Log_Pos: 256  
  25.               Relay_Log_Space: 557  
  26.               Until_Condition: None  
  27.                Until_Log_File:   
  28.                 Until_Log_Pos: 0  
  29.            Master_SSL_Allowed: No  
  30.            Master_SSL_CA_File:   
  31.            Master_SSL_CA_Path:   
  32.               Master_SSL_Cert:   
  33.             Master_SSL_Cipher:   
  34.                Master_SSL_Key:   
  35.         Seconds_Behind_Master: 0  
  36. Master_SSL_Verify_Server_Cert: No  
  37.                 Last_IO_Errno: 0  
  38.                 Last_IO_Error:   
  39.                Last_SQL_Errno: 0  
  40.                Last_SQL_Error:   
  41. 1 row in set (0.00 sec) 

7.4. 簡單測試

這個留給讀者自己按照常規的測試去完成吧。

【編輯推薦】

  1. MySQL數據庫集羣進行正確配置步驟
  2. MySQL 集羣在Server1與Server2上如何安裝MySQL
  3. MySQL集羣配置
  4. MySQL集羣自動安裝腳本
  5. MySQL觸發器如何正確使用
  6. 來源於:http://database.51cto.com/art/201008/218668.htm
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章