一、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=2server_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应用来说,建议:

  1. 生产环境:使用InnoDB Cluster,至少3节点

  2. 测试/开发环境:可使用InnoDB ReplicaSet

  3. 结合Spring Boot:通过配置多数据源或使用中间件实现读写分离

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐