MySQL 8.0高可用集群架构实战详解:InnoDB Cluster与ReplicaSet搭建指南
一、MySQL高可用架构概述
在分布式系统中,数据库的高可用性是保障业务连续性的关键。MySQL 8.0 官方提供了两种高可用方案:
1. InnoDB Cluster
-
核心组件:
-
MySQL Group Replication(MGR):基于Paxos协议的多主同步复制,支持自动故障转移。
-
MySQL Shell:集群管理工具,支持JavaScript和Python操作。
-
MySQL Router:轻量级中间件,实现读写分离和流量路由。
-
-
适用场景:需要强一致性、高可用、自动故障转移的场景。
2. InnoDB ReplicaSet
-
基于传统的异步主从复制。
-
不支持自动故障转移,需手动切换。
-
适用于读扩展、数据备份等场景。
二、搭建一主两从InnoDB Cluster(实战步骤)
1. 环境准备与实例部署
使用Docker快速部署三个MySQL 8.0实例:
# 创建MGR专用网络
docker network create --subnet=172.19.0.0/24 mgr-network
# 创建数据、配置、日志目录
mkdir -p /mysql/mgr/node{1..3}/{data,conf,log}
2. 配置MySQL实例
每个节点需配置custom.cnf,以下是节点1的示例:
[mysqld] server_id=1 gtid_mode=ON enforce_gtid_consistency=ON log-bin=mysql-bin binlog_format=ROW disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY" binlog_transaction_dependency_tracking=WRITESET replica_preserve_commit_order=ON replica_parallel_type=LOGICAL_CLOCK transaction_write_set_extraction=XXHASH64
注意:节点2和节点3需分别设置
server_id=2和server_id=3。
3. 启动容器
docker run -d \
--name mgr-node1 \
--ip 172.19.0.10 \
--network mgr-network \
-p 3321:3306 \
-v /mysql/mgr/node1/data:/var/lib/mysql \
-v /mysql/mgr/node1/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0.27
其余两个节点类似,注意IP和端口映射。
4. 安装MySQL Shell与Router
# 安装MySQL Shell
wget https://downloads.mysql.com/archives/get/p/43/file/mysql-shell-8.0.27-1.el7.x86_64.rpm
rpm -ivh mysql-shell-8.0.27-1.el7.x86_64.rpm
# 安装MySQL Router
wget https://downloads.mysql.com/archives/get/p/41/file/mysql-router-community-8.0.27-1.el7.x86_64.rpm
rpm -ivh mysql-router-community-8.0.27-1.el7.x86_64.rpm
5. 集群初始化与配置
// 连接到主节点
mysqlsh root@mgr-node1:3306 --js
// 检查实例配置
dba.checkInstanceConfiguration('root@mgr-node1:3306')
// 配置实例
dba.configureInstance('root@mgr-node1:3306')
// 创建集群
var cluster = dba.createCluster('myCluster')
// 添加从节点
cluster.addInstance('root@mgr-node2:3306')
cluster.addInstance('root@mgr-node3:3306')
// 查看集群状态
cluster.status()
6. 配置MySQL Router实现读写分离
mysqlrouter --bootstrap root@mgr-node1:3306 --force --user=root
systemctl start mysqlrouter
Router启动后,会提供:
-
读写端口:6446(经典协议)、6448(X协议)
-
只读端口:6447(经典协议)、6449(X协议)
三、集群管理与故障恢复
1. 节点状态说明
-
ONLINE:正常运行 -
RECOVERING:数据同步中 -
ERROR:同步异常 -
UNREACHABLE:网络不可达 -
MISSING:节点未启动组复制
2. 主从切换测试
# 停止主节点
docker stop mgr-node1
# 连接到新主节点查看状态
mysqlsh root@mgr-node2:3306 --js
var cluster = dba.getCluster()
cluster.status()
3. 权重配置与故障转移优先级
// 设置节点权重(越高越优先成为主节点)
cluster.setInstanceOption('mgr-node1:3306', 'memberWeight', 100)
cluster.setInstanceOption('mgr-node2:3306', 'memberWeight', 50)
4. 集群模式切换
// 切换到多主模式
cluster.switchToMultiPrimaryMode()
// 切换回单主模式
cluster.switchToSinglePrimaryMode('mgr-node1:3306')
四、InnoDB ReplicaSet搭建(一主一从)
1. 部署两个MySQL实例
docker network create --subnet=172.20.0.0/24 rs-network
2. 配置复制集
// 创建复制集
var rs = dba.createReplicaSet("myrs")
// 添加从节点
rs.addInstance('root@rs-node2:3306')
3. 限制说明
-
无自动故障转移
-
数据一致性弱于MGR
-
适用于读扩展场景
五、Java应用连接建议
1. 使用MySQL Connector/J连接Router
# application.properties spring.datasource.url=jdbc:mysql://localhost:6446/test?useSSL=true spring.datasource.username=root spring.datasource.password=123456
2. 读写分离配置(建议使用ShardingSphere或MyCat)
# 使用ShardingSphere配置读写分离 spring.shardingsphere.datasource.names=master,slave1,slave2 spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.type=Static spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.props.write-data-source-name=master spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.props.read-data-source-names=slave1,slave2
六、常见问题与注意事项
1. 表必须有主键
-- 无主键表会报错 CREATE TABLE t (id INT, name VARCHAR(20)); -- 错误 CREATE TABLE t (id INT PRIMARY KEY, name VARCHAR(20)); -- 正确
2. GTID不一致处理
添加节点时若出现GTID不一致,可选择Clone方式同步数据。
3. 网络要求
-
节点间网络延迟建议<1s
-
建议使用专用网络或VLAN
4. 监控建议
-
使用
performance_schema.replication_group_members监控节点状态 -
使用
cluster.status()定期检查集群健康度
七、总结
MySQL 8.0的InnoDB Cluster为Java应用提供了开箱即用的高可用数据库解决方案。通过MGR实现数据强一致性,通过MySQL Router实现无感知读写分离,极大地提升了系统的可用性和扩展性。
对于大多数Java应用来说,建议:
-
生产环境:使用InnoDB Cluster,至少3节点
-
测试/开发环境:可使用InnoDB ReplicaSet
-
结合Spring Boot:通过配置多数据源或使用中间件实现读写分离
更多推荐



所有评论(0)