1,關于 Group Replication
基于組的復制(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方法比較類似。
?
2,安裝mysql5.7.17
? 官網下載MYSQL5.7.17
在三臺db服務器上面設置/etc/hosts映射,如下:
192.168.136.130??? db1????????????????????????????????????????????????? ??????????????????????????????????????? 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 |
3,搭建gtid復制:
在3臺my.cnf上面配置gtid:
@@######@@ |
在3臺mysql實例上db1、db2、db3分配賬號:
@@######@@ |
在db2、db3上搭建gtid服務:
@@######@@ |
4,開啟Group Replication
有了gtid之后,開啟group replication就方便多了。首先需要安裝group replication插件
@@######@@
|
配置參數,db1(master)上:
@@######@@ |
配置參數,db2(slave1)上:
@@######@@
|
?
配置參數,db3(slave2)上:
@@######@@
|
BTY:如果之前沒有配置transaction_write_set_extraction=XXHASH64,這里修改之后之前創建的數據庫是沒有辦法執行插入操作的。所有如果想在線完成Group Replication的改造需要保證之前已經設置了transaction_write_set_extraction=XXHASH64。
開始構建集群,在db1(master)上執行:
@@######@@@@######@@@@######@@ ?@@######@@
|
?
?
db2、db3上加入
@@######@@ |
?
?
在db1上查看集群信息:
@@######@@
|
?
[mysqld] gtid_mode=ON log-slave-updates=ON enforce-gtid-consistency=ON
mysql>?GRANT??REPLICATION?SLAVE?ON?*.*?TO?'repl'@'192.168.%'?IDENTIFIED?BY??'rlpbright_1927@ys'; Query?OK,?0?rows?affected,?1?warning??(0.00?sec) ? mysql>
mysql>?change??master?to?master_user='repl',? master_password='rlpbright_1927@ys',?? master_host='db1',master_port=3317,?master_auto_position=1; Query?OK,?0?rows?affected,?2?warnings??(0.02?sec) ? mysql>??start?slave; Query?OK,?0?rows?affected?(0.04?sec) ? mysql> mysql>?show??slave?statusG ***************************?1.?row??*************************** ???????????????Slave_IO_State:?Waiting?for??master?to?send?event ??????????????????Master_Host:?db1 ??????????????????Master_User:?repl ??????????????????Master_Port:?3317 ????????????????Connect_Retry:?60 ??????????????Master_Log_File:??mysql-bin.000002 ???????????Read_Master_Log_Pos:?445 ???????????????Relay_Log_File:??mysql-relay-bin.000002 ????????????????Relay_Log_Pos:?414 ?????????Relay_Master_Log_File:?mysql-bin.000002 ?????????????Slave_IO_Running:?Yes ????????????Slave_SQL_Running:?Yes ………………………………..
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)
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'
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'
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'
#?構建集群
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;
stop?slave; START?GROUP_REPLICATION;
mysql>??SELECT?*?FROM?performance_schema.replication_group_members;