DBAtlas · Атлас эксплуатации баз данных

Настройка MySQL InnoDB Cluster (Group Replication)

Симптом

Цель: настроить высокую доступность с автоматической отработкой отказа для MySQL с помощью InnoDB Cluster (Group Replication + MySQL Shell + MySQL Router).

1. Выполните предварительные требования

InnoDB Cluster требует MySQL 8.0+, уникальный server_id, режим GTID и движок хранения InnoDB на каждом узле. Все экземпляры должны быть доступны друг другу по сети, а у таблиц должны быть первичные ключи. Подготовьте пользователя clusterAdmin для администрирования.

MySQL

-- my.cnf on each instance:
-- server_id unique, gtid_mode=ON, enforce_gtid_consistency=ON
CREATE USER 'icadmin'@'%' IDENTIFIED BY 'secret';
GRANT ALL PRIVILEGES ON *.* TO 'icadmin'@'%' WITH GRANT OPTION;

2. Настройте каждый экземпляр с помощью MySQL Shell

В mysqlsh dba.configureInstance() подготавливает каждый узел для Group Replication; исправляет недостающие параметры и при необходимости запрашивает перезапуск. Повторите на всех узлах.

MySQL

-- mysqlsh:
dba.configureInstance('icadmin@node1:3306')
dba.configureInstance('icadmin@node2:3306')
dba.configureInstance('icadmin@node3:3306')

3. Создайте кластер (seed-узел)

Подключитесь к одному узлу и создайте кластер через dba.createCluster(); этот узел становится первым primary. Возвращается объект cluster, который используется для последующих добавлений.

MySQL

-- mysqlsh, while connected to node1:
var cluster = dba.createCluster('appCluster')

4. Добавьте остальные экземпляры в кластер

Добавьте secondary-узлы через cluster.addInstance(). В качестве recoveryMethod выберите clone (физическое клонирование, быстро для нового узла) или incremental (через GTID). Минимум 3 узла обеспечивают нечётное большинство и автоматическую отработку отказа.

MySQL

-- mysqlsh:
cluster.addInstance('icadmin@node2:3306', {recoveryMethod: 'clone'})
cluster.addInstance('icadmin@node3:3306', {recoveryMethod: 'clone'})

5. Выполните bootstrap MySQL Router

MySQL Router выполняет маршрутизацию между приложением и кластером; предоставляет порты чтения/записи (6446) и только чтения (6447) и автоматически перенаправляет трафик при смене primary. Bootstrap генерирует конфигурацию из метаданных кластера.

MySQL

mysqlrouter --bootstrap icadmin@node1:3306 --user=mysqlrouter --directory /etc/mysqlrouter
# Then: mysqlrouter -c /etc/mysqlrouter/mysqlrouter.conf &

6. Проверьте состояние кластера и отработку отказа

cluster.status() показывает роль каждого узла (R/W primary, R/O secondary) и состояние (ONLINE). clusterName и топология должны быть в порядке. Протестируйте отработку отказа: остановите primary и наблюдайте автоматический выбор нового primary.

MySQL

-- mysqlsh:
var cluster = dba.getCluster('appCluster')
cluster.status()
-- Members via SQL:
SELECT member_host, member_role, member_state FROM performance_schema.replication_group_members;
Открыть в DBAtlas →