1. 程式人生 > >MySQL 組復制介紹

MySQL 組復制介紹

mysql group replication

一、組復制是個什麽鬼?

先從 MySQL 的復制技術談起,首先是 MySQL 的異步復制


異步復制模式下,Master上執行事務產生 binlog,slave 通過連接 master 抓取 binlog 的內容接收到本地的 relaylog 上,然後 apply 對應的事務,產生 slave 服務器上自身的 binlog(由--log-slave-update 參數決定)。流程圖如下:

技術分享


其次是半同步復制,流程圖如下

技術分享


異步復制模式下,如果 slave 全部宕機,則在 master 上的事務無法同步到 slave 上,存在一定的數據安全風險。


半同步復制解決了數據安全風險的問題,在半同步環境下要求至少有一臺 slave 接收到 master 的binlog並成功寫入到本地的 relaylog, master 上的事務才可以成功提交,這樣對主庫的事務提交速度會產生一定影響,半同步在數據安全和數據庫性能兩者之間做了一個中和。


在實際使用過程中,可以通過配置參數(rpl_semi_sync_master_timeout 單位是毫秒,默認為10000,即10s)設定若 slave 在多長時間沒有ack返回,同步模式由半同步自動修改為異步同步模式。(mysql半同步工作原理和oracle dataguard的最大保護模式雷同)

組復制分單主模式和多主模式,mysql 的復制技術僅解決了數據同步的問題,如果 master 宕機,意味著數據庫管理員需要介入,應用系統可能需要修改數據庫連接地址或者重啟才能實現。(這裏也可以使用數據庫中間件產品來避免應用系統數據庫連接的問題,例如 mycat 和 atlas 等產品)。組復制在數據庫層面上做到了,只要集群中大多數主機可用,則服務可用,也就是說3臺服務器的集群,允許其中1臺宕機。組復制的流程圖如下:


技術分享

技術分享


技術分享


組復制的特點:

● 高一致性

基於原生復制及 paxos 協議的組復制技術,並以插件的方式提供,提供一致數據安全保證;


● 高容錯性

只要不是大多數節點壞掉就可以繼續工作,有自動檢測機制,當不同節點產生資源爭用沖突時,不會出現錯誤,按照先到者優先原則進行處理,並且內置了自動化腦裂防護機制;


● 高擴展性

節點的新增和移除都是自動的,新節點加入後,會自動從其他節點上同步狀態,直到新節點和其他節點保持一致,如果某節點被移除了,其他節點自動更新組信息,自動維護新的組信息;


● 高靈活性

有單主模式和多主模式,單主模式下,會自動選主,所有更新操作都在主上進行;

多主模式下,所有 server 都可以同時處理更新操作。


二、什麽樣的應用場景適合用組復制?

1、彈性的數據庫復制環境

組復制可以靈活的增加和減少集群中的數據庫實例


2、高可用的數據庫環境

組復制允許數據庫實例宕機,只要集群中大多數服務器可用,則整個數據庫服務可用

3、替代傳統主從復制結構的數據庫環境

三、組復制的有哪些先決條件?

1、只支持innodb存儲引擎

2、每張表都需要有主鍵

3、只支持ipv4網絡環境

4、要求高網絡帶寬(通常是千兆內網)和低網絡延遲

以下的參數在mysql數據庫實例上必須要配置

1、--log-bin=bin-log #記錄mysql的binlog

2、--log-slave-update #記錄slave上進行apply relay-log時的binlog

3、--binlog-format=row #binlog的格式為行模式

4、--gtid-mode=on #開啟gtid模式

5、--master-info-repository=TABLE #將master-info信息記錄到mysql表當中

6、--relay-log-info-repository=TABLE #將relay-log信息記錄到mysql表當中

7、--transaction-write-set-extraction=XXHASH64 #每個事務收集的wirte set和encode使用xxhash64哈希算法

8、開啟多線程復制

--slave-parallel-workers=N #N為具體的復制線程個數

--slave-preserve-commit-order=1 #slave上apply relay-log時事務順序提交

--slave-parallel-type=LOGICAL_CLOCK #使用多線程復制

四、組復制有哪些限制條件?

1、Replication Event Checksums

由於代碼設計的原因,目前組復制還不能支持binlog的checksum,如果要使用組復制,需要配置binlog-checksum=none


2、Gap Locks

組復制校驗的進程不支持間隙鎖,mysql間隙鎖的設計是為了解決幻讀問題


3、Table Locks and Named Locks

組復制校驗的進程不支持表級鎖和named locks


4、SERIALIZABLE Isolation Level

組復制不支持串行事務級別


5、Concurrent DDL versus DML Operations

組復制的多主模式不支持並行的DDL和DML操作


6、Foreign Keys with Cascading Constraints

組復制的多主模式不支持帶有級聯約束類型的外鍵


7、Very Large Transactions

組復制不支持巨大的事務

參考:

https://dev.mysql.com/doc/refman/5.7/en/group-replication.html

本文出自 “斬月” 博客,謝絕轉載!

MySQL 組復制介紹