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 系列;这类系统请使用 MySQL8.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 setup;inventory/hosts.ini 中的 [dbbot_mysql] 已准备;MySQL 安装包已上传或允许自动下载 |
| 必填变量 | master_ip、slave_ips、mysql_version、mysql_port;若沿用公开默认密码,需显式设置 fcs_allow_dbbot_default_passwd: true |
| 后续依赖 | 若要接入监控,继续分别执行 node_exporter_install.yml 与 mysqld_exporter_install.yml,再用 dbbotctl exporter register 注册 node_exporter 与 mysqld_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.yml与unsafe_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"