《深入淺出MySQL:資料庫開發、優化與管理維護(2nd)》第31章之MySQL半同步複製搭建學習筆記
MySQL的非同步複製在使用的過程中,主庫和從庫的資料之間存在一定的延遲,這樣存在一個隱患:當在主庫上寫入一個事務並提交成功,而從庫尚未得到主庫推送的Binlog日誌時,主庫宕機了,例如主庫可能因磁碟損壞、記憶體故障等造成主庫上該事務Binlog丟失,此時從庫就可能損失這個事務,從而造成主從不一致。
此問題可以使用半同步複製來處理,使用非同步複製時,主庫執行完commit操作後,在主庫寫入binglog日誌後即可成功返回客戶端,無需等待binlog日誌傳送給從庫。
使用半同步複製時,為了保證主庫上的每一個binlog事務都能夠被可靠的複製到從庫上,主庫在每次事務成功提交時,並不及時反應給client,而是等到其中一個從庫也接收到binlog事務併成功寫入relay log後,主庫才返回commit操作成功給client。半同步複製保證了事務成功提交後,至少有兩份日誌記錄,一份在主庫的binlog上,另一份在至少一個從庫的relay log上,從而進一步保證了資料的完整性。
半同步複製模式下,在上圖中的步驟①、②、③任何一個步驟中主庫宕機,則事務提交失敗,從庫上也沒有收到事務對應的binlog日誌,所以主從資料一致;假如在步驟④傳送binlog日誌到從庫時,從庫宕機或者網路故障,導致binlog並沒有及時地傳送到從庫上,此時主庫上的事務會等待一段時間(時間長短由引數rpl_semi_sync_master_timeout設定的毫秒數決定),如果binlog在這段時間內都無法成功推送到從庫上,則自動調整為非同步模式,事務正常返回提交結果給客戶端。
半同步複製很大程度上取決於主從庫之間的網路情況,往返時延RTT越小決定了從庫的實時性越好。通俗的說,主從時間網路越快,從庫越實時。
半同步複製需要使用外掛來實現,主庫和從庫使用不同的外掛。安裝簡單,在非同步複製的基礎上,安裝半同步複製外掛即可。
(1)判斷MySQL伺服器是否支援動態新增外掛
select @@have_dynamic_loading;
(2)確定支援動態新增外掛後,檢查MySQL的安裝目錄下是否存在外掛,一般預設在$MYSQL_HOME/lib/plugin目錄下存在主庫外掛semisync_master.so和從庫外掛semisync_slave.so:
在主庫上安裝semisync_master.so外掛:
install plugin rpl_semi_sync_master SONAME 'semisync_master.so';
從庫上安裝semisync_slave.so外掛:
install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';
安裝完成後,從plugin表中檢視剛才安裝的外掛,下次重啟後自動載入外掛
select * from mysql.plugin;
(3)需要分別在主庫和從庫上配置引數開啟半同步semi-sync,預設半同步設定是不開啟的,主庫上配置全域性引數
set global rpl_semi_sync_master_enabled=1;
從庫上一樣配置全域性引數
set global rpl_semi_sync_slave_enabled=1;
如果非同步複製已開啟,需要重啟從庫上的i/o執行緒(如果是全新配置的半同步複製不需要):
STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
主庫上通過SHOW STATUS命令能夠看到當前半同步複製的一些狀態值
mysql> SHOW STATUS like '%semi_sync%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 0 |
| Rpl_semi_sync_master_net_avg_wait_time | 0 |
| Rpl_semi_sync_master_net_wait_time | 0 |
| Rpl_semi_sync_master_net_waits | 0 |
| Rpl_semi_sync_master_no_times | 0 |
| Rpl_semi_sync_master_no_tx | 0 |
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 0 |
| Rpl_semi_sync_master_tx_wait_time | 0 |
| Rpl_semi_sync_master_tx_waits | 0 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 0 |
+--------------------------------------------+-------+
14 rows in set (0.01 sec)
Rpl_semi_sync_master_status:值為ON,表示半同步複製目前處於開啟狀態。
Rpl_semi_sync_master_yes_tx:值為0,表示主庫當前尚未有任何一個事務是通過半同步複製到從庫。
Rpl_semi_sync_master_no_tx:值為0,表示當前有0個事務不是半同步模式下從庫及時響應的。
從庫狀態:
mysql> SHOW STATUS like '%semi_sync%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
1 row in set (0.01 sec)
如果Rpl_semi_sync_master_status和Rpl_semi_sync_slave_status都為ON,說明半同步複製搭建完成。