一套面向生产环境的 MySQL InnoDB Cluster 自动化部署与运维方案:基于 Ansible 集成 MySQL Router、HAProxy、Keepalived、扩缩容流程与可选逻辑备份,默认针对 8核32G MySQL + 4核8G Router 场景优化。
当前主线:
- 默认以 MySQL 8.4 LTS 为主
- 同时兼容 MySQL 8.0.x
- 备份模式可按版本选择逻辑备份或 XtraBackup 物理备份
- 支持 单端口自动读写分离,提供更简洁的应用接入模型
如果你想从零搭一套 可维护、可扩展、可继续自动化演进 的 MySQL 高可用主线,而不是只拼出一套一次性脚本,这个仓库就是为此准备的。
- 想用 Ansible 自动化部署 MySQL InnoDB Cluster 的团队
- 需要 MySQL Router + HAProxy + Keepalived 组成稳定接入层的团队
- 需要后续持续支持扩容、缩容、配置升级、可选备份的团队
- 希望把仓库维护成“长期可演进生产主线”的个人或组织
- 一条统一的生产主线,而不是多套脚本并存
- 单一主配置模型,便于长期维护和 AI / 人协作
- 覆盖部署、扩容、缩容、滚动配置应用、可选逻辑 / 物理备份的自动化能力
- 可直接接入 GitHub Actions 的静态质量验证
- ✅ 基于行业最佳实践 - Oracle MySQL、Percona、MariaDB官方推荐
- ✅ 智能连接管理 - 前端60K连接,后端7.5K连接,保守复用比设计
- ✅ 生产安全余量 - 默认 2500 连接/MySQL 节点,预留 2-4GB 峰值缓冲
- ✅ 生产级高可用 - 自动故障转移,99.9%+可用性
- ✅ 自动读写分离 - 新增单端口接入模型,兼容现有显式 RW / RO 模型
- ✅ 稳定内核优化 - 动态参数调整,保守且通用的企业级配置
- ✅ 一键部署 - Ansible自动化,企业级运维体验
| 组件 | 规格 | 连接数 | 内存使用 | 优化策略 |
|---|---|---|---|---|
| MySQL集群 | 3×8核32G | 2500/节点 | 保留安全余量 | ✅ 生产默认 |
| Router集群 | 2×4核8G | 30000/台 | 6GB/台 | ✅ 高效路由 |
| 内核优化 | 全服务器 | 动态调整 | 平衡配置 | ✅ 行业最佳实践 |
| 总体能力 | 5台服务器 | 60K前端+7.5K后端 | - | ✅ 企业级 |
当前仓库已经支持 单端口自动读写分离,同时保留传统的强制读写 / 强制只读入口:
- 3309:HAProxy VIP 自动读写分离,推荐给大部分应用默认接入
- 3307:HAProxy VIP 强制读写
- 3308:HAProxy VIP 强制只读
- 6450:Router 直连自动读写分离
- 6446:Router 直连强制读写
- 6447:Router 直连强制只读
如果你的 Java 服务不希望拆成两套读写数据源,优先评估接入 3309。
| 端口 | 所在层 | 类型 | 说明 | 推荐对象 |
|---|---|---|---|---|
3309 |
HAProxy VIP | 自动读写分离 | 单端口自动分流 | 大多数应用默认入口 |
3307 |
HAProxy VIP | 强制读写 | 始终走主节点 | DDL、批处理、强一致写入 |
3308 |
HAProxy VIP | 强制只读 | 始终走只读副本 | 报表、查询服务、只读任务 |
6450 |
Router 直连 | 自动读写分离 | 不经 HAProxy 的单端口自动分流 | 测试、绕过 VIP 的接入 |
6446 |
Router 直连 | 强制读写 | 不经 HAProxy 的主节点入口 | 运维直连、应急接入 |
6447 |
Router 直连 | 强制只读 | 不经 HAProxy 的只读入口 | 运维只读分析 |
8404 |
HAProxy | 监控 | Stats 页面 | 运维与巡检 |
一套面向生产环境的 MySQL InnoDB Cluster 自动化部署与运维方案,基于 Ansible 集成 MySQL Router、HAProxy、Keepalived,支持扩缩容、滚动配置升级与可选逻辑 / 物理备份,适合作为长期维护的数据库高可用主线。
Production-oriented automation for MySQL InnoDB Cluster using Ansible, integrated with MySQL Router, HAProxy, Keepalived, scaling workflows, rolling configuration updates, and optional logical backups.
# 克隆项目
git clone <this-repo>
cd auto-install-mysql-innodb-cluster
# 配置服务器信息
vim inventory/hosts-with-dedicated-routers.yml
# 使用稳定的行业最佳实践配置
./scripts/deploy_dedicated_routers.sh --production-ready# 第一步:对多台服务器批量应用行业最佳实践内核优化(推荐)
ansible-playbook -i inventory/hosts-with-dedicated-routers.yml playbooks/kernel-optimization-stable.yml
# 第二步:部署MySQL集群
./scripts/deploy_dedicated_routers.sh --mysql-only -i inventory/hosts-with-dedicated-routers.yml
# 第三步:批量验证关键内核参数
ansible mysql_cluster:mysql_router:haproxy_lb -i inventory/hosts-with-dedicated-routers.yml -m shell -a "sysctl net.core.somaxconn vm.swappiness fs.file-max"补充说明:
- 多台服务器场景下,优先使用 Ansible playbook 批量执行内核优化。
./scripts/optimize_mysql_kernel_stable.sh更适合单机手动优化、单机排查或临时验证。- 如需通过主入口脚本单独执行内核优化,可使用
./scripts/deploy_dedicated_routers.sh --kernel-optimize-only -i inventory/hosts-with-dedicated-routers.yml
# 查看当前配置
./scripts/config_manager.sh --current
# 列出所有可用配置
./scripts/config_manager.sh --list
# 切换配置(如果需要)
./scripts/config_manager.sh --switch 8c32g-optimized说明:
inventory/group_vars/all.yml是当前唯一生效的主配置文件。config_manager.sh现在只切换mysql_hardware_profile,不再整文件覆盖主配置。all-8c32g-optimized.yml、all-original-10k-config.yml保留为历史快照参考,不是运行时真相源。
当前仓库已支持并默认按最小高可用拓扑检查:
- MySQL: 3 节点
- MySQL Router: 2 节点(可扩至3)
- HAProxy: 2 节点(可扩至3)
接入层当前支持三类入口:
- 强制读写入口
- 强制只读入口
- 自动读写分离单端口入口
推荐参考清单:
-
参考Inventory:
inventory/hosts-ha-reference.yml -
部署蓝图(中文):
docs/DEPLOYMENT_HA_BLUEPRINT_ZH.md -
一键HA部署脚本:
scripts/deploy-ha-stack.sh -
VIP高可用(Keepalived):
playbooks/install-keepalived.yml -
Router扩容脚本:
scripts/scale-router.sh -
HAProxy扩容脚本:
scripts/scale-haproxy.sh -
一键健康检查:
scripts/health-check-ha.sh -
发布清单:
docs/RELEASE_CHECKLIST_ZH.md
快速执行:
./scripts/deploy-ha-stack.sh inventory/hosts-ha-reference.yml- CPU: 8核
- 内存: 32GB
- 存储: SSD推荐
- 网络: 千兆内网
- 系统: Ubuntu 22.04 / 24.04 / 25.10,或 RHEL/Rocky/Alma 8/9/10
- CPU: 4核
- 内存: 8GB
- 存储: 100GB
- 网络: 千兆内网
- 系统: Ubuntu 22.04 / 24.04 / 25.10,或 RHEL/Rocky/Alma 8/9/10
| 配置名称 | 适用硬件 | MySQL连接 | 说明 |
|---|---|---|---|
| 8c32g-optimized | 8C32G+4C8G | 2500/节点 | 默认推荐配置(生产余量版) |
| original-10k | 32C64G+4C8G | 10000/节点 | 高内存需求配置 |
# 当前是8C32G配置,如需切换到历史高连接配置
./scripts/config_manager.sh --switch original-10k
# 备份当前配置
./scripts/config_manager.sh --backup
# 验证配置
./scripts/config_manager.sh --validate我们的内核优化基于以下权威来源,确保稳定性和通用性:
✅ Oracle MySQL 8.0 官方性能调优指南
✅ Percona MySQL 性能最佳实践
✅ MariaDB 企业级部署手册
✅ AWS RDS / 阿里云 / 腾讯云生产环境验证
与传统一刀切配置不同,我们根据系统规格动态调整:
# 平衡参数,兼顾性能和稳定性
连接队列: 16384 (而非过度的65535)
文件描述符: 131072 (13万,充足但不浪费内存)
共享内存: 20GB (60%内存,安全范围)
TCP缓冲区: 4MB (平衡性能和内存使用)# 保守参数,确保稳定性
连接队列: 8192
文件描述符: 65536
共享内存: 50%内存# 高性能参数,充分利用资源
连接队列: 32768
文件描述符: 262144
共享内存: 75%内存(上限64GB)- 连接队列: 基于内存大小动态调整 (8K-32K)
- 文件描述符: 根据系统规格智能设置
- TCP优化: BBR算法优先,回退cubic
- 缓冲区: 4MB平衡配置 (避免16MB内存浪费)
- 交换控制: swappiness=0 (完全关闭swap - 用户要求)
- Swap状态: 完全禁用,永不使用swap分区
- 脏页控制: 10%比例 (Percona验证的稳定值)
- 透明大页: 禁用 (MySQL官方要求)
- 内存保护: 保守模式 (避免OOM风险)
- SSD: mq-deadline调度器 (现代内核推荐)
- HDD: mq-deadline/deadline调度器
- 队列深度: SSD(128), HDD(64) (平衡性能)
| 对比项 | 激进配置 | 行业最佳实践 |
|---|---|---|
| OOM风险 | ✅ 低 | |
| 内存效率 | ✅ 优化合理 | |
| 兼容性 | ✅ 广泛兼容 | |
| 长期稳定性 | ✅ 生产就绪 | |
| 维护成本 | ✅ 低 |
# 使用稳定的行业最佳实践脚本
sudo ./scripts/optimize_mysql_kernel_stable.sh
# 检查系统环境和推荐配置
sudo ./scripts/optimize_mysql_kernel_stable.sh --check-only
# 验证优化效果
sudo ./scripts/optimize_mysql_kernel_stable.sh --verify-only
# 或使用Ansible批量优化
ansible-playbook -i inventory/hosts-with-dedicated-routers.yml playbooks/kernel-optimization-stable.yml前端连接: 60000 (2台Router × 30000)
后端连接: 7500 (3台MySQL × 2500)
连接复用: 8:1 左右(保守后端容量设计)
响应时间: <10ms (内网环境)
吞吐量: 100K-150K QPS (读多写少场景)
| 参数 | 系统默认 | 行业最佳实践 | 提升 |
|---|---|---|---|
| 最大连接数 | 1024 | 32768 | 32倍 |
| 连接队列 | 128 | 16384 | 128倍 |
| 文件描述符 | 1024 | 131072 | 128倍 |
| 连接建立时间 | 10-50ms | 1-5ms | 90%+ |
| I/O延迟 | 5-20ms | 1-5ms | 75%+ |
| 查询稳定性 | 抖动较大 | 稳定 | 抖动减少80% |
| 内存使用效率 | 低 | 优化 | 节省50%+内存 |
MySQL单台内存分配:
├── InnoDB Buffer Pool: 18GB
├── 连接与会话内存: 4-6GB
├── 系统与页缓存: 6GB+
└── 安全余量: 2-4GB
Router单台内存分配:
├── 基础内存: 1.5GB
├── 连接内存: 0.5GB (30000×16KB)
├── 缓存内存: 2GB
├── 系统预留: 2GB (25%)
└── 总计: 6GB/8GB (75%安全使用)
应用程序层
↓
HAProxy VIP (192.168.1.100)
↓
Router集群 (192.168.1.20-21)
↓
MySQL集群 (192.168.1.10-12)
优势:
- 单一连接入口,简化应用配置
- 自动故障切换,秒级恢复
- 读写分离,智能路由
- 连接复用,降低数据库压力
- 内核级优化,极致性能
- 🚀 完整部署指南 ← 推荐首选
- 🤖 AI维护说明 ← 给 AI / 新接手同事
- 📂 项目结构总览 ← 文件组织
- 🔧 Router完整部署 ← Router专项
- 💾 备份与恢复指南 ← 备份 / 恢复主线
- ⚡ 内核优化最佳实践 ← 稳定配置
- 🎯 MySQL完整优化 ← 性能调优
- 📊 硬件容量分析
- 🔧 服务器配置说明
- 🔧 故障排除指南
# 查看集群状态
./scripts/deploy_dedicated_routers.sh --status
# 测试连接
./scripts/deploy_dedicated_routers.sh --test-connection
# 查看监控
curl http://192.168.1.100:8404/stats
# 验证内核优化状态(稳定版本)
sudo ./scripts/optimize_mysql_kernel_stable.sh --verify-only说明:
- 走主入口脚本执行完整部署或单独部署时,默认会对对应目标节点执行内核优化。
- 如需显式跳过,可在主入口脚本中使用
--skip-kernel-optimization。 - 如果你直接手工运行底层 playbook,则不会自动附带内核优化,需要自行决定是否先执行
playbooks/kernel-optimization-stable.yml。
# MySQL 扩容(目标主机需先加入 inventory)
./scripts/deploy_dedicated_routers.sh --scale-mysql-add --limit mysql-node4 -i inventory/hosts-with-dedicated-routers.yml
# MySQL 缩容(缩容当前主节点时需指定新主节点)
./scripts/deploy_dedicated_routers.sh --scale-mysql-remove --target mysql-node3 --new-primary mysql-node2 -i inventory/hosts-with-dedicated-routers.yml
# Router / HAProxy 缩容(执行后请把目标主机从 inventory 中移除)
./scripts/deploy_dedicated_routers.sh --shrink-router --limit mysql-router-2 -i inventory/hosts-with-dedicated-routers.yml
./scripts/deploy_dedicated_routers.sh --shrink-lb --limit haproxy-2 -i inventory/hosts-with-dedicated-routers.yml
# 按当前主配置滚动应用到现有节点
./scripts/deploy_dedicated_routers.sh --apply-config -i inventory/hosts-with-dedicated-routers.yml
# 仅执行内核优化
./scripts/deploy_dedicated_routers.sh --kernel-optimize-only -i inventory/hosts-with-dedicated-routers.yml
# 只安装 / 重配 Router(默认会对 mysql_router 目标组执行内核优化)
./scripts/deploy_dedicated_routers.sh --install-routers -i inventory/hosts-with-dedicated-routers.yml
# 只安装 / 重配 HAProxy + Keepalived(默认会对 haproxy_lb 目标组执行内核优化)
./scripts/deploy_dedicated_routers.sh --configure-lb -i inventory/hosts-with-dedicated-routers.yml
# 可选备份(默认关闭,需先在 all.yml 中启用 backup_config.enabled=true)
./scripts/deploy_dedicated_routers.sh --backup -i inventory/hosts-with-dedicated-routers.yml| 能力 | 主入口命令 | 默认会带内核优化 | 适用场景 |
|---|---|---|---|
| 完整部署 | --production-ready |
是 | 新环境一次性完整部署 |
| 仅部署 MySQL Cluster | --mysql-only |
是 | 只落数据库高可用层 |
| 仅部署 Router | --install-routers |
是 | 已有 MySQL Cluster,补接入层 |
| 仅部署 HAProxy + Keepalived | --configure-lb |
是 | 已有 Router,补 VIP / 四层入口 |
| 滚动应用当前配置 | --apply-config |
是 | 修改主配置后滚动应用 |
| 仅执行内核优化 | --kernel-optimize-only |
是 | 批量内核调优,不执行安装部署 |
| MySQL 扩容 | --scale-mysql-add |
是 | 新增 MySQL 节点加入集群 |
| MySQL 缩容 | --scale-mysql-remove |
否 | 下线 MySQL 节点 |
| Router 缩容 | --shrink-router |
否 | 下线 Router 节点 |
| HAProxy / Keepalived 缩容 | --shrink-lb |
否 | 下线入口层节点 |
| 可选备份 | --backup |
否 | 逻辑备份或 XtraBackup 物理备份 |
| 仅前置检查 | --check-prereq |
否 | 变更前做拓扑和参数检查 |
| 仅健康检查 | --test-connection / --status |
否 | 部署后验证 |
补充说明:
- 如需显式跳过内核优化,可追加
--skip-kernel-optimization - 如果直接手工运行底层 playbook,则不会自动附带内核优化
- 默认推荐使用主入口脚本,而不是直接调用底层 playbook
./scripts/deploy_dedicated_routers.sh --production-ready -i inventory/hosts-with-dedicated-routers.yml./scripts/deploy_dedicated_routers.sh --mysql-only -i inventory/hosts-with-dedicated-routers.yml./scripts/deploy_dedicated_routers.sh --install-routers -i inventory/hosts-with-dedicated-routers.yml./scripts/deploy_dedicated_routers.sh --configure-lb -i inventory/hosts-with-dedicated-routers.yml./scripts/deploy_dedicated_routers.sh --check-prereq -i inventory/hosts-with-dedicated-routers.yml./scripts/deploy_dedicated_routers.sh --apply-config -i inventory/hosts-with-dedicated-routers.yml./scripts/deploy_dedicated_routers.sh --kernel-optimize-only -i inventory/hosts-with-dedicated-routers.yml./scripts/deploy_dedicated_routers.sh --scale-mysql-add --limit mysql-node4 -i inventory/hosts-with-dedicated-routers.yml./scripts/deploy_dedicated_routers.sh --scale-mysql-remove --target mysql-node3 --new-primary mysql-node2 -i inventory/hosts-with-dedicated-routers.yml# 先在 inventory/group_vars/all.yml 中启用:
# backup_config.enabled: true
# backup_config.method: logical
./scripts/deploy_dedicated_routers.sh --backup -i inventory/hosts-with-dedicated-routers.yml# 先在 inventory/group_vars/all.yml 中启用:
# backup_config.enabled: true
# backup_config.method: xtrabackup
./scripts/deploy_dedicated_routers.sh --backup -i inventory/hosts-with-dedicated-routers.yml./scripts/deploy_dedicated_routers.sh --status -i inventory/hosts-with-dedicated-routers.yml备份目标支持:
- 本地目录
- 挂载目录(NFS)
- SSH + rsync 到远端目录
备份模式支持:
logical:默认,使用 MySQL Shell Dumpxtrabackup:可选,使用 Percona XtraBackup 物理备份,适合大数据量场景
版本兼容说明:
MySQL 8.4→Percona XtraBackup 8.4MySQL 8.0→Percona XtraBackup 8.0- 默认主线使用
MySQL 8.4 LTS - 如需降低对写流量影响,建议将物理备份执行节点切到
mysql_secondary
超时与长任务说明:
- Router 当前显式设置的是连接建立与路由层超时,不会因为 SQL 执行时间长而主动中断正常长查询。
- MySQL 当前默认
wait_timeout/interactive_timeout已提升到更适合生产作业的范围,net_read_timeout/net_write_timeout也按导入导出/迁移场景做了放宽。
自动读写分离说明:
- 新增了单端口自动读写分离能力,进一步完善仓库的高可用接入层能力。
- 现有强制 RW / RO 端口仍然保留,便于运维、批处理、DDL、只读分析等场景使用。
- 自动读写分离是新增能力,不会破坏现有服务对
3307/3308和6446/6447的使用方式。
# 查看当前内核参数
sysctl -a | grep -E "net.core.somaxconn|vm.swappiness|fs.file-max"
# 检查系统规格和推荐配置
sudo ./scripts/optimize_mysql_kernel_stable.sh --check-only
# 查看透明大页状态
cat /sys/kernel/mm/transparent_hugepage/enabled
# 查看磁盘调度器
for disk in $(lsblk -dno NAME | grep -E '^(sd|nvme)'); do
echo "$disk: $(cat /sys/block/$disk/queue/scheduler)"
done# 1. 备份当前配置
sudo ./scripts/optimize_mysql_kernel_stable.sh --backup-only
# 2. 检查系统状态
sudo ./scripts/optimize_mysql_kernel_stable.sh --check-only
# 3. 应用稳定配置
sudo ./scripts/optimize_mysql_kernel_stable.sh --full-optimize
# 4. 重启服务器
sudo reboot
# 5. 验证配置
sudo ./scripts/optimize_mysql_kernel_stable.sh --verify-only当业务增长,需要升级到32核64G时:
# 切换到历史高连接配置
./scripts/config_manager.sh --switch original-10k
# 滚动应用新配置
./scripts/deploy_dedicated_routers.sh --apply-config -i inventory/hosts-with-dedicated-routers.yml
# 或使用统一升级脚本
./scripts/upgrade_hardware_profile.sh --profile original-10k --apply部署成功后,你将拥有:
✅ 企业级高可用MySQL集群
✅ 专用Router集群,60K并发连接能力
✅ 基于行业最佳实践的稳定内核优化
✅ 智能负载均衡和故障转移
✅ 生产级监控和运维工具
✅ 灵活的配置管理方案
- HAProxy VIP(自动读写分离,推荐应用默认入口):
192.168.1.100:3309 - HAProxy VIP(强制读写):
192.168.1.100:3307 - HAProxy VIP(强制只读):
192.168.1.100:3308 - 直连 Router(强制读写):
router-ip:6446 - 直连 Router(强制只读):
router-ip:6447 - 直连 Router(自动读写分离):
router-ip:6450 - 监控页面: http://192.168.1.100:8404/stats
- 配置管理:
./scripts/config_manager.sh --help - 稳定内核优化:
sudo ./scripts/optimize_mysql_kernel_stable.sh --help
现在你的MySQL集群已经针对8核32G+4核8G硬件进行了完美优化,并且采用了行业最佳实践的稳定内核配置,具备最佳的高可用性、高性能和长期稳定性!🚀