MYSQL主從複製方案

1.主從複製工作原理

MySQL之間數據複製的基礎是二進制日誌文件(binary log file)。一臺MySQL數據庫一旦啟用二進制日誌後,其作為master,它的數據庫中所有操作都會以“事件”的方式記錄在二進制日誌中,其他數據庫作為slave通過一個I/O線程與主服務器保持通信,並監控master的二進制日誌文件的變化,如果發現master二進制日誌文件發生變化,則會把變化複製到自己的中繼日誌中,然後slave的一個SQL線程會把相關的“事件”執行到自己的數據庫中,以此實現從數據庫和主數據庫的一致性,也就實現了主從複製。

mysql實現主從複製的方案主要有兩種:基於二進制日誌的主從複製和基於GTID的主從複製。傳統複製是基於主庫的二進制日誌進行復制,在主站和從站之間同步二進制日誌文件和日誌文件中的位置標識。

基於GTID(全局事務標識符)複製是事務性的,因此不需要指定二進制日誌文件和文件中的位置,這大大簡化了許多常見的複製任務。只要在主站上提交的所有事務也都應用於從站,使用gtids進行復制可確保主站和從站之間的數據一致性。

2.基於二進制日誌的主從複製

2.1 配置要求

1)主庫開啟二進制日誌

2)主庫和各個從庫配置唯一的server_id

2.2 主庫創建複製用戶

從庫需要使用一個用戶來連接主庫,可以使用添加複製權限的生產應用用戶。為了減少對應用用戶的影響,建議單獨創建一個僅有複製權限的用戶。

CREATE USER 'repl'@'%' IDENTIFIED BY 'password';

GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

2.3 獲取主庫的二進制日誌位置

1)在主庫打開一個連接,執行下列命令清除所有表並阻止寫入語句:

mysql> FLUSH TABLES WITH READ LOCK;

2)重新打開一個連接,執行下列命令獲取二進制日誌的位置:

mysql > SHOW MASTER STATUS;

+--------------------+----------+--------------+------------------+-------------------+|

File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+--------------------+----------+--------------+------------------+-------------------+|

mysql_bin.000003 | 154 | | | |

+--------------------+----------+--------------+------------------+-------------------+

3)對於配置一個新的主從複製環境,主庫沒有初始數據需要同步到從庫,則在第一個連接中釋放鎖:

mysql> UNLOCK TABLES;

2.4 配置從庫

配置前先需要確認是否為從庫設置了唯一的server_id。然後在從庫上執行下面語句,請將參數值替換為實際值:

mysql> CHANGE MASTER TO MASTER_HOST='master_host_name', MASTER_USER='replication_user_name', MASTER_PASSWORD='replication_password', MASTER_LOG_FILE='recorded_log_file_name', MASTER_LOG_POS=recorded_log_position;

如果需要配置多源的複製,需要為每一個主庫指定一個通道:

mysql> CHANGE MASTER TO MASTER_HOST='master_host_name', MASTER_USER='replication_user_name', MASTER_PASSWORD='replication_password', MASTER_LOG_FILE='recorded_log_file_name', MASTER_LOG_POS=recorded_log_position FOR CHANNEL 'master-1';

2.5 啟動主從複製

在從庫上執行:

mysql> START SLAVE;

2.6 查看複製狀態

在從庫上執行:

mysql> SHOW SLAVE STATUS\G;

當Slave_IO_Running和Slave_SQL_Running都為YES的時候就表示主從同步設置成功了。接下來就可以進行一些驗證了,比如在主master數據庫的test數據庫的一張表中插入一條數據,在slave的test庫的相同數據表中查看是否有新增的數據即可驗證主從複製功能是否有效,還可以關閉slave(mysql>stop slave;),然後再修改master,看slave是否也相應修改(停止slave後,master的修改不會同步到slave),就可以完成主從複製功能的驗證了。

3.基於GTID的主從複製

3.1 配置要求

1. 主庫開啟二進制日誌

2. 主庫和各個從庫配置唯一的server_id

3.2 主庫創建複製用戶

從庫需要使用一個用戶來連接主庫,可以使用添加複製權限的生產應用用戶。為了減少對應用用戶的影響,建議單獨創建一個僅有複製權限的用戶。

CREATE USER 'repl'@'%' IDENTIFIED BY 'password';

GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

3.3 在主庫和從庫的/etc/my.cnf文件中[mysqld]添加啟用GTID的變量:

gtid_mode=ON

enforce-gtid-consistency=true

配置完成後重啟mysql。

systemctl restart mysqld

3.4 配置從庫

配置前先需要確認是否為從庫設置了唯一的server_id。然後在從庫上執行下面語句,請將參數值替換為實際值:

mysql>CHANGE MASTER TO MASTER_HOST = '128.*.*.*',MASTER_PORT = 3306,MASTER_USER = 'repl',MASTER_PASSWORD = 'password',MASTER_AUTO_POSITION = 1;

如果需要配置多源的複製,需要為每一個主庫指定一個通道:

mysql>CHANGE MASTER TO MASTER_HOST = '128.*.*.*',MASTER_PORT = 3306,MASTER_USER = 'repl',MASTER_PASSWORD = 'password',MASTER_AUTO_POSITION = 1 FOR CHANNEL 'master-1';

3.5 啟動主從複製

在從庫上執行:

mysql> START SLAVE;

4.半同步複製

MySQL默認的複製即是異步的,主庫在執行完客戶端提交的事務後會立即將結果返給給客戶端,並不關心從庫是否已經接收並處理,這樣就會有一個問題,主如果crash掉了,此時主上已經提交的事務可能並沒有傳到從上,如果此時,強行將從提升為主,可能導致新主上的數據不完整。半同步複製情況下,主庫在執行完客戶端提交的事務後不是立刻返回給客戶端,而是等待至少一個從庫接收到並寫到relay log中才返回給客戶端。相對於異步複製,半同步複製提高了數據的安全性,同時它也造成了一定程度的延遲,這個延遲最少是一個TCP/IP往返的時間。所以,半同步複製最好在低延時的網絡中使用。

4.1 安裝插件

在主庫上執行:

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

在從庫上執行:

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

查看插件狀態:

SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';

4.2 配置參數

主庫參數:

rpl_semi_sync_master_enabled=1 #主庫啟用半同步複製

rpl_semi_sync_master_timeout=1000 #主庫等待從庫的超時時間,超時切換回異步複製,默認值10000(10s)

rpl_semi_sync_master_wait_point=AFTER_SYNC #等待點模式(AFTER_SYNC表示主庫等待從庫接收到binlog寫到本地的relay-log裡,才提交到存儲引擎層,然後把請求返回給客戶端;

AFTER_COMMIT表示主庫寫入binlog,邊提交,邊等待從庫收到binlog寫到本地的relay-log)

rpl_semi_sync_master_wait_for_slave_count=1 #主庫等待從庫的個數

從庫參數:

rpl_semi_sync_slave_enabled=1 #從庫啟用半同步複製

4.3 半同步複製狀態監控

Rpl_semi_sync_master_status #主庫是否運行在半同步模式

Rpl_semi_sync_master_clients #半同步從庫的個數

Rpl_semi_sync_master_yes_tx #從庫確認成功的提交事務數

Rpl_semi_sync_master_no_tx #從庫未確認成功的提交事務數

Rpl_semi_sync_slave_status #從庫是否可運行半同步複製


分享到:


相關文章: