MySQL Group Replication(一)部署篇
MGR 简介
Group Replication 是 MySQL 在 2016 年 12 月以 GA 的形式发布,以插件的形式绑定在 MySQL 服务器上。
传统的 MySQL 复制功能是异步复制,而 MGR 实现了完全同步复制。因此,MGR 可以为用户提供更强的数据一致性。而且支持多点写入模式,可自动处理数据冲突。MGR 远远超出 MySQL 传统复制功能的限制,允许用户获得更高级别的可用性,是高可用数据库解决方案中的一个重要组件。
1. 部署要求
1.1 网络性能
网络的延迟与带宽会影响组复制的性能和稳定性。全部组成员之间必须始终保持双向通信。条件允许的情况下,用户可以配置双网卡及高质量的交换机,并尽可能使用高速网络。
1.2 存储引擎
为了保证组范围内的数据一致性,当成员出现冲突时,需要将一些事务回滚,组复制仅支持 innodb 事务引擎。
1.3 主键限制
组复制要求每张表必须有一个已定义的主键,主键是表中的唯一标识,使 MySQL 可以准确识别每个事务修改了那些行,以确定哪些事务发生冲突。
1.4 唯一 ID
组复制需要为每个组成员配置一个唯一 ID,用户可以使用 server_id 参数来设置。
设置规范:
-- 例如: 172.16.104.32
32 + 3306 (MySQL 端口号)= 323306
1.5 二进制日志
必须开启 mysql binlog 日志,且日志格式必须为 row 模式。
log_bin = ON binlog_format = ROW
1.6 副本更新日志
加入组时,组成员需要记录从数据提供者那里接收的事务,并对其进行应用,还需要记录他们从组接收并应用的全部事务,组复制通过该方式进行分布式恢复。
log_slave_updates = ON
1.7 GTID 模式
组复制需要基于 GTID 复制,它使用全局事务标识来跟踪已提交到组中的每台服务器实例上的事务。
gtid_mode = ON enforce_gtid_consistency = ON
2. 部署 MGR
部署前需要关闭防火墙,以及系统 HOSTS 配置。
IP 地址 | 系统版本 | honstname |
172.16.104.57 | CentOS Linux release 7.8.2003 (Core) | 172-16-104-57 |
172.16.104.56 | CentOS Linux release 7.8.2003 (Core) | 172-16-104-56 |
172.16.104.56 | CentOS Linux release 7.8.2003 (Core) | 172-16-104-55 |
2.1. 下载安装包
下载地址如下,无特殊要求的话,下载官方最新 GA 版即可。
2.2. 安装 MySQL
安装部署 MySQL 步骤在此省略,可在官网内搜索单机部署的文章。
2.3. MGR 参数
下方是 MGR 相关的参数配置:
# MGR 插件 plugin_load_add='group_replication.so' # 集群唯一标识,可使用 select uuid(); group_replication_group_name="a640da45-e4d1-11ed-a959-fa0e3cc40b00" # 是否自动启动组复制,部署阶段设置为 OFF group_replication_start_on_boot=off # 当前实例的地址,用于提供给其它成员,用于 XCom 引擎通信 group_replication_local_address='172.16.104.57:33061' # 组复制种子成员地址,用于与其它成员通信 group_replication_group_seeds='172.16.104.57:33061,172.16.104.56:33061,172.16.104.55:33061' # replicationgroup_replication_bootstrap_group=off
需要注意 group_replication_local_address 官方推荐的端口是 33061 该端口不被应用于响应用户请求,用于组复制内部通信,及 XCom 引擎通信使用。
参数 group_replication_group_seeds 是组复制成员列表,配置规则为 IP:端口 端口是 XCom 引擎通信端口。
按照环境修改完成参数后,需要重启 MySQL 实例,使用下方 SQL 可查询 MGR 插件是否正常运行。
select * from PLUGINS where PLUGIN_NAME = 'group_replication'\G
2.4. 创建分布式用户
组复制需要使用一个用户执行分布式恢复,分布式恢复用于将组当前数据通过 group_replication_recovery 通道对新加入组的成员进行数据同步。创建用户的操作在主库执行即可,如果想要每个实例都有不同的分布式用户,创建前可以关闭 Binlog 写入。
CREATE USER rpl_user@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%'; GRANT CONNECTION_ADMIN ON *.* TO rpl_user@'%'; GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%'; GRANT GROUP_REPLICATION_STREAM ON *.* TO rpl_user@'%'; FLUSH PRIVILEGES;
2.5. 引导启动
当主库配置完成后,就可以启动组复制,初次启动组复制的操作叫引导启动,需要使用下方系统变量,而且该变量只能在一个组成员上启用,如果在多台组成员上启用,则会产生多个同名称的组,形成 “脑裂” 现象。
引导启动只能由单个实例完成,且只能执行一次。
select @@group_replication_bootstrap_group;
执行引导 SQL:
SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF;
当 Start 命令执行成功后,表明组已创建,可通过下方 SQL 查询组信息,现在组初次创建,只有一名成员。
SELECT * FROM performance_schema.replication_group_members; *************************** 1. row *************************** CHANNEL_NAME: group_replication_applier MEMBER_ID: 9590bf9c-c302-11ed-8d53-faa7cd9c6a00 MEMBER_HOST: 172-16-104-57 MEMBER_PORT: 3306 MEMBER_STATE: ONLINE MEMBER_ROLE: PRIMARY MEMBER_VERSION: 8.0.32 MEMBER_COMMUNICATION_STACK: XCom
2.6. 向组添加成员
配置通道:
CHANGE REPLICATION SOURCE TO SOURCE_USER = 'rpl_user', SOURCE_PASSWORD = 'password' FOR CHANNEL 'group_replication_recovery';
启动组复制:
START GROUP_REPLICATION;
如果启动失败,错误日志中有下方异常,执行 reset master 后重试即可。
[ERROR] [MY-011522] [Repl] Plugin group_replication reported: 'The member contains transactions not present in the group. The member will now exit the group.'
查询组内成员信息:
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK | +---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+ | group_replication_applier | 9590bf9c-c302-11ed-8d53-faa7cd9c6a00 | 172-16-104-57 | 3306 | ONLINE | PRIMARY | 8.0.32 | XCom | | group_replication_applier | eccc6b43-b0fc-11ed-8e74-fa0e3cc40b00 | 172-16-104-56 | 3306 | ONLINE | SECONDARY | 8.0.32 | XCom | +---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
此时可以看到组内有两个成员,主要成员和次要成员 PRIMARY 和 SECONDARY。
重复上方操作,将第三个成员也加入到组内。
2.7. 验证复制
create database test; use test; create table rep_test( id bigint auto_increment primary key , cname varchar(10) ); insert into rep_test(cname) values ('a'),('b'),('c');
3. 后记
安装过程中,可能会遇到各种报错,不过错误日志中的提醒非常详细,错误日志 + 官方文档可以解决 90% 的问题。建议搭建过程中 tail -f error.log 实时关注错误日志。