1. 项目背景与核心价值
在混合架构的服务器环境中同时部署MySQL集群一直是个头疼的问题。去年我在某金融科技项目上就遇到过这样的场景:客户的生产环境同时存在ARM64架构的国产服务器和X86_64的传统服务器,需要部署高可用的MySQL集群。经过多次尝试,最终通过Docker容器化方案完美解决了这个异构环境部署难题。
这种方案的核心价值在于:
- 真正实现了一次编写,多架构运行(ARM64+X86_64)
- 完整的离线部署能力,适合金融、政务等隔离环境
- 基于InnoDB ClusterSet的读写分离自动管理
- 通过docker-compose实现一键式部署
提示:本文方案已在银河麒麟V10(ARM64)和CentOS 7.9(X86_64)上实测通过,MySQL版本为8.0.43
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与离线资源获取
2.1 架构适配原理
MySQL官方容器镜像从8.0版本开始支持多平台构建。通过docker pull mysql:8.0.43命令实际上会拉取manifest列表,根据宿主机架构自动选择对应的镜像层。这是实现跨架构部署的基础。
验证架构兼容性:
bash复制# 查看镜像支持的架构
docker manifest inspect mysql:8.0.43 | grep architecture
2.2 离线资源包制作
对于无法联网的环境,需要提前准备以下资源(以X86_64为例):
- 下载基础镜像:
bash复制docker pull mysql:8.0.43
docker pull mysql/mysql-router:8.0
docker pull mysql/mysql-shell:8.0
- 保存镜像包:
bash复制docker save -o mysql-8.0.43.tar mysql:8.0.43
docker save -o mysql-router-8.0.tar mysql/mysql-router:8.0
docker save -o mysql-shell-8.0.tar mysql/mysql-shell:8.0
- 准备依赖工具包:
- docker-compose-Linux-x86_64(或aarch64)
- MySQL Shell离线安装包
- 对应的glibc依赖库
3. 集群架构设计与配置
3.1 InnoDB ClusterSet拓扑
本方案采用三级架构:
code复制ClusterSet (读写分离)
├── Primary Cluster (3节点Group Replication)
│ ├── mysql-1:3306 (PRIMARY)
│ ├── mysql-2:3306 (SECONDARY)
│ └── mysql-3:3306 (SECONDARY)
└── Replica Cluster (2节点Group Replication)
├── mysql-replica-1:3306 (SECONDARY)
└── mysql-replica-2:3306 (SECONDARY)
3.2 docker-compose核心配置
关键配置示例(以Primary节点为例):
yaml复制services:
mysql1:
image: mysql:8.0.43
platform: linux/amd64 # 或arm64
environment:
MYSQL_ROOT_PASSWORD: "SecurePass123!"
MYSQL_ROOT_HOST: "%"
GROUP_REPLICATION_GROUP_SEEDS: "mysql1:33061,mysql2:33061,mysql3:33061"
GROUP_REPLICATION_LOCAL_ADDRESS: "mysql1:33061"
volumes:
- ./conf/my.cnf:/etc/mysql/my.cnf
- ./data:/var/lib/mysql
networks:
- mysql_net
3.3 关键参数说明
| 参数 | 作用 | 推荐值 |
|---|---|---|
| loose-group_replication_start_on_boot | 启动时自动加入组复制 | ON |
| loose-group_replication_consistency | 一致性级别 | EVENTUAL |
| loose-group_replication_flow_control_mode | 流控模式 | DISABLED |
| transaction_write_set_extraction | 写集提取算法 | XXHASH64 |
4. 集群初始化实战步骤
4.1 节点引导流程
- 启动第一个节点(引导节点):
bash复制docker-compose up -d mysql1
- 执行初始化脚本:
mysql复制# 在mysql-shell中执行
dba.configureInstance('root@mysql1:3306', {
clusterAdmin: 'gradmin',
clusterAdminPassword: 'GrPass123!',
restart: true
})
- 创建集群:
javascript复制var cluster = dba.createCluster('prodCluster', {
memberWeight: 60,
consistency: 'EVENTUAL'
});
4.2 节点扩展技巧
添加第二个节点时的关键操作:
javascript复制cluster.addInstance('root@mysql2:3306', {
recoveryMethod: 'clone',
memberWeight: 30
});
注意:ARM64环境下建议设置
recoveryMethod: 'incremental'以避免克隆兼容性问题
5. 读写分离配置优化
5.1 MySQL Router配置
router的docker-compose配置示例:
yaml复制services:
router:
image: mysql/mysql-router:8.0
depends_on:
- mysql1
- mysql2
- mysql3
command: [
"--bootstrap", "gradmin@mysql1:3306",
"--directory", "/tmp/router",
"--conf-use-sockets",
"--conf-bind-address=0.0.0.0"
]
ports:
- "6446:6446" # RW端口
- "6447:6447" # RO端口
5.2 负载均衡策略
在router的配置文件中添加:
ini复制[routing:read_write]
bind_address=0.0.0.0
bind_port=6446
destinations=metadata-cache://prodCluster/default?role=PRIMARY
routing_strategy=first-available
[routing:read_only]
bind_address=0.0.0.0
bind_port=6447
destinations=metadata-cache://prodCluster/default?role=SECONDARY
routing_strategy=round-robin
6. 运维监控与故障处理
6.1 集群状态检查
常用监控命令:
mysql复制# 查看集群状态
cluster.status()
# 检查Group Replication
SELECT * FROM performance_schema.replication_group_members;
# 检查同步延迟
SHOW REPLICA STATUS;
6.2 常见问题处理
- 脑裂问题处理:
javascript复制// 强制重新配置集群
cluster.forceQuorumUsingPartitionOf('root@mysql1:3306');
- 节点恢复流程:
bash复制# 先停止问题节点
docker-compose stop mysql2
# 清理数据目录
rm -rf ./data/mysql2/*
# 重新加入集群
docker-compose up -d mysql2
7. 性能调优实战经验
7.1 ARM64架构特别优化
在麒麟ARM64环境中需要调整的参数:
ini复制[mysqld]
innodb_buffer_pool_chunk_size=64M
innodb_flush_neighbors=0
skip_name_resolve=ON
7.2 网络优化建议
对于跨机房的部署:
yaml复制# 在docker-compose中增加
services:
mysql1:
sysctls:
- net.core.somaxconn=65535
- net.ipv4.tcp_max_syn_backlog=8192
ulimits:
nofile:
soft: 65536
hard: 65536
8. 安全加固措施
8.1 最小权限配置
创建应用账号示例:
mysql复制CREATE USER 'appuser'@'%' IDENTIFIED BY 'ComplexPwd123!';
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'appuser'@'%';
8.2 加密通信配置
在my.cnf中添加:
ini复制[mysqld]
require_secure_transport=ON
ssl_ca=/var/lib/mysql/ca.pem
ssl_cert=/var/lib/mysql/server-cert.pem
ssl_key=/var/lib/mysql/server-key.pem
9. 备份恢复方案
9.1 热备份策略
使用MySQL Shell的备份API:
javascript复制util.dumpInstance('/backup/full', {
threads: 4,
compression: 'zstd',
ocimds: true
});
9.2 快速恢复技巧
从备份恢复单个数据库:
bash复制mysqlsh -- util loadDump /backup/full \
--includeSchemas=appdb \
--resetProgress
10. 架构扩展思路
当需要扩展读能力时,可以:
- 添加新的Replica Cluster
javascript复制clusterSet.addReplicaCluster('replicaCluster2', {
recoveryMethod: 'auto',
memberWeight: 20
});
- 水平分片方案
- 使用MySQL Router的sharding功能
- 配合应用层分片策略
我在实际部署中发现,ARM64架构的节点在纯读负载下性能可达X86_64的85%,但写性能差异较大。建议在混合架构部署时,将Primary节点部署在X86_64服务器上,读节点可以混部。另外,docker-compose的版本最好保持一致,推荐使用2.17.0以上版本以避免编排兼容性问题。
