#基於群組的複製(Group-based Replication)是一種被使用在容錯系統中的技術。 Replication-group(複製群組)是由能夠相互通訊的多個伺服器(節點)組成的。
在通訊層,Group replication實作了一系列的機制:例如原子訊息(atomic message delivery)和全序化訊息(totalordering of messages)。
這些原子化,抽象化的機制,為實現更先進的資料庫複製方案提供了強有力的支援。
MySQL Group Replication正是基於這些技術和概念,實作了多主全更新的複製協定。
簡而言之,一個Replication-group就是一組節點,每個節點都可以獨立執行事務,而讀寫事務則會在於group內的其他節點進行協調之後再commit。
因此,當一個交易準備提交時,會自動在group內進行原子性的廣播,告知其他節點變更了什麼內容/執行了什麼交易。
這種原子廣播的方式,使得這個事務在每一個節點上都保持著同樣順序。
這表示每個節點都以同樣的順序,接收了相同的事務日誌,所以每個節點以同樣的順序重演了這些交易日誌,最後整個group保持了完全一致的狀態。
然而,不同的節點上執行的事務之間有可能存在資源爭用。這種現象容易出現在兩個不同的並發事務上。
假設在不同的節點上有兩個並發事務,更新了同一行數據,那麼就會發生資源爭用。
面對這種情況,Group Replication判定先提交的事務為有效事務,會在整個group裡面重演,後提交的事務會直接中斷,或者回滾,最後丟棄掉。
因此,這也是一個無共享的複製方案,每個節點都保存了完整的資料副本。看如下圖01.png,描述了具體的工作流程,能夠簡潔的和其他方案進行比較。這個複製方案,在某種程度上,和資料庫狀態機(DBSM)的Replication方法比較類似。
官網下載MYSQL5.7.17
在三台db伺服器上面設定/etc/hosts映射,如下:
192.168.136.130 #192.168.136.130 #192.168 .136.133 db2 | 192.168.136.134 db3
資料庫伺服器位址 | #連接埠 | #資料目錄 | Server -id |
192.168.136.130(db1) | ##3317 | #/data/mysql/data | 120136130 |
192.168.136.133(db2) | 3317 | /data/mysql/data | 120136133 |
#192.168.136.134(db3) | 3317 | /data/mysql/data |
##120136134 |
# |
有了gtid之后,开启group replication就方便多了。首先需要安装group replication插件
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so'; Query OK, 0 rows affected (0.03 sec) mysql> show plugins; +----------------------------+----------+--------------------+----------------------+---------+ | Name | Status | Type | Library | License | +----------------------------+----------+--------------------+----------------------+---------+ | binlog | ACTIVE | STORAGE ENGINE | NULL | GPL | ………… | group_replication | ACTIVE | GROUP REPLICATION | group_replication.so | GPL | +----------------------------+----------+--------------------+----------------------+---------+ 45 rows in set (0.00 sec)
|
配置参数,db1(master)上:
mysql> set @@global.transaction_write_set_extraction = XXHASH64 mysql> set @@global.group_replication_start_on_boot = OFF mysql> set @@global.group_replication_bootstrap_group = OFF mysql> set @@global.group_replication_group_name = 0c6d3e5f-90e2-11e6-802e-842b2b5909d6 mysql> set @@global.group_replication_local_address = 'db1:6606' mysql> set @@global.group_replication_group_seeds = 'db2:6607,db3:6608' |
配置参数,db2(slave1)上:
mysql> set @@global.transaction_write_set_extraction = XXHASH64 mysql> set @@global.group_replication_start_on_boot = OFF mysql> set @@global.group_replication_bootstrap_group = OFF mysql> set @@global.group_replication_group_name = 0c6d3e5f-90e2-11e6-802e-842b2b5909d6 mysql> set @@global.group_replication_local_address = 'db2:6607' mysql> set @@global.group_replication_group_seeds = 'db111:6606,127.0.0.1:db3' |
配置参数,db3(slave2)上:
mysql> set @@global.transaction_write_set_extraction = XXHASH64 mysql> set @@global.group_replication_start_on_boot = OFF mysql> set @@global.group_replication_bootstrap_group = OFF mysql> set @@global.group_replication_group_name = 0c6d3e5f-90e2-11e6-802e-842b2b5909d6 mysql> set @@global.group_replication_local_address = 'db3:6608' mysql> set @@global.group_replication_group_seeds = 'db1:6607,db2:6606'
|
BTY:如果之前没有配置transaction_write_set_extraction=XXHASH64,这里修改之后之前创建的数据库是没有办法执行插入操作的。所有如果想在线完成Group Replication的改造需要保证之前已经设置了transaction_write_set_extraction=XXHASH64。
开始构建集群,在db1(master)上执行:
# 构建集群 CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='rlpbright_1927@ys'FORCHANNEL'group_replication_recovery'; #开启group_replication SETGLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SETGLOBAL group_replication_bootstrap_group=OFF; |
db2、db3上加入
stop slave; START GROUP_REPLICATION; |
在db1上查看集群信息:
mysql> SELECT * FROM performance_schema.replication_group_members; |
以上是MySQL5.7.17 Group Replication初步詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!