MySQL非同步複製、全同步複製與半同步複製
這裡雖然說的是Mysql資料庫,但對應其他資料庫,原理沒有什麼差異。只是在具體實現和配置上不同。
一、非同步複製(Asynchronous replication)
1、邏輯上
MySQL預設的複製即是非同步的,主庫在執行完客戶端提交的事務後會立即將結果返給給客戶端,並不關心從庫是否已經接收並處理,這樣就會有一個問題,主如果crash掉了,此時主上已經提交的事務可能並沒有傳到從庫上,如果此時,強行將從提升為主,可能導致新主上的資料不完整。
2、技術上
主庫將事務 Binlog 事件寫入到 Binlog 檔案中,此時主庫只會通知一下 Dump 執行緒傳送這些新的 Binlog,然後主庫就會繼續處理提交操作,而此時不會保證這些 Binlog 傳到任何一個從庫節點上。
二、全同步複製(Fully synchronous replication)
1、邏輯上
指當主庫執行完一個事務,所有的從庫都執行了該事務才返回給客戶端。因為需要等待所有從庫執行完該事務才能返回,所以全同步複製的效能必然會收到嚴重的影響。
2、技術上
當主庫提交事務之後,所有的從庫節點必須收到、APPLY並且提交這些事務,然後主庫執行緒才能繼續做後續操作。但缺點是,主庫完成一個事務的時間會被拉長,效能降低。
三、半同步複製(Semisynchronous replication)
1、邏輯上
是介於全同步複製與全非同步複製之間的一種,主庫只需要等待至少一個從庫節點收到並且 Flush Binlog 到 Relay Log 檔案即可,主庫不需要等待所有從庫給主庫反饋。同時,這裡只是一個收到的反饋,而不是已經完全完成並且提交的反饋,如此,節省了很多時間。
2、技術上
介於非同步複製和全同步複製之間,主庫在執行完客戶端提交的事務後不是立刻返回給客戶端,而是等待至少一個從庫接收到並寫到relay log中才返回給客戶端。相對於非同步複製,半同步複製提高了資料的安全性,同時它也造成了一定程度的延遲,這個延遲最少是一個TCP/IP往返的時間。所以,半同步複製最好在低延時的網路中使用。
四、選型及設定說明
如何設定到相應的同步方式上呢?
mysql主從模式預設是非同步複製的,而MySQL Cluster是同步複製的,只要設定為相應的模式即是在使用相應的同步策略。
從MySQL5.5開始,MySQL以外掛的形式支援半同步複製。其實說明半同步複製是更好的方式,兼顧了同步和效能的問題。
具體配置方法及半同步遇到的問題,可以參考相關具體文件。