MySQL InnoDB Cluster 部署说明
本文说明如何使用 innodb_cluster.yml 部署 MySQL InnoDB Cluster。
1. 适用范围
- 目标架构:三节点 InnoDB Cluster
- 数据库类型:
db_type: mysql - MySQL 版本:
8.4.x或9.7.x - 管理工具:MySQL Shell
建议在新环境执行。
innodb_cluster.yml默认会先跑 Linux 初始化和软件准备流程,例如安装依赖、调整 SELinux、关闭firewalld、写入sysctl,然后再安装 MySQL 与 mysqlshell。MySQL
9.7.x使用glibc2.28包,不支持 CentOS/RHEL 7 系列;这类系统请使用 MySQL8.4.x。
1.1 依赖链
| 项目 | 内容 |
|---|---|
| 前置依赖 | 已完成 dbbotctl env setup;[dbbot_innodb_cluster] inventory 可连通;mysqlshell 安装包可用或允许自动下载 |
| 必填变量 | db_type: mysql、mysql_version: 8.4.x 或 9.7.x、innodb_cluster_primary、innodb_cluster_members、mysql_cluster_admin_user / mysql_cluster_admin_password |
| 后续依赖 | 若应用要通过统一入口连接数据库,继续执行 innodb_cluster_router.yml;若还要采集 Router 指标,再执行 router_exporter_install.yml 并注册到 Prometheus |
2. inventory
innodb_cluster.yml 使用独立主机组:
[dbbot_innodb_cluster]
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 文档保留地址,仅作为示例,请替换成你的实际主机地址。
3. 关键变量
编辑 mysql_ansible/playbooks/common_config.yml:
db_type: mysql
mysql_version: "8.4.9"
mysql_port: 3307
fcs_allow_dbbot_default_passwd: true
如果你暂时沿用 dbbot 公开默认密码做实验,请保留上面的 fcs_allow_dbbot_default_passwd: true。默认值是 false,会在部署前拦截公开默认密码。
编辑 mysql_ansible/playbooks/vars/var_innodb_cluster.yml:
innodb_cluster_name: "myCluster3307"
innodb_cluster_primary: 192.0.2.131
innodb_cluster_members:
- 192.0.2.131
- 192.0.2.132
- 192.0.2.133
说明:
innodb_cluster_primary必须包含在innodb_cluster_members中。innodb_cluster_members至少 3 个节点。mysql_mgr_port默认按mysql_port * 10 + 1自动计算。
4. 安装包准备
至少准备:
- MySQL
8.4.x或9.7.x二进制包 - 与
mysql_version匹配的 MySQL Shell 安装包,或允许控制节点自动下载
如果你使用离线包,请放到 mysql_ansible/downloads/。
如果你把离线包放到自定义目录,请同步修改 mysql_ansible/playbooks/common_config.yml 中的 mysql_packages_dir。
5. 执行部署
cd /usr/local/dbbot/mysql_ansible/playbooks
ansible-playbook innodb_cluster.yml
执行过程中按提示输入 confirm。
6. 部署后验证
在主节点或任一已安装 mysqlshell 的节点执行:
mysqlsh clusteradmin@192.0.2.131:3307
登录后执行:
var cluster = dba.getCluster()
cluster.status()
验证要点:
status返回OK/ONLINE- 三个成员均在线
primary节点与配置一致
7. 启动保护与完整故障恢复
innodb_cluster.yml 为 InnoDB Cluster 节点生成以下启动策略:
super_read_only=ON
group_replication_start_on_boot=ON
group_replication_bootstrap_group=OFF
首次部署期间,剧本会临时解除只读以完成账号和集群初始化。集群创建成功后,MySQL Shell AdminAPI 和 Group Replication 负责运行时角色状态。单个成员 crash 或主机重启后会自动尝试重新加入集群;在成员重新变为 ONLINE 之前,不应直接连接该实例处理业务。通过集群元数据 bootstrap 的 MySQL Router 会根据实时成员状态选择后端。
所有成员同时停止属于完整故障,不能依赖 group_replication_start_on_boot=ON 自动 bootstrap。确认各实例已经启动且没有业务直连写入后,使用 MySQL Shell 从完整故障恢复集群:
var cluster = dba.rebootClusterFromCompleteOutage("myCluster3307")
cluster.status()
恢复前应确认连接的是预期集群,并检查 MySQL Shell 对事务集和候选种子节点的判断。不要把 group_replication_bootstrap_group 持久设置为 ON,也不要在多个节点上手工同时 bootstrap。
8. 常见注意事项
innodb_cluster.yml当前支持 MySQL8.4.x和9.7.x。db_type只能是mysql,不能是percona或greatsql。- 建议先完成基础连通性检查:
ansible dbbot_innodb_cluster -m ping - 如果后续需要应用接入,再继续部署 MySQL Router。详见:MySQL Router 部署说明。