本文轉載自: https://www.93bok.com
MGR簡介
MySQL Group Replication(簡稱MGR)是MySQL官方於2016年12月推出的一個全新的高可用與高擴展的解決方案。MySQL組復制提供了高可用、高擴展、高可靠的MySQL集群服務。
1)高一致性
基於原生復制及paxos協議的組復制技術,並以插件的方式提供,提供一致數據安全保證;
2)高容錯性
只要不是大多數節點壞掉就可以繼續工作,有自動檢測機制,當不同節點產生資源爭用沖突時,不會出現錯誤,按照先到者優先原則進行處理,並且內置了自動化腦裂防護機制;
3)高擴展性
節點的新增和移除都是自動的,新節點加入后,會自動從其他節點上同步狀態,直到新節點和其他節點保持一致,如果某節點被移除了,其他節點自動更新組信息,自動維護新的組信息;
4)高靈活性
有單主模式和多主模式,單主模式下,會自動選主,所有更新操作都在主上進行;多主模式下,所有server都可以同時處理更新操作。
MGR是MySQL數據庫未來發展的一個重要方向。
MGR基礎結構要求
1、引擎必須為innodb,因為需事務支持在commit時對各節點進行沖突檢查
2、每個表必須有主鍵,在進行事務沖突檢測時需要利用主鍵值對比
3、必須開啟binlog且為row格式
4、必須打開GTID特性,且主從狀態信息存於表中
(--master-info-repository=TABLE 、--relay-log-info-repository=TABLE)
5、--log-slave-updates打開
6、一致性檢測設置--transaction-write-set-extraction=XXHASH64
MGR使用限制
1、RP和普通復制binlog校驗不能共存,需設置--binlog-checksum=none
2、不支持gap lock(間隙鎖),隔離級別需設置為read_committed
3、不支持對表進行鎖操作(lock /unlock table),不會發送到其他節點執行 ,影響需要對表進行加鎖操作的情況,列入mysqldump全表備份恢復操作
4、不支持serializable(序列化)隔離級別
5、DDL語句不支持原子性,不能檢測沖突,執行后需自行校驗是否一致
6、不支持外鍵:多主不支持,單主模式不存在此問題
7、最多支持9個節點:超過9台server無法加入組
MGR多主模式部署
一、准備環境
主機IP 主機名 數據庫版本 Server ID 操作系統
192.168.10.22 nongziyi22.xin mysql-5.7.19 1 Centos6.5
192.168.10.27 nongziyi27.xin mysql-5.7.19 2 Centos6.5
192.168.10.29 nongziyi29.xin mysql-5.7.19 3 Centos6.5
二、設置hostname和ip映射關系
在三台服務器上都設置:
vim /etc/hosts
192.168.10.22 nongziyi22.xin
192.168.10.27 nongziyi27.xin
192.168.10.29 nongziyi29.xin
三、nongziyi22.xin服務器配置
1、配置my.cnf(和單主模式只差兩句配置在末尾)
vim /etc/mysql/my.cnf
[mysqld]
datadir=/a01/apps/mysql/data
socket=/tmp/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
#Group Replication
server_id = 1 #服務ID
gtid_mode = ON #全局事物
enforce_gtid_consistency = ON #強制GTID的一致性
master_info_repository = TABLE #將master.info元數據保存在系統表中
relay_log_info_repository = TABLE #將relay.info元數據保存在系統表中
binlog_checksum = NONE #禁用二進制日志事件校驗
log_slave_updates = ON #級聯復制
log_bin = binlog #開啟二進制日志記錄
binlog_format= ROW #以行的格式記錄
transaction_write_set_extraction = XXHASH64 #使用哈希算法將其編碼為散列
loose-group_replication_group_name = 'ce9be252-2b71-11e6-b8f4-00212844f856' #加入的組名
loose-group_replication_start_on_boot = off #不啟用自動復制集群功能
loose-group_replication_local_address = '192.168.10.22:33061' #以本機3306端口接收來自組成員的傳入連接
loose-group_replication_group_seeds ='192.168.10.22:33061,192.168.10.27:33061,192.168.10.29:33061' #組中成員訪問列表
loose-group_replication_bootstrap_group = off #不啟用引導組
loose-group_replication_single_primary_mode = off #關閉單master模式
loose-group_replication_enforce_update_everywhere_checks = ON #多主一致性檢查
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
2、重啟mysql服務
service mysqld restart
3、建立復制賬號
mysql -u root -p123456
mysql> set SQL_LOG_BIN=0; #停掉日志記錄
mysql> grant replication slave on *.* to MGR@'192.168.10.%' identified by '123456';
mysql> flush privileges;
mysql> set SQL_LOG_BIN=1; #開啟日志記錄
mysql> change master to master_user='MGR',master_password='123456' for channel 'group_replication_recovery'; #構建group_replication集群
4、安裝group replication插件
#安裝插件
mysql> install PLUGIN group_replication SONAME 'group_replication.so';
#查看group replication組件
mysql> show plugins;

5、啟動服務器上mysql的group replication
#設置group_replication_bootstrap_group為ON是為了標示以后加入集群的服務器以這台服務器為基准,以后加入的就不需要設置
mysql> set global group_replication_bootstrap_group=ON;
#作為首個節點啟動MGR集群
mysql> start group_replication;
mysql> set global group_replication_bootstrap_group=OFF;

6、查看MGR的狀態
mysql> select * from performance_schema.replication_group_members;

7、插入數據以便一會別的主機添加到集群中的時候查看效果
mysql> create database nongkaige;
mysql> use nongkaige;
mysql> create table ziyi(id int primary key,name varchar(20));
mysql> insert into ziyi values (1,'nongziyi');
mysql> select * from nongkaige.ziyi;

四、nongziyi27.xin服務器配置
1、配置my.cnf(和之前的一樣,只是server_id和IP地址不一樣而已)
vim /etc/mysql/my.cnf
#Group Replication
server_id = 2
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
log_slave_updates = ON
log_bin = binlog
binlog_format= ROW
transaction_write_set_extraction = XXHASH64
loose-group_replication_group_name = 'ce9be252-2b71-11e6-b8f4-00212844f856'
loose-group_replication_start_on_boot = off
loose-group_replication_local_address = '192.168.10.27:33061'
loose-group_replication_group_seeds ='192.168.10.22:33061,192.168.10.27:33061,192.168.10.29:33061'
loose-group_replication_bootstrap_group = off
loose-group_replication_single_primary_mode = off
loose-group_replication_enforce_update_everywhere_checks = ON
2、重啟mysql服務
service mysqld restart
3、建立復制賬號
mysql -u root -p123456
mysql> set SQL_LOG_BIN=0; #停掉日志記錄
mysql> grant replication slave on *.* to MGR@'192.168.10.%' identified by '123456';
mysql> flush privileges;
mysql> set SQL_LOG_BIN=1; #開啟日志記錄
mysql> change master to master_user='MGR',master_password='123456' for channel 'group_replication_recovery'; #構建group_replication集群
4、安裝group replication插件
#安裝插件
mysql> install PLUGIN group_replication SONAME 'group_replication.so';
5、啟動MGR集群
mysql> set global group_replication_allow_local_disjoint_gtids_join=ON;
mysql> start group_replication;
6、查看MGR的狀態
mysql> select * from performance_schema.replication_group_members;

7、檢測數據是否同步過來
mysql> select * from nongkaige.ziyi;

五、nongziyi29.xin服務器配置
1、配置my.cnf(和之前的一樣,只是server_id和IP地址不一樣而已)
vim /etc/mysql/my.cnf
#Group Replication
server_id = 3
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
log_slave_updates = ON
log_bin = binlog
binlog_format= ROW
transaction_write_set_extraction = XXHASH64
loose-group_replication_group_name = 'ce9be252-2b71-11e6-b8f4-00212844f856'
loose-group_replication_start_on_boot = off
loose-group_replication_local_address = '192.168.10.29:33061'
loose-group_replication_group_seeds ='192.168.10.22:33061,192.168.10.27:33061,192.168.10.29:33061'
loose-group_replication_bootstrap_group = off
loose-group_replication_single_primary_mode = off
loose-group_replication_enforce_update_everywhere_checks = ON
2、重啟mysql服務
service mysqld restart
3、建立復制賬號
mysql -u root -p123456
mysql> set SQL_LOG_BIN=0; #停掉日志記錄
mysql> grant replication slave on *.* to MGR@'192.168.10.%' identified by '123456';
mysql> flush privileges;
mysql> set SQL_LOG_BIN=1; #開啟日志記錄
mysql> change master to master_user='MGR',master_password='123456' for channel 'group_replication_recovery'; #構建group_replication集群
4、安裝group replication插件
#安裝插件
mysql> install PLUGIN group_replication SONAME 'group_replication.so';
5、啟動MGR集群
mysql> set global group_replication_allow_local_disjoint_gtids_join=ON;
mysql> start group_replication;
6、查看MGR的狀態
mysql> select * from performance_schema.replication_group_members;

7、檢測數據是否同步過來
mysql> select * from nongkaige.ziyi;

查看誰是MGR集群的主節點
mysql> select variable_value from performance_schema.global_status where variable_name='group_replication_primary_member';

和單主模式不同,這里所有的主機都是主服務器,都能進行寫操作
MGR集群測試
測試是否3個節點都能進行寫操作
1、在nongziyi22這台主機上插入一條數據看看能否寫入
mysql> insert into nongkaige.ziyi values (3,'huanglihua');

2、在nongziyi27這台主機插入一條數據看看能否寫入
mysql> insert into nongkaige.ziyi values (4,'nongkaige');

3、在nongziyi29這台主機插入一條數據看看能否寫入
mysql> insert into nongkaige.ziyi values (5,'pipixia');

