概念介绍说明:

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最小的成员作为主成员。

Day009-数据库服务克隆应用、主从架构-图11

  • MGR多主模式(multi-primary mode)

在多主的模式下,没有单个主概念。无需进行节点选举,因为没有服务器扮演任何特殊角色,所有服务器均设置为读写模式。

MGR多主模式选举原理

多主模式,所有的组内成员对外提供读写服务,是真正意义上的并发,MGR对于高并发有很好的的处理能力。

多主模式下,组内所有成员没有主从之分,对用户来说,就像在操作一个MySQL一样。

所以在多主模式下,不存在选举主节点,因为所有节点都是主节点。

Day009-数据库服务克隆应用、主从架构-图12

利用MGR工作模式可以实现业务架构的读写分离需求,应用MySQL原生态的router功能即可实现,并且原生态router技术更兼容MGR;

因为,当MGR中主节点出现异常下线后,会选举出现的主节点,原生态router技术可以自动识别新的主节点,做读写分离的写库;

将MySQL MGR + MySQL Router + MySQL Shell = InnoDB Cluster

Day009-数据库服务克隆应用、主从架构-图13

官方扩展学习资料链接: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、最终,所有组内成员以相同的顺序接收同一组事务;

因此,组内成员以相同的顺序应用相同的修改,保证组内数据强一致性(采用了分布式事务特性)

Day009-数据库服务克隆应用、主从架构-图14

功能应用实践:

① 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个节点,将拒绝新节点的加入;