1. 程式人生 > >《深入淺出MySQL:資料庫開發、優化與管理維護(2nd)》第31章之MySQL半同步複製搭建學習筆記

《深入淺出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,說明半同步複製搭建完成。