mysql半同步複製機制

在mysql主從複製中,有一下幾種複製的方法

異步複製(Asynchronous replication)
Mysql中默認的方式就是異步的,master在受到客戶提交的請求後,馬上返回結果,而slave中是否同步並處理是不會考慮的,所以這樣的話,雖然效率高但是數據的完整性得不到保障,如果master down了,需要從slave中選舉出一個master,如果master中提交的修改沒有傳到slave上,就會導致新的master有數據的缺失

全同步複製(Fully synchronous replication)
當master執行完一個請求時,所有的slave都同步以後纔將結果返回給客戶。很明顯這樣的話效率會非常的低下

爲了更好的權衡效率和數據一致性,所以又有了半同步複製機制
半同步複製(Semisynchronous replication)
介於異步複製和全同步複製之間,主庫在執行完客戶端提交的事務後不是立刻返回給客戶端,而是等待至少一個從庫接收到並寫到relay log中才返回給客戶端。
主從複製的基本原理如下圖
這裏寫圖片描述
其中的log dumper線程用來給I/O線程來傳送binlog(二進制日誌),來達到更新從庫完成同步的作用。
而半同步機制增加了一個ack,即是否成功收到事務的標誌碼。也就是dumper線程除了發送事務到slave,還承擔了接收slave的ack工作。如果出現異常,沒有收到ack,那麼將自動降級爲普通的複製,直到異常修復。
所以說半同步同樣也存在問題,雖然相對於全同步與全異步有所折衷。
(1)異常發生後就變成了普通的複製,可以有效降低數據不一致的情況,但是也不是完全避免了。
(2)dumper線程中增加了一個ack,所以加大其工作量,所以效率必然會受到影響。
(3)在MySQL 5.5和5.6使用after_commit的模式下, 即如果slave 沒有收到事務,也就是還沒有寫入到relay log 之前,網絡出現異常或者不穩定,此時剛好master掛了,系統切換到從機,兩邊的數據就會出現不一致。 在此情況下,slave會少一個事務的數據。

在5.7的版本下推出了Loss-less Semi-Synchronous Replication架構
其中增加了rpl_semi_sync_master_wait_point參數
這個參數有兩個值
1.AFTER_COMMIT(5.6默認值)
master將每個事務寫入binlog ,傳遞到slave往relay log上寫,同時主庫提交事務。master等待slave 反饋收到relay log,只有收到ACK後master纔將commit OK結果反饋給客戶端。
**2.AFTER_SYNC(**5.7默認值)
master 將每個事務寫入binlog , 傳遞到slave 刷新到磁盤(relay log)。master等待slave 反饋接收到relay log的ack之後,再提交事務並且返回commit OK結果給客戶端。 即使主庫crash,所有在主庫上已經提交的事務都能保證已經同步到slave的relay log中。

半同步複製的安裝部署

要想使用半同步複製,必須滿足以下幾個條件:

1. MySQL 5.5及以上版本

2. 變量have_dynamic_loading爲YES

3. 異步複製已經存在

首先加載插件

因用戶需執行INSTALL PLUGIN, SET GLOBAL, STOP SLAVE和START SLAVE操作,所以用戶需有SUPER權限。

主:

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;

從:

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’;

查看插件是否加載成功

有兩種方式

    1.
mysql> show plugins;

rpl_semi_sync_master       | ACTIVE   | REPLICATION        | semisync_master.so | GPL  
    2.
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS  WHERE PLUGIN_NAME LIKE '%semi%';
+----------------------+---------------+
| PLUGIN_NAME          | PLUGIN_STATUS |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE        |
+----------------------+---------------+
1 row in set (0.00 sec)

啓動半同步複製

在安裝完插件後,半同步複製默認是關閉的,這時需設置參數來開啓半同步

主:

mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;

從:

mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;

以上的啓動方式是在命令行操作,也可寫在配置文件中。

主:

plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1

從:

plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1

在有的高可用架構下,master和slave需同時啓動,以便在切換後能繼續使用半同步複製

plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl-semi-sync-master-enabled = 1
rpl-semi-sync-slave-enabled = 1

重啓從上的IO線程

mysql> STOP SLAVE IO_THREAD;

mysql> START SLAVE IO_THREAD;

如果沒有重啓,則默認還是異步複製,重啓後,slave會在master上註冊爲半同步複製的slave角色。

查看半同步是否在運行

主:

mysql> show status like 'Rpl_semi_sync_master_status';

+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON    |
+-----------------------------+-------+
1 row in set (0.00 sec)

從:

mysql> show status like 'Rpl_semi_sync_slave_status';

+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |
+----------------------------+-------+
1 row in set (0.20 sec)

這兩個變量常用來監控主從是否運行在半同步複製模式下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章