Настройка 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;