MySQL InnoDB Cluster Deployment Guide

This article explains how to use innodb_cluster.yml to deploy a MySQL InnoDB Cluster.

1. Scope of application

  • Target architecture: three-node InnoDB Cluster
  • Database type: db_type: mysql
  • MySQL version: 8.4.x or 9.7.x
  • Management tool: MySQL Shell

Use a fresh environment whenever possible.

innodb_cluster.yml runs Linux initialization and software preparation before cluster creation, including dependency installation, SELinux changes, stopping firewalld, managed sysctl updates, and package preparation for MySQL and mysqlshell.

MySQL 9.7.x uses glibc2.28 packages and is not supported on the CentOS/RHEL 7 family; use MySQL 8.4.x on those systems.

1.1 Dependency chain

ItemDetails
Prerequisitesdbbotctl env setup is complete, the [dbbot_innodb_cluster] inventory is reachable, and the mysqlshell package is either available offline or allowed to auto-download
Required variablesdb_type: mysql, mysql_version: 8.4.x or 9.7.x, innodb_cluster_primary, innodb_cluster_members, and mysql_cluster_admin_user / mysql_cluster_admin_password
Next stepIf applications need a stable access layer, continue with innodb_cluster_router.yml; if Router metrics are also required, continue with router_exporter_install.yml and register the targets in Prometheus

2. inventory

innodb_cluster.yml uses independent host groups:

[dbbot_innodb_cluster]
192.0.2.131 ansible_user=root ansible_ssh_pass="'<your_password>'"
192.0.2.132 ansible_user=root ansible_ssh_pass="'<your_password>'"
192.0.2.133 ansible_user=root ansible_ssh_pass="'<your_password>'"

The IPs above use RFC 5737 documentation ranges and are examples only. Replace them with your actual host addresses.

3. Key variables

Edit mysql_ansible/playbooks/common_config.yml:

db_type: mysql
mysql_version: "8.4.9"
mysql_port: 3307
fcs_allow_dbbot_default_passwd: true

If you temporarily use dbbot’s public default password for experiments, keep fcs_allow_dbbot_default_passwd: true in the snippet above. The default value is false, so deployment will be blocked before execution otherwise.

Edit 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

Description:

  • innodb_cluster_primary must be included in innodb_cluster_members.
  • innodb_cluster_members at least 3 nodes.
  • mysql_mgr_port is automatically calculated as mysql_port * 10 + 1 by default.

4. Installation package preparation

Prepare at least:

  • MySQL 8.4.x or 9.7.x binary package
  • A MySQL Shell package that matches mysql_version, or allow the control node to download it automatically

If you use the offline package, please put it in mysql_ansible/downloads/.

If you store the offline package in a custom directory, also update mysql_ansible/playbooks/common_config.yml and set mysql_packages_dir to that directory.

5. Execute deployment

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

During execution, enter confirm as prompted.

6. Post-deployment validation

Execute on the master node or any node where mysqlshell is installed:

mysqlsh clusteradmin@192.0.2.131:3307

After logging in, execute:

var cluster = dba.getCluster()
cluster.status()

Validation points:

  • status returns OK / ONLINE
  • All three members are online
  • primary node is consistent with configuration

7. Startup protection and complete-outage recovery

innodb_cluster.yml renders this startup policy for InnoDB Cluster nodes:

super_read_only=ON
group_replication_start_on_boot=ON
group_replication_bootstrap_group=OFF

During initial deployment, the playbook temporarily disables read-only mode to initialize accounts and the cluster. After cluster creation, MySQL Shell AdminAPI and Group Replication manage the runtime role state. A member automatically attempts to rejoin after a process crash or host restart. Do not connect applications directly to that instance until it returns to ONLINE. MySQL Router bootstrapped from the cluster metadata selects backends using the live member state.

A complete outage where every member stopped cannot be bootstrapped safely by group_replication_start_on_boot=ON. After confirming that all instances are running and no application is writing through a direct connection, recover the cluster with MySQL Shell:

var cluster = dba.rebootClusterFromCompleteOutage("myCluster3307")
cluster.status()

Before recovery, verify that you are connected to the intended cluster and review MySQL Shell’s transaction-set and seed-candidate assessment. Never persist group_replication_bootstrap_group=ON, and never bootstrap multiple members manually at the same time.

8. Common precautions

  • innodb_cluster.yml currently supports MySQL 8.4.x and 9.7.x.
  • db_type can only be mysql, not percona or greatsql.
  • It is recommended to complete the basic connectivity check first: ansible dbbot_innodb_cluster -m ping
  • If application access is required later, continue to deploy MySQL Router. See: MySQL Router Deployment Guide.