DBAtlas · Atlas für Datenbankbetrieb

Einrichtung von MySQL InnoDB Cluster (Group Replication)

Symptom

Ziel: Hochverfügbarkeit mit automatischem Failover für MySQL mit InnoDB Cluster (Group Replication + MySQL Shell + MySQL Router) einrichten.

1. Voraussetzungen erfüllen

InnoDB Cluster erfordert auf jedem Knoten MySQL 8.0+, eine eindeutige server_id, den GTID-Modus und die Storage Engine InnoDB. Alle Instanzen müssen sich gegenseitig über das Netzwerk erreichen, und Tabellen müssen Primärschlüssel haben. Lege einen clusterAdmin-Benutzer für die Administration an.

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. Jede Instanz mit MySQL Shell konfigurieren

In mysqlsh macht dba.configureInstance() jeden Knoten für Group Replication geeignet; es korrigiert fehlende Parameter und fordert bei Bedarf einen Neustart an. Wiederhole das auf allen Knoten.

MySQL

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

3. Cluster erstellen (Seed-Knoten)

Verbinde dich mit einem Knoten und starte den Cluster mit dba.createCluster(); dieser Knoten wird die erste Primary. Zurückgegeben wird ein Cluster-Objekt, das für weitere Ergänzungen verwendet wird.

MySQL

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

4. Die übrigen Instanzen zum Cluster hinzufügen

Füge die Secondary-Knoten mit cluster.addInstance() hinzu. Wähle als recoveryMethod clone (physischer Klon, schnell für einen neuen Knoten) oder incremental (über GTID). Mindestens 3 Knoten sorgen für eine ungerade Mehrheit und automatisches Failover.

MySQL

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

5. MySQL Router bootstrappen

MySQL Router routet zwischen Anwendung und Cluster; er stellt Ports für Lesen/Schreiben (6446) und Read-only (6447) bereit und leitet den Verkehr bei einem Wechsel der Primary automatisch um. Bootstrap erzeugt die Konfiguration aus den Cluster-Metadaten.

MySQL

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

6. Cluster-Status prüfen und Failover verifizieren

cluster.status() zeigt Rolle (R/W Primary, R/O Secondary) und Zustand (ONLINE) jedes Knotens. clusterName und Topologie sollten gesund sein. Teste das Failover, indem du die Primary herunterfährst und die automatische Wahl einer neuen Primary beobachtest.

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;
In DBAtlas öffnen →