1 介紹
MySQL Group Replication(簡稱MGR)是MySQL官方於2016年12月推出的一個全新的高可用與高擴展的解決方案。MySQL組復制提供了高可用、高擴展、高可靠的MySQL集群服務。
高一致性,基於原生復制及paxos協議的組復制技術,並以插件的方式提供,提供一致數據安全保證;
高容錯性,只要不是大多數節點壞掉就可以繼續工作,有自動檢測機制,當不同節點產生資源爭用沖突時,不會出現錯誤,按照先到者優先原則進行處理,並且內置了自動化腦裂防護機制;
高擴展性,節點的新增和移除都是自動的,新節點加入后,會自動從其他節點上同步狀態,直到新節點和其他節點保持一致,如果某節點被移除了,其他節點自動更新組信息,自動維護新的組信息;
高靈活性,有單主模式和多主模式,單主模式下,會自動選主,所有更新操作都在主上進行;多主模式下,所有server都可以同時處理更新操作。
MGR是MySQL數據庫未來發展的一個重要方向。
2 環境准備
操作系統centos7
192.168.200.111 mysql-5.7 181
192.168.200.112 mysql-5.7 182
192.168.200.113 mysql-5.7 183
2.2 二進制安裝MySQL 省略
2.3 設置hostname和ip映射
[root@server2 ~]# vim /etc/hosts
192.168.200.111 server1
192.168.200.112 server2
192.168.200.113 server3
scp /etc/hosts 192.168.200.112
scp /etc/hosts 192.168.200.113
111:
hostname server1
bash
112
hostname server2
bash
113
hostname server3
bash
3. 創建復制環境
3.1 服務器server1
3.1.1 配置/etc/my.cnf
添加:
server_id = 181
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.200.111:33061'
loose-group_replication_group_seeds ='192.168.200.111:33061,192.168.200.112:33062,192.168.200.113:33063'
loose-group_replication_bootstrap_group = off
3.1.2 服務器apollo.mgr.com上建立復制賬號:
[root@server1 ~]# /etc/init.d/mysqld restart
[root@server1 ~]# mysql -uroot -p123123
mysql> set SQL_LOG_BIN=0;
mysql> create user repl@'%' identified by 'Love88me=-.,';
mysql> grant replication slave on *.* to repl@'%';
mysql> flush privileges;
mysql> set SQL_LOG_BIN=1;
mysql> change master to master_user='repl',master_password='Love88me=-.,' for channel 'group_replication_recovery'; -- 構建group replication集群
3.1.3 在mysql服務器apollo.mgr.com上安裝group replication插件
mysql> install PLUGIN group_replication SONAME 'group_replication.so';
mysql> show plugins;
3.1.4 啟動服務器server1上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;
3.1.5 查看mgr的狀態
-- 查詢表performance_schema.replication_group_members
mysql> select * from performance_schema.replication_group_members;
注意觀看:MEMBER_STATE 是不是ONLINE,如果是ONLINE則正確
3.1.6 測試服務器server1上的mysql
mysql> create database test;
mysql> use test;
mysql> create table t1(c1 int primary key, c2 text not null);
mysql> insert into t1 values (1, 'Luis');
mysql> select * from t1;
3.2 復制組添加新實例server2
3.2.1 修改/etc/my.cnf 配置文件
添加:
server_id = 182
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.200.112:33062'
loose-group_replication_group_seeds ='192.168.200.111:33061,192.168.200.112:33062,192.168.200.113:33063'
loose-group_replication_bootstrap_group = off
3.2.2 用戶憑證
mysql> set SQL_LOG_BIN=0;
mysql> create user repl@'%' identified by 'Love88me=-.,';
mysql> grant replication slave on *.* to repl@'%';
mysql> flush privileges;
mysql> SET SQL_LOG_BIN=1;
mysql> change master to master_user='repl',master_password='Love88me=-.,' for channel 'group_replication_recovery';
-- 安裝group replication插件
mysql> install PLUGIN group_replication SONAME 'group_replication.so';
3.2.3 把實例添回到之前的復制組
mysql> set global group_replication_allow_local_disjoint_gtids_join=ON;
mysql> start group_replication;
3.2.4 在server2上查看復制組狀態
mysql> select * from performance_schema.replication_group_members;
查看是不是有兩個組以及MEMBER_STATE 是不是都是ONLINE,是則成功
不是則服務器之間通道未打開
3.2.5 在新回的實例上查看數據庫發現test庫和t1表已經同步
mysql> show databases;
3.3 以同樣方法添加server3
詳細步驟請參考3.2, 這里只給出配置文件/etc/my.cnf:
server_id = 183
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.200.113:33063'
loose-group_replication_group_seeds ='192.168.200.111:33061,192.168.200.112:33062,192.168.200.113:33063'
loose-group_replication_bootstrap_group = off
3.4 查看復制組狀態
mysql> select * from performance_schema.replication_group_members;
最后三個狀態都是ONLINE