Skip to content

seaworld008/auto-install-mysql-innodb-cluster

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

31 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MySQL InnoDB Cluster 自动部署

Static Quality Ansible MySQL Router HA Scaling Backup Platforms

一套面向生产环境的 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,支持扩缩容、滚动配置升级与可选逻辑 / 物理备份,适合作为长期维护的数据库高可用主线。

English Blurb

Production-oriented automation for MySQL InnoDB Cluster using Ansible, integrated with MySQL Router, HAProxy, Keepalived, scaling workflows, rolling configuration updates, and optional logical backups.

🚀 快速开始

1. 完整部署(推荐)

# 克隆项目
git clone <this-repo>
cd auto-install-mysql-innodb-cluster

# 配置服务器信息
vim inventory/hosts-with-dedicated-routers.yml

# 使用稳定的行业最佳实践配置
./scripts/deploy_dedicated_routers.sh --production-ready

2. 分步部署(更安全)

# 第一步:对多台服务器批量应用行业最佳实践内核优化(推荐)
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

3. 配置管理

# 查看当前配置
./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.ymlall-original-10k-config.yml 保留为历史快照参考,不是运行时真相源。

🧱 高可用拓扑(Router + HAProxy)

当前仓库已支持并默认按最小高可用拓扑检查:

  • 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

📋 硬件要求

MySQL 服务器 (3台)

  • CPU: 8核
  • 内存: 32GB
  • 存储: SSD推荐
  • 网络: 千兆内网
  • 系统: Ubuntu 22.04 / 24.04 / 25.10,或 RHEL/Rocky/Alma 8/9/10

MySQL Router 服务器 (2台)

  • 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 / 阿里云 / 腾讯云生产环境验证

🔧 智能动态参数调整

与传统一刀切配置不同,我们根据系统规格动态调整:

你的8核32G系统(中等内存)

# 平衡参数,兼顾性能和稳定性
连接队列: 16384 (而非过度的65535)
文件描述符: 131072 (13万,充足但不浪费内存)
共享内存: 20GB (60%内存,安全范围)
TCP缓冲区: 4MB (平衡性能和内存使用)

小内存系统 (≤8GB)

# 保守参数,确保稳定性
连接队列: 8192
文件描述符: 65536
共享内存: 50%内存

大内存系统 (>32GB)

# 高性能参数,充分利用资源
连接队列: 32768
文件描述符: 262144
共享内存: 75%内存(上限64GB)

📈 关键优化项目

🌐 网络参数优化 - 稳定且保守

  • 连接队列: 基于内存大小动态调整 (8K-32K)
  • 文件描述符: 根据系统规格智能设置
  • TCP优化: BBR算法优先,回退cubic
  • 缓冲区: 4MB平衡配置 (避免16MB内存浪费)

💾 内存管理优化 - 用户定制优化

  • 交换控制: swappiness=0 (完全关闭swap - 用户要求)
  • Swap状态: 完全禁用,永不使用swap分区
  • 脏页控制: 10%比例 (Percona验证的稳定值)
  • 透明大页: 禁用 (MySQL官方要求)
  • 内存保护: 保守模式 (避免OOM风险)

💽 I/O调度优化 - 现代最佳实践

  • 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)

优势:

  • 单一连接入口,简化应用配置
  • 自动故障切换,秒级恢复
  • 读写分离,智能路由
  • 连接复用,降低数据库压力
  • 内核级优化,极致性能

📚 文档目录

🛠️ 运维管理

日常管理

# 查看集群状态
./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

实用命令示例

1. 新环境完整部署

./scripts/deploy_dedicated_routers.sh --production-ready -i inventory/hosts-with-dedicated-routers.yml

2. 只部署 MySQL 高可用集群

./scripts/deploy_dedicated_routers.sh --mysql-only -i inventory/hosts-with-dedicated-routers.yml

3. 已有 MySQL Cluster,补部署 Router

./scripts/deploy_dedicated_routers.sh --install-routers -i inventory/hosts-with-dedicated-routers.yml

4. 已有 Router,补部署 HAProxy + Keepalived

./scripts/deploy_dedicated_routers.sh --configure-lb -i inventory/hosts-with-dedicated-routers.yml

5. 只做前置检查,不做部署

./scripts/deploy_dedicated_routers.sh --check-prereq -i inventory/hosts-with-dedicated-routers.yml

6. 修改主配置后,滚动应用到现有节点

./scripts/deploy_dedicated_routers.sh --apply-config -i inventory/hosts-with-dedicated-routers.yml

7. 仅执行一次内核优化

./scripts/deploy_dedicated_routers.sh --kernel-optimize-only -i inventory/hosts-with-dedicated-routers.yml

8. 扩容一个新的 MySQL 节点

./scripts/deploy_dedicated_routers.sh --scale-mysql-add --limit mysql-node4 -i inventory/hosts-with-dedicated-routers.yml

9. 缩容一个 MySQL 节点

./scripts/deploy_dedicated_routers.sh --scale-mysql-remove --target mysql-node3 --new-primary mysql-node2 -i inventory/hosts-with-dedicated-routers.yml

10. 执行一次逻辑备份

# 先在 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

11. 执行一次 XtraBackup 物理备份

# 先在 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

12. 只做健康检查

./scripts/deploy_dedicated_routers.sh --status -i inventory/hosts-with-dedicated-routers.yml

备份目标支持:

  • 本地目录
  • 挂载目录(NFS)
  • SSH + rsync 到远端目录

备份模式支持:

  • logical:默认,使用 MySQL Shell Dump
  • xtrabackup:可选,使用 Percona XtraBackup 物理备份,适合大数据量场景

版本兼容说明:

  • MySQL 8.4Percona XtraBackup 8.4
  • MySQL 8.0Percona 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/33086446/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硬件进行了完美优化,并且采用了行业最佳实践的稳定内核配置,具备最佳的高可用性、高性能和长期稳定性!🚀

About

一套面向生产环境的 MySQL InnoDB Cluster 自动化部署与运维方案:基于 Ansible 集成 MySQL Router、HAProxy、Keepalived,支持单端口自动读写分离、扩缩容、滚动配置升级与可选逻辑/物理备份。

Topics

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors