半同步複製
一般情況下,異步複製就已經足夠應付了,但由於是異步複製,備庫極有可能是落後於主庫,特別是極端情況下,我們無法保證主備數據是嚴格一致的(即使我們觀察到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;
數據全部同步完成