












FGDBA-MySQL8/9主从复制自动化安装工具是一款由风哥自主设计、研发并长期维护的 MySQL数据库主从复制架构自动化部署工具。该工具定位为"配置驱动型一键自动化安装"解决方案,面向 DBA 工程师、数据库运维人员以及需要在 Linux 平台上快速、标准、可重复地搭建 MySQL 8.X/9.X 主从复制环境的各类技术团队。
FGDBA-MySQL8/9主从复制自动化安装工具的核心思想是:将所有可调参数(包括主从 IP、SSH 凭据、MySQL 二进制版本、安装目录、数据目录、日志目录、端口、root 密码、复制账号、内核参数、LVM、防火墙、SELinux、NUMA、透明大页、IO 调度器、my.cnf 全量参数等)全部集中在一个 YAML 配置文件中,通过命令行参数指定主从 IP 列表与 SSH 凭据后,由控制机通过 SSH(基于 paramiko)远程登录各目标服务器,按照"环境检测 -> 系统配置 -> MySQL 安装 -> 主从配置 -> 健康检查"的固定流程自动完成全栈部署,无需人工干预。
该工具采用纯 Python 实现,依赖极少(仅需 pyyaml 与 paramiko),并自带离线安装包目录(python-pkgs/),支持在内网无外网的环境下离线部署。其设计目标是在保证生产级稳定性与可回滚性的前提下,将一台或多台全新 Linux 主机在 10~20 分钟内转变为一个具备 GTID、半同步复制、自动故障感知能力的 MySQL 8.X/9.X 主从集群。
作者:风哥
官方网站 http://www.fgedu.net.cn , http://www.itpux.com
数据库教程 https://edu.51cto.com/lecturer/8020378.html
mysql主从集群一键安装教程 https://edu.51cto.com/course/40554.html
本工具并非一个通用的 MySQL 生命周期管理平台,而是一个聚焦于"从零到一搭建 MySQL 8.X/9.X 主从复制集群"的自动化安装器。其适用场景包括但不限于:
工具本身不承担后续的监控、备份、自动故障切换等职责(这部分建议配合 Orchestrator、MHA、ProxySQL 或企业自有平台使用),但其输出的标准化目录结构、统一 my.cnf 模板与清晰的日志,可以很好地与上述平台对接。
工具采用"控制机 + 目标服务器"的两层架构:
安装过程中,控制机与目标服务器之间的所有交互均通过 SSH 通道完成(命令执行使用 exec_command,文件写入使用 SFTP),不依赖额外的 Agent 或中间件,保证了对目标服务器的零侵入与最小化依赖。
| 文件/目录 | 用途说明 |
|---|---|
| FGMYSQL主从复制自动化工具 | 主程序脚本,包含全部安装逻辑 |
| 全量配置文件,所有可调参数集中在此 | |
requirements.txt |
Python 依赖清单 |
python-pkgs/ |
离线安装包目录,包含 paramiko、cryptography、bcrypt、pynacl、pyyaml 等 wheel 包 |
docs/README.md |
工具使用说明文档 |
docs/INSTALL.md |
逐步安装与依赖配置指南 |
logs/ |
程序运行时自动生成的日志目录 |
本工具围绕"MySQL 8.X/9.X 主从复制集群一键安装"这一核心目标,提供以下主要功能模块:
-mr、-u、-p、--port)会自动回写到配置文件中,保证配置文件与实际执行参数一致;-c/--config 指定自定义配置文件路径,便于在多套环境(开发/测试/生产)间切换;my_cnf、my_cnf_master、my_cnf_slave 三段分别管理公共、主库专属、从库专属参数,工具会自动合并生成最终 my.cnf。threading 模块,为每台目标服务器创建独立线程并行执行安装;threading.Lock)汇总到主线程;cleanup 回滚,避免遗留半成品环境;工具覆盖从裸机到可用集群的全流程,包含以下六大阶段:
.tar.xz 与 .tar.gz 格式的 MySQL 二进制包(搜索路径覆盖 /tmp、当前目录、/root),若发现多版本会交互式让用户选择统一版本;同时检测是否已存在旧版 MySQL 安装,按提示决定是否清理。lower_case_table_names=1)、生成 my.cnf、配置 systemd 服务、启动 MySQL、设置 root 密码。CHANGE REPLICATION SOURCE TO 并启动复制。SHOW BINARY LOG STATUS、在从库执行 SHOW REPLICA STATUS,并检查半同步源端/复制端状态变量。cleanup(host) 清理失败主机的残留文件与进程,避免干扰下次安装;logs/mysql_mr_install_YYYYMMDD_HHMMSS.log 文件,便于事后排查;gtid_mode=ON、enforce_gtid_consistency=ON),保证事务唯一标识与一致性;rpl_semi_sync_source 与 rpl_semi_sync_replica 半同步复制插件,主库使用 AFTER_SYNC 等待点,从库启用半同步复制端;server-id 固定为 33061,从库自 33062 起递增,保证集群内唯一;mysql_clone.so 克隆插件,为后续快速扩从库提供基础。-mr 参数中 IP 列表的长度决定,无需修改代码;server-id 自动递增,无需手动维护。cat /etc/redhat-release 等方式识别 RHEL9 / OEL9 / Kylin V10 等目标系统;/dev/tcp 特性测试目标主机端口可达性,不依赖 telnet/nc;libaio、numactl、perl、net-tools、wget、tar、openssh-clients 等是否已安装;fgedudb.repo),避免依赖包安装异常;yum/dnf 自动安装前述依赖包;fs.file-max、net.core.somaxconn、net.ipv4.tcp_max_syn_backlog、net.ipv4.tcp_fin_timeout、vm.swappiness、vm.nr_hugepages、vm.min_free_kbytes、vm.overcommit_memory、vm.hugetlb_shm_group 等关键参数;systemctl stop firewalld && systemctl disable firewalld;setenforce 0 并修改 /etc/selinux/config 为 disabled;deadline;/dev/sdc)上自动创建 PV、VG、LV,格式化为 xfs 并挂载到 /mysql 与 /backup,通过 skip 参数可跳过已配置的主机;vm.nr_hugepages 与 hugetlb_shm_group,为 InnoDB 大页内存使用做准备。.tar.xz 与 .tar.gz 两种格式,优先按 /tmp、当前目录、/root 顺序搜索;/mysql/app/mysql,显示解压进度;mysqld --initialize --lower-case-table-names=1 初始化数据目录;my_cnf、my_cnf_master、my_cnf_slave 三段配置,自动合并为最终 my.cnf,落盘到 /mysql/data/3306/my.cnf;/etc/systemd/system/mysql.service,设置 LimitNOFILE=65535、LimitNPROC=65535、TimeoutStartSec=300;ALTER USER 设置 root 密码,密码来源于配置文件。CREATE USER ... REPLICATION SLAVE 与 GRANT REPLICATION SLAVE ON *.*;rpl_semi_sync_source,在从库安装 rpl_semi_sync_replica;mysql_clone.so,为后续克隆从库提供基础;CHANGE REPLICATION SOURCE TO ... SOURCE_HOST=主库IP, SOURCE_USER=复制用户, SOURCE_PASSWORD=密码, ...,并启用 GTID_AUTO_POSITION=1;START REPLICA,并检查 Replica_IO_Running、Replica_SQL_Running 是否为 Yes。systemctl status mysql.service;mysql -u root -p -e "SELECT VERSION()" 验证登录;SHOW BINARY LOG STATUS,从库 SHOW REPLICA STATUS;SHOW GLOBAL VARIABLES LIKE 'rpl_semi_sync_source_enabled' 与 'rpl_semi_sync_replica_enabled';| 项目 | 要求 |
|---|---|
| 操作系统 | Linux(推荐 RHEL/CentOS 7+,或与目标服务器同源系统) |
| Python 版本 | 3.6 及以上(RHEL9/OEL9 默认 Python 3.9 即可) |
| 必需依赖 | pyyaml >= 5.0、paramiko >= 2.0(离线包见 python-pkgs/) |
| 网络 | 能够 SSH 到所有目标服务器的 22 端口(或自定义端口) |
| 权限 | 具有目标服务器的 root SSH 登录权限 |
| 磁盘 | 至少预留 MySQL 二进制包大小(约 1GB)的临时空间 |
| 项目 | 要求 |
|---|---|
| 操作系统 | RHEL9 / OEL9 / Kylin V10 系列 Linux(glibc 2.28+) |
| 内存 | 至少 4GB RAM(生产推荐 8GB+,工具默认 innodb_buffer_pool_size=2G) |
| 磁盘 | 至少 50GB 可用空间(数据目录与日志目录分开更佳) |
| 网络 | 所有目标服务器之间网络互通,且 3306 端口未被占用 |
| 权限 | 提供 root 用户 SSH 登录权限(工具会创建 mysql 系统用户) |
| 软件包 | libaio、numactl、perl、net-tools、wget、tar、openssh-clients(工具会自动安装) |
| 依赖 | 最低版本 | 用途 |
|---|---|---|
| Python | 3.6 | 脚本运行环境 |
| pyyaml | 5.0 | YAML 配置文件解析 |
| paramiko | 2.0 | SSH 连接与文件传输 |
| MySQL 二进制包 | 8.X/9.X.0 | 目标数据库软件 |
| Linux glibc | 2.28 | MySQL 8.X/9.X 二进制包依赖 |
在线安装:
pip3 install pyyaml paramiko
离线安装(使用工具自带 python-pkgs/):
pip3 install --no-index --find-links=./python-pkgs pyyaml paramiko
验证:
python3 -c "import yaml, paramiko; print('pyyaml', yaml.__version__); print('paramiko', paramiko.__version__)"
将 MySQL 8.X/9.X.0 二进制包放置在控制机的脚本同级目录或 /tmp 目录下,文件名形如 mysql-8.X/9.X.0-linux-glibc2.28-x86_64.tar.xz。工具会自动搜索 .tar.xz 与 .tar.gz 两种格式,无需提前上传到目标服务器。
编辑 ,重点关注以下字段:
replication:
master_ip: "192.168.1.51" # 主服务器 IP(命令行 -mr 会覆盖)
slave_ips: # 从服务器 IP 列表(命令行 -mr 会覆盖)
- "192.168.1.52"
- "192.168.1.53"
replication_user: "fgedu_repl"
replication_password: "fgedu_repl_123"
mysql:
install_dir: /mysql/app/mysql
data_dir: /mysql/data/3306/data
port: 3306
socket: /tmp/mysql.sock
root_password: "fgedu123"
version: "8.X/9.X.0"
ssh:
username: root
password: "rootroot"
port: 22
timeout: 30
retry_count: 3
其余 system.kernel、system.lvm、system.security、system.timeout、mysql.my_cnf 等字段可按需调整,未调整则使用工具内置的合理默认值。
| 参数 | 简写 | 是否必填 | 说明 |
|---|---|---|---|
--master-replica |
-mr |
是 | 主从服务器 IP 列表,格式:主IP,从1IP,从2IP,...,至少 2 个 IP |
--username |
-u |
是 | SSH 用户名(通常为 root) |
--password |
-p |
是 | SSH 密码 |
--port |
否 | SSH 端口,默认 22 | |
--verify-only |
否 | 仅验证环境不安装 | |
--config |
-c |
否 | 配置文件路径,默认 |
查看帮助:
python3 FGMySQLAutoInstall_MR.py --help
python3 FGMySQLAutoInstall_MR.py -mr 192.168.1.51,192.168.1.52,192.168.1.53 -u root -p rootroot
说明:192.168.1.51 为主库(可读写),192.168.1.52、192.168.1.53 为从库(只读)。
python3 FGMySQLAutoInstall_MR.py -mr 192.168.1.51,192.168.1.52 -u root -p rootroot
# 1 主 3 从
python3 FGMySQLAutoInstall_MR.py -mr 192.168.1.51,192.168.1.52,192.168.1.53,192.168.1.54 -u root -p rootroot
# 1 主 4 从
python3 FGMySQLAutoInstall_MR.py -mr 192.168.1.51,192.168.1.52,192.168.1.53,192.168.1.54,192.168.1.55 -u root -p rootroot
python3 FGMySQLAutoInstall_MR.py -mr 192.168.1.51,192.168.1.52 -u root -p rootroot --port 2222
python3 FGMySQLAutoInstall_MR.py -mr 192.168.1.51,192.168.1.52,192.168.1.53 -u root -p rootroot --verify-only
python3 FGMySQLAutoInstall_MR.py -mr 192.168.1.51,192.168.1.52 -u root -p rootroot -c /path/to/custom_config.yaml
执行安装命令后,工具会依次完成以下步骤:
logs/mysql_mr_install_YYYYMMDD_HHMMSS.log,完整记录所有操作与远程命令输出;背景:某企业新采购 3 台服务器(192.168.1.51/52/53),需要部署一套 MySQL 8.X/9.X 主从复制集群用于业务系统。
操作过程:
pip3 install --no-index --find-links=./python-pkgs pyyaml paramiko
将 MySQL 8.X/9.X.0 二进制包 mysql-8.X/9.X.0-linux-glibc2.28-x86_64.tar.xz 上传到控制机脚本同级目录;
编辑 ,确认 mysql.root_password、replication.replication_user/password 已改为强密码;
执行安装:
python3 FGMySQLAutoInstall_MR.py -mr 192.168.1.51,192.168.1.52,192.168.1.53 -u root -p rootroot
观察输出,确认各阶段全部 SUCCESS;
验证复制状态:
# 主库
mysql -h 192.168.1.51 -u root -p -e "SHOW BINARY LOG STATUS;"
mysql -h 192.168.1.51 -u root -p -e "SHOW REPLICAS;"
# 从库
mysql -h 192.168.1.52 -u root -p -e "SHOW REPLICA STATUS\G"
mysql -h 192.168.1.53 -u root -p -e "SHOW REPLICA STATUS\G"
确认 Replica_IO_Running: Yes、Replica_SQL_Running: Yes、Seconds_Behind_Source: 0。
背景:开发测试环境仅需 1 主 1 从即可。
操作过程:
python3 FGMySQLAutoInstall_MR.py -mr 192.168.1.51,192.168.1.52 -u root -p rootroot
执行过程与场景一一致,区别仅在于从库数量为 1,server-id 从 33062 开始。
背景:业务读写分离需要 1 主 3 从。
操作过程:
python3 FGMySQLAutoInstall_MR.py -mr 192.168.1.51,192.168.1.52,192.168.1.53,192.168.1.54 -u root -p rootroot
工具会自动为 3 台从库分配 server-id 33062/33063/33064,并并行安装。
背景:目标服务器 SSH 端口改为 2222,密码登录。
操作过程:
python3 FGMySQLAutoInstall_MR.py -mr 192.168.1.51,192.168.1.52 -u root -p rootroot --port 2222
--port 参数会被回写到 的 ssh.port 字段,后续所有 SSH 操作均使用该端口。
背景:正式安装前先确认环境是否满足要求。
操作过程:
python3 FGMySQLAutoInstall_MR.py -mr 192.168.1.51,192.168.1.52,192.168.1.53 -u root -p rootroot --verify-only
工具会完成配置加载、SSH 连接验证、安装包检测等前置检查,但不执行实际安装,便于提前发现问题。
背景:同时维护开发、测试、生产三套环境,使用不同配置文件。
操作过程:
# 开发环境
python3 FGMySQLAutoInstall_MR.py -mr 10.0.0.11,10.0.0.12 -u root -p devpass -c config/dev.yaml
# 生产环境
python3 FGMySQLAutoInstall_MR.py -mr 192.168.1.51,192.168.1.52,192.168.1.53 -u root -p prodpass -c config/prod.yaml
背景:控制机 /tmp 目录下同时存在 MySQL 8.X/9.X.0 与另一版本二进制包。
操作过程:
执行安装命令后,工具会列出检测到的所有版本并提示:
检测到多个MySQL版本,请选择要安装的版本:
[1] mysql-8.X/9.X.0-linux-glibc2.28-x86_64.tar.xz (xxx.xx MB)
[2] mysql-9.x.x-linux-glibc2.28-x86_64.tar.xz (yyy.yy MB)
请选择版本 (1-2):
输入对应序号后,工具会统一所有主机的安装版本。
背景:安装完成后,演练将主库从 192.168.1.51 切换到 192.168.1.52。
操作过程:
# 1. 主库加读锁
mysql -h 192.168.1.51 -u root -p -e "FLUSH TABLES WITH READ LOCK; SET GLOBAL read_only=ON;"
# 2. 确认从库 192.168.1.52 已追上
mysql -h 192.168.1.52 -u root -p -e "SHOW REPLICA STATUS\G"
# 确认 Seconds_Behind_Source = 0
# 3. 提升从库为新主
mysql -h 192.168.1.52 -u root -p -e "STOP REPLICA; RESET REPLICA ALL; SET GLOBAL read_only=OFF; SET GLOBAL super_read_only=OFF;"
# 4. 其他从库指向新主
mysql -h 192.168.1.53 -u root -p -e "STOP REPLICA; CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.1.52', SOURCE_USER='fgedu_repl', SOURCE_PASSWORD='fgedu_repl_123', SOURCE_AUTO_POSITION=1; START REPLICA;"
# 5. 验证
mysql -h 192.168.1.52 -u root -p -e "SHOW BINARY LOG STATUS;"
mysql -h 192.168.1.53 -u root -p -e "SHOW REPLICA STATUS\G"
背景:目标机房无外网,无法在线安装 Python 依赖。
操作过程:
python-pkgs/ 目录(工具已自带),或使用 pip3 download pyyaml paramiko -d ./python-pkgs 下载;python-pkgs/ 拷贝到控制机;pip3 install --no-index --find-links=./python-pkgs pyyaml paramiko
/tmp;现象:日志提示 主机 x.x.x.x 连接失败 或 ERROR: ...。
排查:
# 1. 检查网络连通性
ping <目标IP>
# 2. 检查 SSH 端口可达
bash -c "exec 3<>/dev/tcp/<目标IP>/22; echo OK"
# 3. 手工 SSH 登录验证
ssh root@<目标IP>
# 4. 检查防火墙
systemctl status firewalld
常见原因:目标服务器防火墙未关闭、SSH 服务未启动、SSH 端口非 22、密码错误、/etc/hosts.allow 或 fail2ban 拦截。
现象:日志提示 所有主机都未找到MySQL安装包。
排查:
# 1. 确认安装包位置
ls -lh ./mysql-9*.tar.xz
ls -lh /tmp/mysql-9*.tar.xz
# 2. 确认文件大小大于 100MB(工具的过滤阈值)
ls -lh mysql-8.X/9.X.0-linux-glibc2.28-x86_64.tar.xz
常见原因:文件名不含 mysql(被过滤)、文件大小小于 100MB(被过滤)、文件格式不是 .tar.xz 或 .tar.gz。
现象:解压或初始化阶段报 No space left on device。
排查:
df -h /mysql
df -h /tmp
df -h /
处理:清理 /var/log、/tmp 残留文件,或在 的 system.lvm 中挂载更大的块设备到 /mysql。
现象:MySQL 启动失败,错误日志提示 Port 3306 already in use。
排查:
netstat -tlnp | grep 3306
lsof -i:3306
处理:停止占用端口的进程,或在 中修改 mysql.port 与 my_cnf.port。
现象:yum install 阶段失败,提示 No package xxx available。
排查:
yum repolist
# 确认是否有可用仓库
处理:配置本地 YUM 源或内网镜像源,或在 的 system.packages 中移除缺失的包(前提是目标系统已有替代)。
现象:mysqld --initialize 报错。
排查:
# 查看数据目录是否为空
ls -la /mysql/data/3306/data
# 查看 mysql 用户是否创建
id mysql
# 查看权限
ls -ld /mysql/data/3306/data
处理:清空数据目录后重试,确认目录属主为 mysql:mysql。
现象:启动 MySQL 后执行 ALTER USER 报错。
排查:
# 查看错误日志
tail -100 /mysql/log/3306/fgedudb-error.err
常见原因:MySQL 未完全启动、root 初始密码未正确获取、my.cnf 中存在语法错误。
现象:从库 SHOW REPLICA STATUS 中 Replica_IO_Running 或 Replica_SQL_Running 为 No。
排查:
# 从库查看复制状态与错误
mysql -u root -p -e "SHOW REPLICA STATUS\G" | grep -E "Running|Last_Error"
# 检查网络
bash -c "exec 3<>/dev/tcp/<主库IP>/3306; echo OK"
# 检查复制用户
mysql -h <主库IP> -u root -p -e "SELECT user,host FROM mysql.user WHERE user='fgedu_repl';"
常见原因:主库未创建复制用户、复制用户密码错误、主库 3306 端口未开放、GTID 模式不一致。
现象:INSTALL PLUGIN rpl_semi_sync_source SONAME 'semisync_source.so' 报错。
排查:
# 检查插件文件是否存在
ls -la /mysql/app/mysql/lib/plugin/semisync*.so
# 查看 MySQL 错误日志
tail -50 /mysql/log/3306/fgedudb-error.err
处理:确认二进制包完整,必要时重新解压;检查 my.cnf 中 plugin-load-add 语法是否正确。
现象:pvcreate/vgcreate/lvcreate 报错。
排查:
# 确认块设备存在
ls -la /dev/sdc
# 确认设备未被占用
pvdisplay | grep /dev/sdc
处理:如该主机已配置 LVM,可在 的对应 system.lvm 项中将 skip 设为 true 跳过。
现象:安装过程中因各种原因中断,再次执行时提示已存在 MySQL。
处理:
# 1. 在目标主机停止 MySQL
systemctl stop mysql.service
pkill -9 mysqld
# 2. 清理数据目录与安装目录
rm -rf /mysql/data/3306/data/*
rm -rf /mysql/app/mysql/*
# 3. 重新执行安装命令
python3 FGMySQLAutoInstall_MR.py -mr ... -u root -p ...
工具在检测到旧安装时会提示用户选择是否清理,按提示操作即可。
# 安装日志
ls -lh logs/mysql_mr_install_*.log
tail -200 logs/mysql_mr_install_YYYYMMDD_HHMMSS.log
# MySQL 错误日志
ssh root@<目标IP> "tail -100 /mysql/log/3306/fgedudb-error.err"
# MySQL 慢查询日志
ssh root@<目标IP> "tail -50 /mysql/log/3306/fgedudb-query.err"
/mysql/
├── app/
│ └── mysql/ # MySQL 安装目录
├── data/
│ └── 3306/
│ ├── data/ # 数据文件目录
│ ├── my.cnf # 配置文件
│ └── mysql.pid # 进程 PID
├── log/
│ └── 3306/
│ ├── fgedudb-error.err # 错误日志
│ ├── fgedudb-query.err # 慢查询日志
│ ├── fgedudb-general.err# 通用日志
│ ├── binlog/ # 二进制日志
│ └── relaylog/ # 中继日志
/backup/ # 备份目录(LVM 可选)
# 检查服务状态
systemctl status mysql.service
# 主库查看二进制日志状态
mysql -u root -p -e "SHOW BINARY LOG STATUS;"
# 主库查看从库列表
mysql -u root -p -e "SHOW REPLICAS;"
# 从库查看复制状态
mysql -u root -p -e "SHOW REPLICA STATUS\G"
# 从库停止/启动/重置复制
mysql -u root -p -e "STOP REPLICA;"
mysql -u root -p -e "START REPLICA;"
mysql -u root -p -e "RESET REPLICA;"
# 查看半同步状态
mysql -u root -p -e "SHOW GLOBAL VARIABLES LIKE 'rpl_semi_sync%';"
/mysql/data/3306/data 与 binlog;如在使用过程中遇到问题,可通过以下方式联系作者获取支持:
作者:风哥
官方网站 http://www.fgedu.net.cn , http://www.itpux.com
数据库教程 https://edu.51cto.com/lecturer/8020378.html
mysql主从集群一键安装教程 https://edu.51cto.com/course/40554.html
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。