企業級Mysql數據庫集羣--Mysql半同步複製

半同步複製

一般情況下,異步複製就已經足夠應付了,但由於是異步複製,備庫極有可能是落後於主庫,特別是極端情況下,我們無法保證主備數據是嚴格一致的(即使我們觀察到Seconds Behind Master這個值爲0)

比如,當用戶發起commit命令時,Master並不關心slave的執行狀態,執行成功後,立即返回給用戶。試想下,若一個事務提交後,master成功返回給用戶後crash,這個事務的binlog還沒來得及傳遞到slave,那麼slave相對於master而言就少了一個事務,此時主備就不一致了。對於要求強一致的業務是不可以接受的,半同步複製就是爲了解決數據一致性而產生的

爲什麼叫半同步複製?我們來先說說同步複製,所謂同步複製就是一個事務在master和slave都執行後,才返回給用戶執行成功。這裏核心是說master和slave要麼都執行,要麼都不執行,涉及到2pc(2 phrase commit)。而MySQL只實現了本地redo-log和binlog的2PC,但並沒有實現master和slave的2PC,所以不是嚴格意義上的同步複製。而MySQL半同步複製不要求slave執行,而僅僅是接收到日誌後,就通知master可以返回了

這裏關鍵點是slave 接受日誌後是否執行,若執行後才通知master則是同步複製,若僅僅是接受日誌成功,則是半同步複製

半同步複製:一主多從模式下,有一個從節點返回成功,即成功,不必等待多個節點全部返回

master做完一步等一步,需要等待至少一個slave節點完成複製之後纔開始進行下一個操作

master做大事件的時候,需要進行半同步,master節點等待一個節點即可

當半同步出現問題的時候會自動切換爲異步同步

銀行數據庫全同步,master節點等待集羣中的所有全部節點

數據庫要避免慢查詢問題,會造成延遲,佔用數據庫的IO

優點:提高了數據完整性,數據至少會存在兩個節點(master節點和一個slave節點)

加了消息確認ACK,不會造成數據丟失

出現問題會自動降低爲異步複製

master

ip:172.25.30.1/24

server1

mysql -uroot -p*

install plugin rpl_semi_sync_master SONAME 'semisync_master.so';

安裝半同步模塊master

set global rpl_semi_sync_master_enabled = 1

激活插件

slave

ip:172.25.30.2/24

server2

mysql -uroot -p*

install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';

安裝半同步模塊slave

set global rpl_semi_sync_slave_enabled = 1
激活插件
STOP SLAVE IO_THREAD;

關閉

START SLAVE IO_THREAD;

開啓

從庫重啓io進程,激活插件之後必須要重啓io進程,否則不會生效,如果重啓不了的話就說明兩端的數據不同步

在這裏插入圖片描述

STOP SLAVE IO_THREAD;

關閉從庫進行測試

master

use westos;

insert into usertb values ('user4','123');

等待10s,沒有接收到slave的ack請求,自動轉換爲異步複製

insert into usertb values ('user5','123');

再次插入數據,速度變快,異步複製生效

slave

use westos;

select * from usertab;

沒有user4和user5數據

START SLAVE IO_THREAD;

開啓slave

select * from usertab;

數據全部同步完成

在這裏插入圖片描述

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