MGR介绍

MGR全称MySQL Group Replication(MySQL组复制),是MySQL官方于2016年12月推出的一个全新的高可用与高扩展的解决方案。MGR提供了高可用、高扩展、高可靠的MySQL集群服务。在MGR出现之前,用户常见的MySQL高可用方式,无论怎么变化架构,本质就是Master-Slave架构。MySQL 5.7版本开始支持无损半同步复制(lossless semi-syncreplication),从而进一步提示数据复制的强一致性。

MGR原理

MySQL Group Replication(MGR)搭建_数据库

MySQL Group Replication是一个MySQL插件(一组用于捕获Capture、应用Applier、生命周期LifeCycle的API,这些API控制插件与MySQL Server交互。),基于现有的MySQL复制基础并利用基于行的二进制日志以及GTID等功能。

在集群内部通过Binlog Events进行原子广播判断,检查是否有冲突。当客户端发起一个更新事务时,该事务先在本地执行,执行完成后发起对事务的提交操作,在还没有真正提交之前,需要将产生的复制写集广播出去,复制到其它成员;如果检测无冲突,组内决定该事务可以提交,其它成员可以应用,否则就回滚。

MGR搭建

考虑到稳定性,避免多主模式的风险,生产环境建议采用单主模式,下文将以单主模式的配置进行说明。

节点IP

监听端口

192.168.1.100

33061

192.168.1.101

33061

192.168.1.102

33061

配置组复制参数

binlog_checksum=NONE
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name=""
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address=192.168.1.100:33061
loose-group_replication_group_seeds=192.168.1.100:33061,192.168.1.101:33061,192.168.1.102:33061
loose-group_replication_ip_whitelist=192.168.1.100,192.168.1.101,192.168.1.102
loose-group_replication_bootstrap_group=OFF
loose-group_replication_unreachable_majority_timeout=30
loose-group_replication_member_expel_timeout=30
loose-group_replication_autorejoin_tries=5
loose-group_replication_compression_threshold=131072
loose-group_replication_transaction_size_limit=209715200

binlog_checksum:禁用二进制日志事件校验和。  

transaction_write_set_extraction:服务器对于每个事务,它必须收集写入集合,并使用 XXHASH64 散列算法将其编码为散列。  

loose-group_replication_group_name:复制组名,保证集群的唯一性,同时具备一定的可读性。  

loose-group_replication_start_on_boot:在服务器启动时不自动启动组复制。  

loose-group_replication_local_address:使用 IP 为 192.168.1.100,端口为 33061 的地址用于接受来自组中其他成员的传入连接,此地址使用本服务器生产IP(服务器在此端口监听组成员之间的连接,此端口不能用于用户的应用程序,必须保留,用于运行组复制时不同成员间的互相通信)。  

loose-group_replication_group_seeds:列出来的是种子成员,当有成员要加入此组时,会先访问这些种子成员中的一个,然后它请求组重新配置以允许它加入组。此种子成员列表建议写上一个复制组中所有成员,并且必须把主库所在地址放在最前面。  

group_replication_ip_whitelist:组通信的 IP 地址白名单,如果没有指定,则不允许外部主机的连接,所以需要把复制组中所有成员 IP 都写上。也可以写成网段的形式,如 192.168.0.0/16。  

loose-group_replication_bootstrap_group:关闭自动引导组,如果设置为自动,可能导致脑裂发生。

loose-group_replication_unreachable_majority_timeout:设置少数成员组到多数成员组的网络超时时间,如果不设置将会一直等待,其上事务会被阻塞。  

loose- group_replication_member_expel_timeout:指定组复制组成员在产生怀疑之后,从组中排除怀疑失败的成员之前等待的时间

loose-group_replication_autorejoin_tries:设置成员在超时时间前尝试重连的次数。  

loose-group_replication_compression_threshold:事务压缩的阈值(单位 byte),超过此阈值将进行压缩。  

loose-group_replication_transaction_size_limit:大事务的大小的阈值(单位 byte),超过此阈值,事务将回滚,可结合业务特性进行适当调整。

新建组复制账户

create user 'repl'@'%' identified by '<PASSWORD>';
grant replication slave on *.* to 'repl'@'%';

安装插件

install plugin clone soname 'mysql_clone.so';
install plugin group_replication soname 'group_replication.so';

安装成功后将处于ACTIVE状态,如下:

MySQL Group Replication(MGR)搭建_mysql_02

配置组复制通道

所有集群节点上均需配置该服务器恢复通道,以便下次需要从另一个成员恢复状态时使用此给定的凭证。

change master to master_user='repl', master_password='<PASSWORD>' for channel 'group_replication_recovery';

主库启动组复制

挑选一个节点(192.168.1.100)作为主节点并执行如下命令启动组复制

set global group_replication_bootstrap_group=ON;
start group_replication;
set global group_replication_bootstrap_group=OFF;

从库启动组复制

在其它节点上(192.168.1.101、192.168.1.102),依次启动组复制,如下:

start group_replication;

查看复制组状态

select * from performance_schema.replication_group_members;

MySQL Group Replication(MGR)搭建_mysql_03

注意事项

1、节点个数必须为奇数,最多9个成员;

2、网络稳定,延迟低,尽量避免WAN部署;

3、尽量使用单主模式。

4、表必须有主键且必须使用InnoDB引擎(BINLOG_FORMAT=ROW)

5、必须启用GTID;

6、不支持GAP LOCK ,MGR工作在RC模式。