大家好,我是anyux。本文介紹MySQL主從複製原理。
主從複製原理
主從複製中涉及的文件
主庫:binlog
從庫:relaylog (中繼日誌)、master.info(主庫信息文件)、relaylog.info(relaylog應用信息)
主從複製中涉及的線程
主庫:Binlog_Dump Thread : DUMP_T
從庫:SLAVE_IO_THREAD:IO_T、SLAVE_SQL_THREAD:SQL_T
主從複製工作(過程)原理
1.從庫執行change master to 命令(主庫的連接信息+複製的起點)
2.從庫會將以上信息記錄到master.info文件
3.從庫執行start slave命令,立即開啟IO_T和SQL_T線程
4.從庫IO_T讀取master.info文件中的信息,獲取到IP、PORT、USER、PASS,BINLOG的位置信息
5.從庫IO_T請求連接主庫,主庫專門提供一個DUMP_T,負責和IO_T交互
6.IO_T根據binlog的位置信息(log-bin.000005,704),請求主庫新的binlog
7.主庫通過DUMP_T將最新的binlog,通過網絡傳輸給從庫的IO_T
8.IO_T接收到新的binlog日誌,存儲到TCP/IP緩存,立即返回ACK給主庫,並更新master.info
9.IO_T線程將TCP/IP緩存中數據,寫入到磁碟文件relaylog中
10.SQL_T線程讀取relay.info中的信息,獲取上次已經應用過的relaylog的位置信息
11.SQL_T會按照上次的位置點回放到最新的relaylog,再次更新relay.info信息
12.從庫會自動purge應用過relay進行定期清理
補充說明:一旦主從複製構建成功,主庫當中發生了新的變化,都會通過dump_T發送信號給IO_T,增強主從複製的實時性
主從複製監控
查看信息命令
mysql -uroot -proot -S /data/3307/mysql.sock -e "show slave status\G"
主庫相關信息
二進位日誌相關信息
中繼日誌相關信息
從庫relay應用信息有關的(relay.info)
可以查看是繼日誌中的事件
mysql -uroot -proot -S /data/3307/mysql.sock -e "show relaylog in 'db01-relay-bin.000006'"
查看線程運行狀態
mysql -uroot -proot -S /data/3307/mysql.sock -e "show slave status\G" | grep Running:
從庫延時主庫的時間(秒)
Seconds_Behind_Master: 0
延時從庫
SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
GTID複製有關的狀態信息
Retrieved_Gtid_Set: c7da7119-692c-11ea-9e3c-000c2922081d:3-4 Executed_Gtid_Set: c7da7119-692c-11ea-9e3c-000c2922081d:1-4 Auto_Position: 0
主從複製故障
從庫故障:IO 線程故障,SQL 線程故障,連接主庫故障。網絡連接信息錯誤或變更了。防火牆,連接數達到上限
對於主庫來說,如果執行了flush logs,就表示主庫會重新初始化二進位日誌,而從庫無法獲取此信息,因此從庫與主庫失去聯繫。主從複製斷開
主庫重置二進位日誌
flush logs;
再查看主庫二進位日誌狀態
show master status;
僅對於線程故障的問題,解決辦法如下
停止並重置從庫
stop slave; reset slave all;
修改從庫配置信息
CHANGE MASTER TO MASTER_HOST='192.168.255.113', MASTER_USER='repl', MASTER_PASSWORD='repl', MASTER_PORT=3306, MASTER_LOG_FILE='log-bin.000001', MASTER_LOG_POS=704, MASTER_CONNECT_RETRY=10;
啟動從庫複製功能
start slave;