MySQL InnoDB Cluster(Group Replication)搭建
症状
目标:使用 InnoDB Cluster(Group Replication + MySQL Shell + MySQL Router)为 MySQL 搭建具备自动故障转移的高可用。
1. 满足前提条件
InnoDB Cluster 要求每个节点使用 MySQL 8.0+、唯一的 server_id、GTID 模式和 InnoDB 存储引擎。所有实例之间必须网络互通,且表必须有主键。准备一个用于管理的 clusterAdmin 用户。
MySQL
-- my.cnf on each instance:
-- server_id unique, gtid_mode=ON, enforce_gtid_consistency=ON
CREATE USER 'icadmin'@'%' IDENTIFIED BY 'secret';
GRANT ALL PRIVILEGES ON *.* TO 'icadmin'@'%' WITH GRANT OPTION;2. 用 MySQL Shell 配置每个实例
在 mysqlsh 中,dba.configureInstance() 使每个节点满足 Group Replication 的要求;它会修正缺失的参数,并在需要时要求重启。在所有节点上重复执行。
MySQL
-- mysqlsh:
dba.configureInstance('icadmin@node1:3306')
dba.configureInstance('icadmin@node2:3306')
dba.configureInstance('icadmin@node3:3306')3. 创建集群(种子节点)
连接到一个节点,用 dba.createCluster() 启动集群;该节点成为第一个主节点。返回的 cluster 对象用于后续添加节点。
MySQL
-- mysqlsh, while connected to node1:
var cluster = dba.createCluster('appCluster')4. 将其他实例加入集群
用 cluster.addInstance() 添加从节点。recoveryMethod 可选择 clone(物理克隆,对新节点速度快)或 incremental(基于 GTID)。至少 3 个节点才能形成奇数多数派并实现自动故障转移。
MySQL
-- mysqlsh:
cluster.addInstance('icadmin@node2:3306', {recoveryMethod: 'clone'})
cluster.addInstance('icadmin@node3:3306', {recoveryMethod: 'clone'})5. 引导(bootstrap)MySQL Router
MySQL Router 在应用与集群之间进行路由;它提供读写(6446)和只读(6447)端口,并在主节点变更时自动重定向流量。bootstrap 会根据集群元数据生成配置。
MySQL
mysqlrouter --bootstrap icadmin@node1:3306 --user=mysqlrouter --directory /etc/mysqlrouter
# Then: mysqlrouter -c /etc/mysqlrouter/mysqlrouter.conf &6. 检查集群状态并验证故障转移
cluster.status() 显示每个节点的角色(R/W 主节点、R/O 从节点)和状态(ONLINE)。clusterName 和拓扑应处于健康状态。通过关闭主节点并观察自动选出新主节点来测试故障转移。
MySQL
-- mysqlsh:
var cluster = dba.getCluster('appCluster')
cluster.status()
-- Members via SQL:
SELECT member_host, member_role, member_state FROM performance_schema.replication_group_members;