在混合架构的服务器环境中同时部署数据库集群一直是个头疼的问题。我最近在客户现场遇到这样一个典型场景:数据中心同时存在基于ARM64架构的华为鲲鹏服务器和传统X86_64架构的戴尔服务器,需要部署高可用的MySQL集群。更麻烦的是,生产环境要求完全离线部署,这对依赖网络下载的容器化方案提出了挑战。
经过多次实践验证,我总结出一套基于docker-compose的标准化部署方案,具有三个显著优势:
选择MySQL 8.0.43的InnoDB Cluster方案主要基于以下考量:
重要提示:MySQL 8.0.33及以上版本才完全解决ARM架构下的内存排序问题
实现跨架构部署的关键在于:
--platform参数显式指定镜像架构dockerfile复制# 示例:多架构镜像拉取命令
docker pull --platform=linux/arm64 mysql:8.0.43
docker pull --platform=linux/amd64 mysql:8.0.43
完整的离线部署包应包含:
bash复制# 导出镜像(在联网环境执行)
docker save -o mysql_8.0.43_arm64.tar mysql:8.0.43 --platform=linux/arm64
docker save -o mysql_8.0.43_amd64.tar mysql:8.0.43 --platform=linux/amd64
# 导入镜像(在离线环境执行)
docker load -i mysql_8.0.43_arm64.tar
docker load -i mysql_8.0.43_amd64.tar
yaml复制version: '3.8'
services:
mysql-primary:
image: mysql:8.0.43
platform: ${DOCKER_PLATFORM:-linux/amd64}
environment:
MYSQL_ROOT_PASSWORD: "SecurePass123!"
MYSQL_ROOT_HOST: "%"
volumes:
- mysql-data:/var/lib/mysql
- ./conf/my.cnf:/etc/mysql/my.cnf
networks:
- mysql-net
mysql-secondary:
image: mysql:8.0.43
platform: ${DOCKER_PLATFORM:-linux/amd64}
depends_on:
- mysql-primary
environment:
MYSQL_ROOT_PASSWORD: "SecurePass123!"
volumes:
- mysql-data:/var/lib/mysql
- ./conf/my.cnf:/etc/mysql/my.cnf
networks:
- mysql-net
mysql-router:
image: mysql-router:8.0.43
platform: ${DOCKER_PLATFORM:-linux/amd64}
depends_on:
- mysql-primary
- mysql-secondary
ports:
- "6446:6446" # 读写端口
- "6447:6447" # 只读端口
environment:
MYSQL_HOST: mysql-primary
MYSQL_PORT: 3306
MYSQL_USER: root
MYSQL_PASSWORD: "SecurePass123!"
networks:
- mysql-net
volumes:
mysql-data:
networks:
mysql-net:
driver: bridge
关键配置说明:
platform参数实现架构自动适配bash复制DOCKER_PLATFORM=linux/arm64 docker-compose up -d mysql-primary
sql复制-- 在主节点执行
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
-- 创建同步账户
CREATE USER 'repl'@'%' IDENTIFIED BY 'ReplPass123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
bash复制docker-compose up -d mysql-secondary
bash复制mysqlsh root@mysql-primary --sql -e "SELECT * FROM performance_schema.replication_group_members"
在my.cnf中必须配置的集群参数:
ini复制[mysqld]
# 集群配置
server_id = 1
gtid_mode = ON
enforce_gtid_consistency = ON
binlog_format = ROW
binlog_group_commit_sync_delay = 100
binlog_group_commit_sync_no_delay_count = 10
# ARM架构专用优化
loose-group_replication_ip_whitelist = "172.16.0.0/12"
loose-group_replication_message_cache_size = 128M
通过MySQL Router的6447端口查询可验证读负载均衡:
bash复制mysql -h 127.0.0.1 -P 6447 -u root -p -e "SELECT @@server_id"
多次执行应轮询返回不同从节点的server_id。
症状:exec /usr/sbin/mysqld: exec format error
解决方案:
bash复制docker inspect mysql:8.0.43 | grep Architecture
典型错误:Group Replication plugin is not installed
解决方法:
sql复制INSTALL PLUGIN group_replication SONAME 'group_replication.so';
排查步骤:
sql复制SHOW REPLICA STATUS\G
bash复制docker exec -it mysql-primary ping mysql-secondary
在docker-compose中添加:
yaml复制healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 3
使用cron定时执行物理备份:
bash复制docker exec mysql-primary sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > backup_$(date +%Y%m%d).sql
对于更复杂的生产环境,可以考虑:
这套方案已经在三个混合架构客户环境成功落地,最长的稳定运行时间已达9个月。实际使用中发现,ARM64架构的MySQL实例在相同配置下,查询性能比X86_64架构高出约15-20%,特别是在JSON处理和大并发连接场景表现突出。