概念介绍说明:
MGR全称MySQL Group Replication(MySQL组复制),是MySQL官方于2016年12月推出的一个全新的高可用与高扩展的解决方案。
MGR提供了高可用、高扩展、高可靠的MySQL集群服务。
在MGR出现之前,用户常见的MySQL高可用方式,无论怎么变化架构,本质就是Master-Slave架构。
MySQL 5.7.17版本开始支持无损半同步复制(lossless semi-syncreplication),从而进一步提升数据复制的强一致性。
MySQL Group Replication(MGR)是MySQL官方在5.7.17版本引进的一个数据库高可用与高扩展的解决方案,以插件形式提供。
MGR基于分布式paxos协议,实现组复制,保证数据一致性。
MGR采用多副本,在2N+1个节点集群中,集群只要N+1个节点还存活着,数据库就能稳定的对外提供服务;
数据库组复制功能,可以理解为是数据库主从关系的高可用环境,一般需要三个数据库实例,构成一个具有高可用、高一致性的复制环境
主要涉及的功能应用包含:
-
具有多节点之间互相通过投票的方式进行监控功能;(基于paxos协议)
-
具有内置故障检测和自动选主功能,只要不是集群中的大多数节点都宕机,就可以继续正常工作;
- 如果主节点异常,会自动选举新节点实现故障转移
- 如何从节点异常,会自动将从节点从复制节点踢除
- 提供单主模式与多主模式,多主模式支持多点写入;
应用模式说明:
- MGR单主模式(single-primary mode)
在这种模式下,组具有设置为读写模式的单主服务器,该组中的所有其他成员都设置为只读模式(这会自动发生);
主服务器通常是引导该组的第一台服务器,所有其它加入的服务器会自动了解主服务器,并设置为只读;
MGR单主模式选举原理
单主模式下,如果主节点挂了,那么其他的成员会自动选举出新的主成员,成员之间可以通过配置权重来确定下一个主成员是谁,
如果没有配置权重,则会对所有在线成员的UUID进行排序,然后选取UUID最小的成员作为主成员。

- MGR多主模式(multi-primary mode)
在多主的模式下,没有单个主概念。无需进行节点选举,因为没有服务器扮演任何特殊角色,所有服务器均设置为读写模式。
MGR多主模式选举原理
多主模式,所有的组内成员对外提供读写服务,是真正意义上的并发,MGR对于高并发有很好的的处理能力。
多主模式下,组内所有成员没有主从之分,对用户来说,就像在操作一个MySQL一样。
所以在多主模式下,不存在选举主节点,因为所有节点都是主节点。

利用MGR工作模式可以实现业务架构的读写分离需求,应用MySQL原生态的router功能即可实现,并且原生态router技术更兼容MGR;
因为,当MGR中主节点出现异常下线后,会选举出现的主节点,原生态router技术可以自动识别新的主节点,做读写分离的写库;
将MySQL MGR + MySQL Router + MySQL Shell = InnoDB Cluster

官方扩展学习资料链接:https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-innodb-cluster.html
适用场景说明:
MGR天生就是为金融场景设计的,例如:支付,证券交易,保险,银行等等。
因为这些场景要求数据必须做到零丢失,数据库可用性在4个9,甚至5个9的标准(年度停机时间不超过5分钟)
工作机制原理:
组复制是一种可用于实现容错系统的技术,复制组是一个通过消息传递实现相互交互的server集群;
复制组由多个server成员组成,如下图master01、master02、master03,所有成员独立完成各自的事务;
1、当客户端发起一个更新事务时,该事务先在本地执行,执行完成之后就要发起对事务的提交操作;
2、在还没有真正提交之前,需要将产生的复制写集广播出去,复制到其它所有成员节点;
主库事务提交时,会将事务修改记录相关的信息和事务产生的binlog事件打包生成一个写集,将写集发送给所有节点;
3、如果冲突检测成功,组内决定该事务可以提交,其它成员可以应用,否则就回滚;
冲突检测成功的标准是:至少半数以上个节点投票通过才能事务提交成功;
4、最终,所有组内成员以相同的顺序接收同一组事务;
因此,组内成员以相同的顺序应用相同的修改,保证组内数据强一致性(采用了分布式事务特性)

功能应用实践:
① MGR复制同步功能实现环境:
为了实现MGR复制的主从同步,需要准备好主从架构环境:
| 主机角色 | 主机名称 | 地址信息 |
|---|---|---|
| 主库服务器 | 192.168.30.101 | 3306 |
| 从库服务器 | 192.168.30.102 | 3306 |
| 从库服务器 | 192.168.30.103 | 3306 |
对原有数据库服务环境清理:(基于GTID环境构建)
# 在所有主从节点均进行清理操作:
[root@master ~]# pkill mysqld
[root@master ~]# rm -rf /data/13306/*
[root@master ~]# rm -rf /data/binlog/*
[root@master ~]# \mv /etc/my.cnf /tmp
[root@master ~]# mkdir -p /data/13306/data /data/13306/binlog
[root@master ~]# chown -R mysql.mysql /data/*
-- 所有数据库主从节点均进行以上清理操作;
# 获取随机数信息充当uuid信息
[root@master ~]# cat /proc/sys/kernel/random/uuid
eb8441e9-8aef-4a86-a4bc-5beea315f04f
-- 借助随机数文件生成uuid信息,因为组复制过程也是通过GTID的uuid号码,达到复制环境中的事务一致性
-- 这里采用内部GTID功能,也就是组复制的各个节点通过同一个GTID的标识,进行事务管理,所以需要给组复制设置唯一号码
# 主库db01配置文件编写
cat >/etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/13306/data
socket=/tmp/mysql.sock
server_id=51
port=13306
secure-file-priv=/tmp
log_bin=/data/binlog/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
skip_name_resolve
master_info_repository=TABLE
-- 将master_info信息以表方式记录
relay_log_info_repository=TABLE
-- 将relay_log_info信息以表方式记录
report_host=192.168.30.101
report_port=13306
socket=/tmp/mysql13306.sock
default_authentication_plugin=mysql_native_password
binlog_checksum=NONE
mysqlx=off
binlog_transaction_dependency_tracking=WRITESET
-- 在数据库8.0之后具有的配置,表示写集合配置信息,可以进一步提升SQL线程回放的并发度;(需要表有主键)
-- 是可以实现跨事务并发执行
transaction_write_set_extraction=XXHASH64
-- 定义写集合的hash算法信息,也属于数据库8.0之后具有的特性配置
-- 以上两行参数信息不加上,就表示与5.7版本数据库可以进行兼容,可以理解为是优化参数
loose-group_replication_group_name="eb8441e9-8aef-4a86-a4bc-5beea315f04f"
-- 设置组复制各个节点的统一唯一uuid标识信息,即同一组复制内部的唯一标识;
-- 一样就表示可以加入同一组复制中,不同就表示不加入到相同的组复制中
loose-group_replication_start_on_boot=OFF
-- 在组复制过程中也是需要启动相应线程,完成组复制任务的;
-- 此参数配置表示在服务启动时,不自动运行启动组复制功能,一般都是进行手工启动
-- 主要是防止数据库意外重启后,对组复制之间关系的影响,不能让重启后数据库自动加入到组复制中
loose-group_replication_local_address="192.168.30.101:33061"
-- 表示定义本地主机数据库服务的内部通讯地址和端口
loose-group_replication_group_seeds="192.168.30.101:33061,192.168.30.102:33062,192.168.30.103:33063"
-- 表示定义所有集群主机的内部通讯地址和端口
-- 以上地址和端口信息,表示组复制集群内部通讯时,应用的地址和端口信息;
-- 内部通讯需求:心跳检测、复制关系、日志同步、投票、选举...,都是通过内部地址和端口进行的;
loose-group_replication_bootstrap_group=OFF
-- 表示是否将此节点作为引导节点
-- 组复制在第一次进行配置时,需要先有引导节点,其他节点做为加入节点(joiner),不能都是ON,否则会产生争抢问题
-- 以上参数信息中loose,表示在没有组复制插件时,进行初始化操作只会报警告信息,而不会报错误提示
[mysql]
prompt=db01 [\\d]>
EOF
# 主库db02配置文件编写
cat >/etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/13306/data
socket=/tmp/mysql.sock
server_id=52
port=13306
secure-file-priv=/tmp
log_bin=/data/binlog/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
skip_name_resolve
master_info_repository=TABLE
relay_log_info_repository=TABLE
report_host=192.168.30.102
report_port=13306
socket=/tmp/mysql13306.sock
default_authentication_plugin=mysql_native_password
binlog_checksum=NONE
mysqlx=off
binlog_transaction_dependency_tracking=WRITESET
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="eb8441e9-8aef-4a86-a4bc-5beea315f04f"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="192.168.30.102:33062"
loose-group_replication_group_seeds="192.168.30.101:33061,192.168.30.102:33062,192.168.30.103:33063"
loose-group_replication_bootstrap_group=OFF
[mysql]
prompt=db02 [\\d]>
EOF
# 主库db03配置文件编写
cat >/etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/13306/data
socket=/tmp/mysql.sock
server_id=53
port=13306
secure-file-priv=/tmp
log_bin=/data/binlog/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
skip_name_resolve
master_info_repository=TABLE
relay_log_info_repository=TABLE
report_host=192.168.30.103
report_port=13306
socket=/tmp/mysql13306.sock
default_authentication_plugin=mysql_native_password
binlog_checksum=NONE
mysqlx=off
binlog_transaction_dependency_tracking=WRITESET
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="eb8441e9-8aef-4a86-a4bc-5beea315f04f"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="192.168.30.103:33063"
loose-group_replication_group_seeds="192.168.30.101:33061,192.168.30.102:33062,192.168.30.103:33063"
loose-group_replication_bootstrap_group=OFF
[mysql]
prompt=db03 [\\d]>
EOF
# 进行数据库所有节点初始化操作
[root@master ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/13306/data
[root@master-02 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/13306/data
[root@master-03 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/13306/data
# 启动数据库所有节点服务
[root@master ~]# /etc/init.d/mysqld start
[root@master-02 ~]# /etc/init.d/mysqld start
[root@master-03 ~]# /etc/init.d/mysqld start
异常配置信息参数说明:
group_replication变量使用的loose-前缀是指server启用时尚未加载复制插件也将继续启动
| num | conf_info |
|---|---|
| 01 | transaction_write_set_extraction=XXHASH64 指示server为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列 |
| 02 | loose-group_replication_group_name="eb8441e9-8aef-4a86-a4bc-5beea315f04f" 表示将加入或创建的复制组命名为eb8441e9-8aef-4a86-a4bc-5beea315f04f 可以自定义或者通过cat /proc/sys/kernel/random/uuid获取 |
| 03 | loose-group_replication_start_on_boot=OFF 表示设置server启动时不自动启动组复制 |
| 04 | loose-group_replication_local_address="192.168.30.101:33061" 表示绑定本地的192.168.30.101:33061端口接受其他组成员的连接,IP地址必须为其他组成员可正常访问 |
| 05 | loose-group_replication_group_seeds="192.168.30.101:33061,192.168.30.102:33062,192.168.30.103:33063" 表示告诉服务器在加入组时,应当连接到这些种子服务器进行配置。本设置可以不是全部的组成员服务地址 |
| 06 | loose-group_replication_bootstrap_group=OFF 表示配置是否自动引导组 |
| 07 | loose-group_replication_ip_whitelist="10.30.0.0/16,10.31.0.0/16,10.27.0.0/16" 表示配置白名单,默认情况下只允许192.168.30.101/102/103连接到复制组,如果是其他IP则需要配置 |
② MGR复制同步功能配置过程:
MGR单主模式配置过程:
# 设置本地root用户密码和密码插件(所有节点)
mysql -S /tmp/mysql13306.sock -e "alter user 'root'@'localhost' identified with mysql_native_password by '123';"
# 安装部署MGR组复制功能插件(所有节点)
mysql -uroot -p123 -S /tmp/mysql13306.sock -e "install plugin group_replication SONAME 'group_replication.so';"
# 设置创建MGR组复制功能账号(所有节点)
mysql -uroot -p123 -S /tmp/mysql13306.sock
set sql_log_bin=0;
create user repl@'%' identified by '123';
create user repl@'localhost' identified by '123';
create user repl@'127.0.0.1' identified by '123';
grant replication slave,replication client on *.* to repl@'%';
grant replication slave,replication client on *.* to repl@'localhost';
grant replication slave,replication client on *.* to repl@'127.0.0.1';
flush privileges;
set sql_log_bin=1;
# 启动MGR单主模式:启动MGR引导节点(在主库上执行)
change master to master_user='repl',master_password='123' for channel 'group_replication_recovery';
set global group_replication_bootstrap_group=ON;
start group_replication;
set global group_replication_bootstrap_group=OFF;
-- 相当于创建一个组复制集群,并指定集群中的引导节点
select * from performance_schema.replication_group_members;
-- 查看集群节点状态信息,以及集群成员信息
db01 [(none)]>select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+----------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+----------------+-------------+--------------+-------------+----------------+
| group_replication_applier | f90d44f9-7b94-11ed-ab2d-000c2996c4f5 | 192.168.30.101 | 13306 | ONLINE | PRIMARY | 8.0.26 |
+---------------------------+--------------------------------------+----------------+-------------+--------------+-------------+----------------+
1 row in set (0.00 sec)
# 其他几点加入MGR(在所有从库上执行)
reset master;
-- 表示清除从库上所有日志信息,重新做日志信息的复制或生成;
change master to master_user='repl',master_password='123' for channel 'group_replication_recovery';
start group_replication;
-- 将指定从库节点加入到组复制集群中(企业中最好先备份恢复一定的数据,在进行组复制应用)
select * from performance_schema.replication_group_members;
-- 查看集群节点状态信息,以及集群成员信息
+---------------------------+--------------------------------------+----------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+----------------+-------------+--------------+-------------+----------------+
| group_replication_applier | f90d44f9-7b94-11ed-ab2d-000c2996c4f5 | 192.168.30.101 | 13306 | ONLINE | PRIMARY | 8.0.26 |
| group_replication_applier | fe73f0b4-7b94-11ed-96ea-000c2961cd06 | 192.168.30.102 | 13306 | ONLINE | SECONDARY | 8.0.26 |
| group_replication_applier | 0a09b03e-7b95-11ed-9af8-000c29f5669f | 192.168.30.103 | 13306 | ONLINE | SECONDARY | 8.0.26 |
+---------------------------+--------------------------------------+----------------+-------------+--------------+-------------+----------------+
3 rows in set (0.00 sec)
-- 此时可以看到3个节点状态为online,并且主节点为192.168.30.101,只有主节点可以写入,其他节点只读,MGR单主模式搭建成功
show variables like '%only%';
+----------------------------------------+-------+
| Variable_name | Value |
+----------------------------------------+-------+
| read_only | ON |
| super_read_only | ON |
+----------------------------------------+-------+
-- 此时所有从库节点只能实现只读操作,只有主库可以进行写操作
# 遇到集群构建异常,可以进行重置操作
stop group_replication;
reset master;
set sql_log_bin=0;
change master to master_user='repl',master_password='123' for channel 'group_replication_recovery';
start group_replication;
MGR多主模式配置过程:从单主模式切换到多主模式
MGR切换模式需要重新启动组复制,因此需要在所有节点上先关闭组复制,设置group_replication_single_primary_mode=OFF参数
再重新启动组复制功能
# 多主模式需要的参数信息
group_replication_single_primary_mode=0
-- 设置参数表示关闭掉单master模式
group_replication_enforce_update_everywhere_checks=1
-- 这个参数设置表示多主模式下,各个节点进行严格一致性检查
# 多主模式功能配置(在所有节点上执行)
stop group_replication;
set global group_replication_single_primary_mode=OFF;
set global group_replication_enforce_update_everywhere_checks=1;
select @@group_replication_single_primary_mode,@@group_replication_enforce_update_everywhere_checks;
-- 检查参数配置信息是否生效
set global group_replication_bootstrap_group=ON;
start group_replication;
set global group_replication_bootstrap_group=OFF;
-- 重新启动MGR组复制功能,是多主模式生效(主节点操作)
start group_replication;
-- 重新启动MGR组复制功能,是多主模式生效(从节点操作)
select * from performance_schema.replication_group_members;
-- 查看集群节点状态信息,以及集群成员信息
+---------------------------+--------------------------------------+----------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+----------------+-------------+--------------+-------------+----------------+
| group_replication_applier | 0a09b03e-7b95-11ed-9af8-000c29f5669f | 192.168.30.103 | 13306 | ONLINE | PRIMARY | 8.0.26 |
| group_replication_applier | f90d44f9-7b94-11ed-ab2d-000c2996c4f5 | 192.168.30.101 | 13306 | ONLINE | PRIMARY | 8.0.26 |
| group_replication_applier | fe73f0b4-7b94-11ed-96ea-000c2961cd06 | 192.168.30.102 | 13306 | ONLINE | PRIMARY | 8.0.26 |
+---------------------------+--------------------------------------+----------------+-------------+--------------+-------------+----------------+
3 rows in set (0.00 sec)
# 修改从库只读功能配置(在所有从库上执行)
set global read_only=0;
set global super_read_only=0;
-- 默认启动组复制功能都是单master模式,从库节点都是自动设置read_only super_read_only这两个参数,需要手工修改
完成上面的配置后就可以执行多点写入了,多点写入会存在冲突检查,这对数据库性能耗损是挺大的,官方建议采用网络区分功能,
在程序端把相同的业务定位到同一节点,尽量减少冲突发生的几率;
# 停止组复制功能(在所有节点执行)
stop group_replication;
set global group_replication_single_primary_mode=OFF;
set global group_replication_enforce_update_everywhere_checks=ON;
# 随便选择某个节点执行操作
set global group_replication_bootstrap_group=ON;
start group_replication;
set global group_replication_bootstrap_group=OFF;
# 其他节点执行
start group_replication;
# 查看组信息,所有节点的member_role 都为primary;
select * from performance_schema.replication_group_members;
MGR多主模式配置过程:从多主模式切换到单主模式
# 所有节点执行以下操作
stop group_replication;
set global group_replication_enforce_update_everywhere_checks=OFF;
set global group_replication_single_primary_mode=ON;
# 在主节点执行以下操作
set global group_replication_bootstrap_group=ON;
start group_replication;
set global group_replication_bootstrap_group=OFF;
# 在从节点执行以下操作
start group_replication;
# 查看MGR组信息:
select * from performance_schema.replication_group_members;
③ MGR复制同步功能运维管理:
# MGR日常管理监控操作:
select * from performance_schema.replication_group_members;
-- 根据命令信息输出,获取各个节点主机的状态情况;
# MGR故障模拟操作过程:
[root@master ~]# /etc/init.d/mysqld stop
db02 [(none)]>select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+----------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+----------------+-------------+--------------+-------------+----------------+
| group_replication_applier | 0a09b03e-7b95-11ed-9af8-000c29f5669f | 192.168.30.103 | 13306 | ONLINE | PRIMARY | 8.0.26 |
| group_replication_applier | fe73f0b4-7b94-11ed-96ea-000c2961cd06 | 192.168.30.102 | 13306 | ONLINE | SECONDARY | 8.0.26 |
+---------------------------+--------------------------------------+----------------+-------------+--------------+-------------+----------------+
2 rows in set (0.00 sec)
-- 模拟主节点宕掉,会自动选举新的主节点
[root@master ~]# /etc/init.d/mysqld start
db01 [(none)]>start group_replication;
db02 [(none)]>select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+----------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+----------------+-------------+--------------+-------------+----------------+
| group_replication_applier | 0a09b03e-7b95-11ed-9af8-000c29f5669f | 192.168.30.103 | 13306 | ONLINE | PRIMARY | 8.0.26 |
| group_replication_applier | f90d44f9-7b94-11ed-ab2d-000c2996c4f5 | 192.168.30.101 | 13306 | ONLINE | SECONDARY | 8.0.26 |
| group_replication_applier | fe73f0b4-7b94-11ed-96ea-000c2961cd06 | 192.168.30.102 | 13306 | ONLINE | SECONDARY | 8.0.26 |
+---------------------------+--------------------------------------+----------------+-------------+--------------+-------------+----------------+
3 rows in set (0.00 sec)
-- 立刻恢复宕机节点,恢复节点自动成为从节点
# 通过克隆功能添加新的节点
[root@master ~]# pkill mysqld
[root@master ~]# rm -rf /data/13306/*
[root@master ~]# rm -rf /data/binlog/*
[root@master ~]# \mv /etc/my.cnf /tmp
[root@master ~]# mkdir -p /data/13306/data /data/13306/binlog
[root@master ~]# chown -R mysql.mysql /data/*
-- 初始化新的节点
cat >/etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/13306/data
socket=/tmp/mysql.sock
server_id=51
port=13306
secure-file-priv=/tmp
log_bin=/data/binlog/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
skip_name_resolve
master_info_repository=TABLE
relay_log_info_repository=TABLE
report_host=192.168.30.101
report_port=13306
socket=/tmp/mysql13306.sock
default_authentication_plugin=mysql_native_password
binlog_checksum=NONE
mysqlx=off
binlog_transaction_dependency_tracking=WRITESET
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="eb8441e9-8aef-4a86-a4bc-5beea315f04f"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="192.168.30.101:33061"
loose-group_replication_group_seeds="192.168.30.101:33061,192.168.30.102:33062,192.168.30.103:33063"
loose-group_replication_bootstrap_group=OFF
[mysql]
prompt=db01 [\\d]>
EOF
-- 编写新的节点配置文件
[root@master ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/13306/data
-- 进行数据库所有节点初始化操作
[root@master ~]# /etc/init.d/mysqld start
-- 启动数据库所有节点服务
[root@master ~]# mysql -S /tmp/mysql13306.sock -e "alter user 'root'@'localhost' identified with mysql_native_password by '123';"
-- 设置本地root用户密码和密码插件(所有节点)
[root@master ~]# mysql -uroot -p123 -S /tmp/mysql13306.sock -e "install plugin group_replication SONAME 'group_replication.so';"
-- 安装部署MGR组复制功能插件(所有节点)
[root@master-03 ~]# mysql -uroot -p123 -S /tmp/mysql13306.sock -e "INSTALL PLUGIN clone SONAME 'mysql_clone.so';create user test@'%' identified by '123';grant backup_admin on *.* to 'test'@'%';"
-- 在数据库服务正常节点上,创建克隆捐赠者用户信息
[root@master ~]# mysql -uroot -p123 -S /tmp/mysql13306.sock -e "INSTALL PLUGIN clone SONAME 'mysql_clone.so';create user test1@'%' identified by '123';grant clone_admin on *.* to 'test1'@'%';set global clone_valid_donor_list='192.168.30.103:13306';"
[root@master ~]# mysql -utest1 -p123 -h192.168.30.101 -P13306 -e "clone instance from test@'192.168.30.103':13306 identified by '123';"
-- 在新添加节点上,创建克隆接收者用户信息
[root@master ~]# mysql -uroot -p123 -S /tmp/mysql13306.sock -e "select stage,state,end_time from performance_schema.clone_progress;"
-- 检查克隆是否完毕
change master to master_user='repl',master_password='123' for channel 'group_replication_recovery';
start group_replication;
-- 将新节点加入到组复制集群中
select * from performance_schema.replication_group_members;
-- 查看组复制成员状态信息
应用限制说明:
在应用MGR组复制功能时,也存在一些应用的限制条件:
- 仅支持innodb存储引擎应用组复制功能;
MGR集群中只支持innodb存储引擎,能够创建非innodb引擎的表,但是无法写入数据,向非innodb表写入数据直接报错;
- 数据表中必须有主键,或者非null的唯一键;
MGR集群中只支持innodb存储引擎,并且该表必须有显示的主键,或者非null的唯一键,否则即使能够创建表,也无法向表中写数据
- 组复制存在网络限制,MGR组通信引擎目前仅支持IPv4网络,并且对节点间的网络性能要求较高;
对于低延迟、高带宽的网络是部署MGR集群的基础;
-
组复制功能会自动忽略表锁和命名锁,在MGR中lock tables、unlock tables、get_lock、release_lock等这些表锁和命名锁将忽略
-
MGR多主模式中,默认不支持 SERIALIZABLE 隔离级别,建议使用RC隔离级别;
-
组复制多主模式中,对同一个对象进行并发是有冲突的,ddl和dml操作导致这种冲突在部分成员节点中无法检测到;
最终可能导致数据不一致
-
组复制多主模式中,不支持级联约束的外键,可能造成有冲突的操作无法检查;
-
组复制功能不支持超大事务同步;
-
组复制多主模式下可能导致死锁,比如select ... for update在不同节点执行,由于多节点锁无法共享,很容易导致死锁;
-
组复制是不支持复制过滤的,如果有节点设置了复制过滤功能,将影响节点间决议的达成;
-
组复制功能最多支持9个节点,当大于9个节点,将拒绝新节点的加入;