MySQL主從雙向同步


最近部署測試環境,涉及到MySQL數據庫主從雙向同步的部署,記錄一下部署過程,正常讀寫都發生在主庫,從庫作為備選數據庫(熱備份),當主庫發生異常,數據庫自動切換到從庫,這里面是怎么監控數據庫異常並觸發自動切換,就不在這里研究記錄了(公司用的自研中間件,這里可以使用heartbeat實現,暫不做研究);另外,主庫和從庫都還可以配置一個只讀模式的備庫,可以實現讀寫分離(使用mycat實現),這個看實際業務性能需求是否需要配置。下面只簡單介紹主從雙向同步的配置:

1. 原理:網上找的一張圖解,應該是比較清晰的畫出了組網中各個關鍵部件和作用,這張圖解是主從復制,並不是雙向同步,不過雙向同步也是差不多了,只不過主庫既是master也是slave,從庫也即是master也是slave。

              

2. 環境准備,主從庫的MySQL版本裝同一個版本(5.6.38),避免出現未知的異常

主庫:192.168.245.130:3306

從庫:192.168.245.131:3306

3. 主庫和從庫的配置保持一致,除了server-id

# 設置server_id,主從服務器配置不同的值
server-id = 1
# 開啟二進制日志功能,最好是絕對路徑
log_bin = /opt/database/mysql/mysql-bin.log
# 中繼日志路徑
relay_log = /opt/database/mysql/mysql-relay-bin.log
# 允許從庫將其重放的事件也記錄到自身的二進制日志中
log_slave_updates = 1
# 二進制日志自動刪除/過期的天數。默認值為0,表示不自動刪除。
expire_logs_days = 7
# slave重放的事件時忽略的錯誤,all是忽略所有錯誤
# ddl_exist_errors:1007,1008,1050,1051,1054,1060,1061,1068,1094,1146
slave-skip-errors = ddl_exist_errors

 4. 主從服務均創建帳號並授權:

# 在131機器執行下面SQL,在130機器上面把130換成131后執行,密碼自定義
# 創建用戶repl
CREATE USER 'repl'@'192.168.245.130' IDENTIFIED BY '123456';
# 授權
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.245.130';
# 刷新權限
flush privileges;

5. 主從服務器上均查看slave狀態:SHOW MASTER STATUS;

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

分別記錄主從服務器的File 和 Position,后面有用

6. 主從服務均執行slave同步語句,MASTER_LOG_FILE和MASTER_LOG_POS填寫上一步查詢的值,MASTER_HOST,MASTER_USER,MASTER_PASSWORD根據實際情況填寫,當使用 MASTER_AUTO_POSITION 參數的時候,MASTER_LOG_FILE,MASTER_LOG_POS參數不能使用

CHANGE MASTER TO MASTER_HOST='192.168.245.130', MASTER_USER='repl', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;

7. 主從服務器均啟動slave:START SLAVE;

8. 主從服務器均查看slave狀態:SHOW SLAVE STATUS\G;

mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.245.130
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 154
Relay_Log_File: mysqld-relay-bin.000001
Relay_Log_Pos: 117
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...

狀態中顯示Slave_IO_Running和Slave_SQL_Running狀態均為YES,說明主從同步已經配置完成,其中Seconds_Behind_Master顯示比master落后的數據時延,通過這個數據可以查看主從的數據時差,判斷主從同步的性能壓力。

9. 常見問題:

a. 主從復制的時候,SQL線程執行的時候出現異常,Slave_SQL_Running狀態編程NO,該怎么解決?

目前本人也沒有比較好的辦法解決,在配置參數里面添加了slave-skip-errors參數進行忽略錯誤,實際生產環境該參數如何添加要實際評估,如果不加該參數,出現SQL執行異常的時候,主從同步其實是會阻塞的,只能手動恢復,重新指定pos,stop salve -》change master to -》start slave

b. 怎么刪除bin日志

stop salve -》reset slave -》start slave

c. 怎么開始GTID(全局事務ID)

在my.cfg配置文件添加如下參數,然后重啟MySQL:

gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates = 1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM