MySQL非同步複製是主從複製過程中預設的複製模式。複製涉及三個線程,包括主 I/O 線程、從 I/O 線程和從 SQL 線程。因為是異步複製,所以master事務的提交,不需要經過slave的確認,即master I/O線程提交事務後,不需要等待slave I/O線程的回复確認,master並不保證binlog一定寫入到了relay log中;而slave I/O把binlog寫入relay log後,由slave sql線程異步執行應用到slave mysql中,slave I/O也不需要slave sql的回復確認,並不保證relay log日誌完整寫入到了mysql中。
為了彌補傳統非同步複製的缺陷,MySQL在5.5版本引入了半同步複製,這是對傳統非同步複製的改進。在master事務commit前,必須確保binlog日誌已經寫入slave 的relay log日誌中,收到slave給master的回應後,才能進行交易的commit。儘管如此,relay log的後半部仍然會以非同步方式傳遞給sql執行緒執行。
基於傳統非同步複製和半同步複製的缺陷——資料的一致性問題無法保證,MySQL官方在5.7. 17版正式推出群組複製(MySQL Group Replication,簡稱MGR)。
由若干個節點共同組成一個複製組,一個事務的提交,必須經過組內大多數節點(N / 2 1)決議並通過,才能得以提交。如上圖所示,由3個節點組成一個複製組,Consensus層為一致性協議層,在事務提交過程中,發生組間通訊,由2個節點決議(certify)通過這個事務,事務才能夠最終得以提交並響應。
引入群組複製的主要目的在於解決傳統的非同步複製或半同步複製所帶來的資料不一致問題。群組複製依靠分散式一致性協定(Paxos協定的變體),實現了分散式下資料的最終一致性,提供了真正的資料高可用方案(是否真正高可用還有待商榷)。其提供的多寫方案,為我們實現多活方案帶來了希望。
MGR環境下,伺服器數量必須是3台以上,且是單數,實作2/n 1的演算法。
一個複製組由若干個節點(資料庫實例)組成,群組內各節點維護各自的資料副本(Share Nothing),透過一致性協定實作原子訊息和全域有序訊息,來實現群組內實例資料的一致。
資料一致性保障:確保叢集中大部分節點收到日誌
多節點寫入支援:多寫模式下支援叢集中的所有節點都可以寫入(但考慮1到高並發場景下,確保資料高度一致性,生產並沒有選擇多主寫入,使用單主群集)
Fault Tolerance: 確保系統發生故障(包括腦裂)仍然可用,雙寫對系統無影響
##MGR的解決方案目前的影響
以上是Mysql主從三種複製模式是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!