Current user: root@localhost
SSL: Not in use
Server version: 8.0.18 MySQL Community Server - GPL
Protocol version: 10
Connection: Localhost via UNIX socket

MySQL Group Replication是2016年MySQL官方在5.7版本中推出的多节点数据同步解决方案,它支持多节点写和强一致性。
✔ 高一致性,基于原生复制及paxos协议的组复制技术,并以插件的方式提供,提供一致数据安全保证;
✔ 高容错性,只要不是大多数节点坏掉就可以继续工作,有自动检测机制,当不同节点产生资源争用冲突时,不会出现错误,按照先到者优先原则进行处理,并且内置了自动化脑裂防护机制;
✔ 高扩展性,节点的新增和移除都是自动的,新节点加入后,会自动从其他节点上同步状态,直到新节点和其他节点保持一致,如果某节点被移除了,其他节点自动更新组信息,自动维护新的组信息;
✔ 高灵活性,有单主模式和多主模式,单主模式下,会自动选主,所有更新操作都在主上进行;多主模式下,所有server都可以同时处理更新操作。
虽然有许多的优点,如果要使用MGR功能的话,也是有一些限制的:
▶ 仅用于InnoDB存储引擎(事务和行级锁)▶ 表必须有主键▶ 必须启用GTID▶ 必须开启二进制日志,并且其格式必须为ROW(binlog_format=row)▶ 冲突DDl、DML只能在同一成员上执行成功▶ 在多主结构中,不完全支持外键▶ 不支持serializable的事务隔离级别▶ 只支持IPv4,并且需要低延迟,高带宽的网络环境▶ MGR最大支持9个成员▶ 复制信息元数据必须存在于系统表(master-info-repository=TABLE、relay-log-info-repository=TABLE)▶ 不支持复制过滤▶ 二进制日志checksums必须关闭(binlog-checksum=NONE)▶ 不支持savepoint的使用▶ 不支持超大事务
MGR的切换流程:

MySQL Group Replication 功能是在MySQL-5.7.17这个版本上引入的,MGR基于分布式paxos协议,实现组复制,保证数据一致性。内置故障检测和自动选主功能,它实现了MySQL各个结点间数据强一致性。但是在5.7.20版本之前,MySQL Group Replication还不完善,存在各种问题,所以搭建MySQL Group Replication集群建议采用5.7.20之后的版本,最好采用8.0版本。本文档采用8.0.18来搭建MGR集群环境,且采用MGR的单主模式。
1.1 采用三台主机进行搭建,单机的搭建过程请参考其它文章;
| 主机IP | 端口 |
10.1.12.126 | 3306 |
| 10.1.12.127 | 3306 |
| 10.1.12.128 | 3306 |
1.2 配置第一个实例
在主机10.1.12.126搭建完单机数据库实例。
其中my.cnf文件的配置调整:
其中:loose-group_replication_group_name 可通过select uuid();生成,三个实例名称一致
############### REPLICATION ###############binlog_checksum = NONEbinlog_format = ROWmaster_info_repository = TABLErelay_log_info_repository = TABLEserver_id = 3299825126skip_slave_start = ON################Group Replication##########transaction_write_set_extraction=XXHASH64loose-group_replication_group_name="9d247241-38c5-11e9-80a5-005056b57b19"loose-group_replication_start_on_boot=offloose-group_replication_local_address="10.1.12.126:24901"loose-group_replication_group_seeds="10.1.12.126:24901,10.1.12.127:24901,10.1.12.128:24901"loose-group_replication_bootstrap_group=off
1.3 启动10.1.12.126上实例
cd $MYSQL_HOMEbin/mysqld_safe --defaults-file=/mysql/my3306/my.cnf
1.4 创建复制用户与授权,并让其作为group的第一个成员:
SET SQL_LOG_BIN=0;CREATE USER dbsync@’%’ IDENTIFIED BY 'dbsync@1234';GRANT REPLICATION SLAVE ON *.* TO dbsync@’%’;FLUSH PRIVILEGES;SET SQL_LOG_BIN=1;CHANGE MASTER TO MASTER_USER='dbsync', MASTER_PASSWORD='dbsync@1234' FOR CHANNEL 'group_replication_recovery';
1.5 安装MGR插件
安装GR插件(root@localhost) [(none)]> INSTALL PLUGIN group_replication SONAME 'group_replication.so';Query OK, 0 rows affected (0.07 sec)可以检查安装结果:(root@localhost) [(none)]> SELECT * FROM information_schema.plugins WHERE PLUGIN_NAME LIKE '%group%'\G*************************** 1. row ***************************PLUGIN_NAME: group_replicationPLUGIN_VERSION: 1.0PLUGIN_STATUS: ACTIVEPLUGIN_TYPE: GROUP REPLICATIONPLUGIN_TYPE_VERSION: 1.1PLUGIN_LIBRARY: group_replication.soPLUGIN_LIBRARY_VERSION: 1.7PLUGIN_AUTHOR: OraclePLUGIN_DESCRIPTION: Group Replication (1.0.0)PLUGIN_LICENSE: GPLLOAD_OPTION: ON1 row in set (0.00 sec)
1.6 开启第一个组复制
(root@localhost) [(none)]> SET GLOBAL group_replication_bootstrap_group=ON;(root@localhost) [(none)]> START GROUP_REPLICATION;(root@localhost) [(none)]> SET GLOBAL group_replication_bootstrap_group=OFF;
启动组复制之后将group_replication_bootstrap_group设置为OFF
This option must only be set on one server and only when starting the group for the first time or restarting the entire group. After the group has been bootstrapped, set this option to OFF. It should be set to OFF both dynamically and in the configuration files
1.7 检查组复制成员
member_id是@@server_uuid的值
(root@localhost) [(none)]> SELECT * FROM performance_schema.replication_group_members;+---------------------------+--------------------------------------+-------------+-------------+--------------+| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |+---------------------------+--------------------------------------+-------------+-------------+--------------+| group_replication_applier | 9d247241-38c5-11e9-80a5-005056b57b19 | mysql01| 3306 | ONLINE |+---------------------------+--------------------------------------+-------------+-------------+--------------+1 row in set (0.00 sec)
配置第二个实例10.1.12.127
2.1 安装软件
在主机10.1.12.127搭建完单机数据库实例。
其中my.cnf文件的配置调整:
其中:
loose-group_replication_group_name 可通过select uuid();生成
server_id 每个实例值不同
############# REPLICATION #############binlog_checksum = NONEbinlog_format = ROWmaster_info_repository = TABLErelay_log_info_repository = TABLEserver_id = 3299825127skip_slave_start = ON################Group Replication##########transaction_write_set_extraction=XXHASH64loose-group_replication_group_name="9d247241-38c5-11e9-80a5-005056b57b19"loose-group_replication_start_on_boot=offloose-group_replication_local_address="10.1.12.127:24901"loose-group_replication_group_seeds="10.1.12.126:24901,10.1.12.127:24901,10.1.12.128:24901"loose-group_replication_bootstrap_group=off
2.2 启动10.1.12.127上实例
cd $MYSQL_HOMEbin/mysqld_safe --defaults-file=/mysql/my3306/my.cnf &
2.3 创建复制用户与授权,并让其作为group的第二个成员
SET SQL_LOG_BIN=0;CREATE USER dbsync@’%’ IDENTIFIED BY 'dbsync@1234';GRANT REPLICATION SLAVE ON *.* TO dbsync@’%’;FLUSH PRIVILEGES;SET SQL_LOG_BIN=1;CHANGE MASTER TO MASTER_USER='dbsync', MASTER_PASSWORD='dbsync@1234' FOR CHANNEL 'group_replication_recovery';
2.4 安装MGR插件
安装GR插件(root@localhost) [(none)]> INSTALL PLUGIN group_replication SONAME 'group_replication.so';Query OK, 0 rows affected (0.07 sec)可以检查安装结果:(root@localhost) [(none)]> SELECT * FROM information_schema.plugins WHERE PLUGIN_NAME LIKE '%group%'\G*************************** 1. row ***************************PLUGIN_NAME: group_replicationPLUGIN_VERSION: 1.0PLUGIN_STATUS: ACTIVEPLUGIN_TYPE: GROUP REPLICATIONPLUGIN_TYPE_VERSION: 1.1PLUGIN_LIBRARY: group_replication.soPLUGIN_LIBRARY_VERSION: 1.7PLUGIN_AUTHOR: OraclePLUGIN_DESCRIPTION: Group Replication (1.0.0)PLUGIN_LICENSE: GPLLOAD_OPTION: ON1 row in set (0.00 sec)
2.5 开启组复制
(root@localhost) [(none)]> START GROUP_REPLICATION;
2.6 检查组复制情况
(root@localhost) [(none)]> SELECT * FROM performance_schema.replication_group_members;+---------------------------+--------------------------------------+-------------+-------------+--------------+| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |+---------------------------+--------------------------------------+-------------+-------------+--------------+| group_replication_applier | 9d247241-38c5-11e9-80a5-005056b57b19 | mysql01| 3306 | ONLINE || group_replication_applier | 9d247241-38c5-11e9-80a5-005056b57b19 | mysql02 | 3306| ONLINE |+---------------------------+--------------------------------------+-------------+-------------+--------------+2 rows in set (0.00 sec)
配置第三个实例10.1.12.128
3.1 安装软件
在主机10.1.12.128搭建完单机数据库实例。
其中my.cnf文件的配置调整:
其中:loose-group_replication_group_name 可通过select uuid();生成
server_id 每个实例值不同
############# REPLICATION #############binlog_checksum = NONEbinlog_format = ROWmaster_info_repository = TABLErelay_log_info_repository = TABLEserver_id = 3299825128skip_slave_start = ON################Group Replication##########transaction_write_set_extraction=XXHASH64loose-group_replication_group_name="9d247241-38c5-11e9-80a5-005056b57b19"loose-group_replication_start_on_boot=offloose-group_replication_local_address="10.1.12.128:24901"loose-group_replication_group_seeds="10.1.12.126:24901,10.1.12.127:24901,10.1.12.128:24901"loose-group_replication_bootstrap_group=off
3.2 启动10.1.12.128上实例
cd $MYSQL_HOMEbin/mysqld_safe --defaults-file=/mysql/my3306/my.cnf &
3.3 创建复制用户与授权,并让其作为group的第三个成员:
SET SQL_LOG_BIN=0;CREATE USER dbsync@’%’ IDENTIFIED BY 'dbsync@1234';GRANT REPLICATION SLAVE ON *.* TO dbsync@’%’;FLUSH PRIVILEGES;SET SQL_LOG_BIN=1;CHANGE MASTER TO MASTER_USER='dbsync', MASTER_PASSWORD='dbsync@1234' FOR CHANNEL 'group_replication_recovery';
3.4 安装MGR插件
安装GR插件(root@localhost) [(none)]> INSTALL PLUGIN group_replication SONAME 'group_replication.so';Query OK, 0 rows affected (0.07 sec)可以检查安装结果:(root@localhost) [(none)]> SELECT * FROM information_schema.plugins WHERE PLUGIN_NAME LIKE '%group%'\G*************************** 1. row ***************************PLUGIN_NAME: group_replicationPLUGIN_VERSION: 1.0PLUGIN_STATUS: ACTIVEPLUGIN_TYPE: GROUP REPLICATIONPLUGIN_TYPE_VERSION: 1.1PLUGIN_LIBRARY: group_replication.soPLUGIN_LIBRARY_VERSION: 1.7PLUGIN_AUTHOR: OraclePLUGIN_DESCRIPTION: Group Replication (1.0.0)PLUGIN_LICENSE: GPLLOAD_OPTION: ON1 row in set (0.00 sec)
3.5 开启组复制
(root@localhost) [(none)]> START GROUP_REPLICATION;
3.6 检查组复制情况
(root@localhost) [(none)]> SELECT * FROM performance_schema.replication_group_members;+---------------------------+--------------------------------------+-------------+-------------+--------------+| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |+---------------------------+--------------------------------------+-------------+-------------+--------------+| group_replication_applier | 9d247241-38c5-11e9-80a5-005056b57b19 | mysql01| 3306 | ONLINE || group_replication_applier |9d247241-38c5-11e9-80a5-005056b57b19 | mysql02| 3306| ONLINE|| group_replication_applier | 9d247241-38c5-11e9-80a5-005056b57b19 | mysql03| 3306 | ONLINE|+---------------------------+--------------------------------------+-------------+-------------+--------------+2 rows in set (0.00 sec)
至此,MySQL MGR架构就已经搭建完毕了,enjoy it!
1. 查看成员信息:
mysql > select * from performance_schema.replication_group_members;
2. 查看节点信息:
mysql > select * from performance_schema.replication_group_member_stats \G
3. 查看主节点:
mysql > select variable_value from performance_schema.global_status where variable_name='group_replication_primary_member';
4. 查看主节点方式2:
select @@read_only;
正常情况下且是在单主的情况下,从节点都是不可写的,即该参数的值为1,而主节点的值为0
5. 多主模式切换
切换为多主
MGR切换模式需要重新启动组复制,因些需要在所有节点上先关闭组复制,设置 group_replication_single_primary_mode=OFF 等参数,再启动组复制。
# 停止组复制(所有节点执行):mysql> stop group_replication;mysql> set global group_replication_single_primary_mode=OFF;mysql> set global group_replication_enforce_update_everywhere_checks=ON;# 随便选择某个节点执行mysql> SET GLOBAL group_replication_bootstrap_group=ON;mysql> START GROUP_REPLICATION;mysql> SET GLOBAL group_replication_bootstrap_group=OFF;# 其他节点执行mysql> START GROUP_REPLICATION;# 查看组信息,所有节点的 MEMBER_ROLE 都为 PRIMARYmysql> SELECT * FROM performance_schema.replication_group_members;
6. 切换回单主
# 所有节点执行mysql> stop group_replication;mysql> set global group_replication_enforce_update_everywhere_checks=OFF;mysql> set global group_replication_single_primary_mode=ON;# 主节点(如主机1)执行SET GLOBAL group_replication_bootstrap_group=ON;START GROUP_REPLICATION;SET GLOBAL group_replication_bootstrap_group=OFF;# 从节点(主机2、主机3)执行START GROUP_REPLICATION;# 查看MGR组信息mysql> SELECT * FROM performance_schema.replication_group_members;
MySQL组复制提供了高可用、高弹性、可靠的MySQL服务,旨在打造金融级MySQL集群架构。在忽略网络延迟的情况,可以轻松的实现多活和异地容灾近端写库,这一点是业务上比较期待的。组复制是MySQL未来的一个发展趋势,相信在未来的生产环境中会越来越多,MySQL也会也来月稳定。

完
=end=





