MySQL 主从部署快速开始

示例:MySQL 8.4.9,一主两备。MySQL 8.4.x 可用于 CentOS/RHEL 7 系列;如果要使用 MySQL 9.7.x,请使用支持 glibc2.28 的操作系统。

建议在新环境执行。

master_slave.yml 默认会做 Linux 初始化,例如安装依赖、调整 SELinux、关闭 firewalld、写入 sysctl,不建议直接在已有业务机上首次试跑。

1. 准备 dbbot 与 Ansible

dbbot_version="$(basename "$(curl -fsSLI -o /dev/null -w '%{url_effective}' https://github.com/fanderchan/dbbot/releases/latest)")"
curl -fL -O "https://github.com/fanderchan/dbbot/releases/download/${dbbot_version}/dbbot-${dbbot_version}.tar.gz"
tar -zxvf "dbbot-${dbbot_version}.tar.gz" -C /usr/local/

/usr/local/dbbot/bin/dbbotctl env setup
source ~/.bashrc
ansible --version

2. 准备 MySQL 安装包(可选)

cd /usr/local/dbbot/mysql_ansible/downloads
mysql_version="8.4.9"
curl -fL -O "https://dev.mysql.com/get/Downloads/MySQL-8.4/mysql-${mysql_version}-linux-glibc2.17-x86_64-minimal.tar.xz"

若服务器可联网且开启自动下载,可不手工上传。

若你把离线包放到自定义目录,请同步修改 playbooks/common_config.yml 中的 mysql_packages_dir

3. 配置主机与参数

inventory/hosts.ini

[dbbot_mysql]
192.0.2.131 ansible_user=root ansible_ssh_pass="'密码'"
192.0.2.132 ansible_user=root ansible_ssh_pass="'密码'"
192.0.2.133 ansible_user=root ansible_ssh_pass="'密码'"

以上 IP 使用 RFC 5737 文档保留地址,仅作为示例,请替换成你的实际主机地址。

playbooks/common_config.yml

mysql_version: "8.4.9"
mysql_port: 3306
fcs_allow_dbbot_default_passwd: true

说明:

  • dbbot 公开默认密码遵循 Dbbot_<user>@8888 / Dbbot_<linux_user>@9999
  • 如果仍使用公开默认密码,上面这行 fcs_allow_dbbot_default_passwd: true 必须保留;默认值是 false,否则部署前会在 pre_tasks 阶段直接失败。
  • 实验环境可临时设为 true,生产环境应改成你自己的密码。
  • MySQL 9.7.x 使用 glibc2.28 包,不支持 CentOS/RHEL 7 系列;这类系统请使用 MySQL 8.4.x

playbooks/vars/var_master_slave.yml

master_ip: 192.0.2.131
slave_ips:
  - 192.0.2.132
  - 192.0.2.133
sub_nets: 192.0.2.%

3.1 依赖链

项目内容
前置依赖已完成 dbbotctl env setupinventory/hosts.ini 中的 [dbbot_mysql] 已准备;MySQL 安装包已上传或允许自动下载
必填变量master_ipslave_ipsmysql_versionmysql_port;若沿用公开默认密码,需显式设置 fcs_allow_dbbot_default_passwd: true
后续依赖若要接入监控,继续分别执行 node_exporter_install.ymlmysqld_exporter_install.yml,再用 dbbotctl exporter register 注册 node_exportermysqld_exporter

4. 执行前检查

cd /usr/local/dbbot/mysql_ansible/playbooks
ansible dbbot_mysql -m ping

5. 执行部署

cd /usr/local/dbbot/mysql_ansible/playbooks
ansible-playbook master_slave.yml

执行过程中按提示输入 confirm 后继续。

如果是脚本或 CI 里的非交互执行,请显式追加 -e dbbot_confirmation_input=confirm;单纯向标准输入写入 confirm 不能替代这个变量。

脚本、CI、SSH one-liner 场景建议同时使用绿色版 Ansible 的显式路径:

python3 /usr/local/dbbot/portable-ansible/ansible-playbook master_slave.yml -e dbbot_confirmation_input=confirm

注意:

  • master_slave.ymlunsafe_uninstall.yml 一样,都会读取当前 playbooks/common_config.yml / advanced_config.yml 的生效配置。
  • 如果后续你把 mysql_port 改成了别的实例端口,卸载前必须先切回真正要处理的那个端口,或者显式传 -e mysql_port=<target_port>
  • unsafe_uninstall.yml 会删除实例数据、日志和运行目录,但默认保留软件基目录、Linux 用户和实例 my.cnf,便于后续审计原实例配置。

6. 部署完成验证

master_slave.yml 默认会在 post_tasks 阶段自动执行部署后验收,包括 MySQL 服务、端口、SQL 登录、主库 binlog 状态、从库复制线程、复制源地址和复制延迟。

  • 如果 post-deploy 验收失败,Playbook 会直接失败,PLAY RECAP 中会出现 failed
  • 如需临时跳过自动验收,可显式追加 -e fcs_run_post_deploy_checks=false
  • 以下命令仅作为人工补充排查,不再是主要验收步骤:
mysql -uadmin -h127.0.0.1 -P3306 -pDbbot_admin@8888 -e "select @@version"