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是一个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状态,如下:
配置组复制通道
所有集群节点上均需配置该服务器恢复通道,以便下次需要从另一个成员恢复状态时使用此给定的凭证。
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;
注意事项
1、节点个数必须为奇数,最多9个成员;
2、网络稳定,延迟低,尽量避免WAN部署;
3、尽量使用单主模式。
4、表必须有主键且必须使用InnoDB引擎(BINLOG_FORMAT=ROW)
5、必须启用GTID;
6、不支持GAP LOCK ,MGR工作在RC模式。