MySQL InnoDB Cluster 部署说明

本文说明如何使用 innodb_cluster.yml 部署 MySQL InnoDB Cluster。

1. 适用范围

  • 目标架构:三节点 InnoDB Cluster
  • 数据库类型:db_type: mysql
  • MySQL 版本:8.4.x9.7.x
  • 管理工具:MySQL Shell

建议在新环境执行。

innodb_cluster.yml 默认会先跑 Linux 初始化和软件准备流程,例如安装依赖、调整 SELinux、关闭 firewalld、写入 sysctl,然后再安装 MySQL 与 mysqlshell。

MySQL 9.7.x 使用 glibc2.28 包,不支持 CentOS/RHEL 7 系列;这类系统请使用 MySQL 8.4.x

1.1 依赖链

项目内容
前置依赖已完成 dbbotctl env setup[dbbot_innodb_cluster] inventory 可连通;mysqlshell 安装包可用或允许自动下载
必填变量db_type: mysqlmysql_version: 8.4.x9.7.xinnodb_cluster_primaryinnodb_cluster_membersmysql_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.x9.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 当前支持 MySQL 8.4.x9.7.x
  • db_type 只能是 mysql,不能是 perconagreatsql
  • 建议先完成基础连通性检查:ansible dbbot_innodb_cluster -m ping
  • 如果后续需要应用接入,再继续部署 MySQL Router。详见:MySQL Router 部署说明