6.6.6 MGR与InnoDB Cluster概述
MGR(MySQL Group Replication)是基于组通信的原生高可用方案,提供单主或多主复制、自动成员管理与一致性保障;InnoDB Cluster在MGR基础上结合MySQL Shell与Router,形成一体化的部署、运维与访问入口方案。其核心思路是:事务在成员间有序广播、冲突检测与一致性控制,保证组内视图一致。
核心组件:
- Group Replication 插件:负责组复制与一致性。
- MySQL Shell:集群管理与自动化。
- MySQL Router:对外访问入口与读写路由。
安装与基础配置示例(3 节点单主模式)#
示例环境:
node1: 10.0.0.11,node2: 10.0.0.12,node3: 10.0.0.13
1) 安装 MySQL 8(各节点)
# RHEL/CentOS
yum install -y https://repo.mysql.com/mysql80-community-release-el7-7.noarch.rpm
yum install -y mysql-community-server
systemctl enable mysqld
systemctl start mysqld
2) 配置 my.cnf(各节点,/etc/my.cnf)
[mysqld]
server_id=11 # node2为12,node3为13
report_host=10.0.0.11 # node2为10.0.0.12,node3为10.0.0.13
gtid_mode=ON
enforce_gtid_consistency=ON
log_bin=binlog
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
plugin_load_add=group_replication.so
group_replication_group_name="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
group_replication_start_on_boot=OFF
group_replication_local_address="10.0.0.11:33061"
group_replication_group_seeds="10.0.0.11:33061,10.0.0.12:33061,10.0.0.13:33061"
group_replication_bootstrap_group=OFF
group_replication_single_primary_mode=ON
group_replication_enforce_update_everywhere_checks=OFF
3) 初始化账号与权限(node1 执行)
-- 登录
mysql -uroot -p
-- 创建复制用户
CREATE USER 'repl'@'%' IDENTIFIED BY 'Repl@123';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
GRANT BACKUP_ADMIN, GROUP_REPLICATION_ADMIN ON *.* TO 'repl'@'%';
4) 启用 MGR(node1 首先引导)
-- node1
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='Repl@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;
5) 其他节点加入(node2、node3)
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='Repl@123' FOR CHANNEL 'group_replication_recovery';
START GROUP_REPLICATION;
SELECT * FROM performance_schema.replication_group_members;
6) InnoDB Cluster 与 Router(可选,建议使用 MySQL Shell)
# 安装 MySQL Shell 与 Router
yum install -y mysql-shell mysql-router
# 使用 Shell 创建集群
mysqlsh --uri root@10.0.0.11
// MySQL Shell
var cluster = dba.createCluster('prodCluster');
cluster.addInstance('root@10.0.0.12');
cluster.addInstance('root@10.0.0.13');
cluster.status();
Router 初始化(部署在应用服务器)
mysqlrouter --bootstrap root@10.0.0.11:3306 --directory /etc/mysqlrouter --user=mysqlrouter
systemctl enable mysqlrouter
systemctl start mysqlrouter
# Router 监听端口示例
ss -lntp | grep mysqlrouter
关键命令与状态检查#
- 查看组成员
SELECT MEMBER_ID, MEMBER_HOST, MEMBER_STATE, MEMBER_ROLE
FROM performance_schema.replication_group_members;
- 查看复制状态
SELECT CHANNEL_NAME, SERVICE_STATE, LAST_ERROR_MESSAGE
FROM performance_schema.replication_connection_status
WHERE CHANNEL_NAME='group_replication_recovery';
- 查看当前主库(单主模式)
SELECT MEMBER_ID, MEMBER_HOST
FROM performance_schema.replication_group_members
WHERE MEMBER_ROLE='PRIMARY';
常见排错清单#
1) 节点无法加入(STATE=OFFLINE)
- 检查端口 33061 是否可达
# 在 node2 上测试 node1
nc -vz 10.0.0.11 33061
- 检查 group_replication_group_seeds 是否配置一致
2) 报错 "This server is not configured properly to be an active member"
- 确认 gtid_mode=ON、binlog_format=ROW
SHOW VARIABLES LIKE 'gtid_mode';
SHOW VARIABLES LIKE 'binlog_format';
3) 认证失败
- 检查 repl 用户密码
SELECT user, host FROM mysql.user WHERE user='repl';
4) Router 连接失败
- 检查 Router 配置路径与监听端口
cat /etc/mysqlrouter/mysqlrouter.conf | grep -E 'bind_address|port'
一致性与写入策略示例#
- 强一致读(避免读到旧数据)
SET SESSION group_replication_consistency='BEFORE';
-- 执行业务读写
- 单主模式写入(推荐)
-- 在 PRIMARY 上写入
INSERT INTO t_order(id, amount) VALUES(1001, 88.8);
练习#
1) 三节点搭建单主 MGR,模拟故障切换
- 停止 primary 节点 mysqld,观察成员角色变化与 Router 路由。
2) 切换多主模式
- 修改 group_replication_single_primary_mode=OFF,测试并发写冲突。
3) 验证一致性模式
- 分别设置 AFTER 与 BEFORE,比较读到数据的时延差异。
4) 练习排错
- 故意关闭 33061 端口,观察加入失败的错误信息并修复。