REPL
GTID
SQL · MySQL · Replikation · HA · Magento · Failover
Replikation verstehen: Primary, Replica, Lag und Failover

MySQL Replikation praxisnah: Async vs. Semi-Sync, Binary Log Formate, GTID, Replikations-Lag diagnostizieren, Magento mit Read Replica und Failover mit MHA oder Orchestrator.

GTID Replikation Seconds_Behind_Source MTA Parallel Replikation Magento Read Replica

1. Wie MySQL-Replikation funktioniert

MySQL Replikation ist der Mechanismus, mit dem Änderungen von einem Primary-Server auf einen oder mehrere Replica-Server übertragen werden. Das Grundprinzip ist dabei konstant geblieben: Der Primary schreibt alle Änderungen in das Binary Log. Der Replica liest das Binary Log über einen I/O-Thread und schreibt es lokal als Relay Log. Ein SQL-Thread führt dann die Änderungen aus dem Relay Log auf der Replica aus.

Diese Architektur hat weitreichende Konsequenzen für den Betrieb. Replikation ist standardmäßig asynchron — der Primary wartet nicht darauf, dass die Replica die Änderung übernommen hat. Wenn der Primary ausfällt, bevor die Replica aufgeholt hat, gehen diese Änderungen verloren. Das ist kein Bug, sondern ein Designkompromiss zugunsten niedrigerer Schreiblatenzen.

Für Magento-Shops bedeutet das: Eine Read Replica entlastet den Primary von Leseabfragen aus Reports, Admin-Backend und Drittsystemen — aber sie ist kein Hochverfügbarkeits-Mechanismus ohne zusätzliche Failover-Automatisierung. Beides zusammen ergibt jedoch eine robuste Datenbankarchitektur für mittelgroße bis große Shops.

2. Asynchrone vs. Semi-synchrone Replikation

Die Standard-Replikation in MySQL ist asynchron: Der Primary schreibt die Transaktion ins Binary Log und antwortet dem Client sofort, ohne auf Bestätigung durch die Replica zu warten. Das maximiert die Schreibgeschwindigkeit, kann aber beim Ausfall des Primary zu Datenverlust führen, wenn der Replica-I/O-Thread hinter dem Binary Log zurückliegt.

Semi-synchrone Replikation ist ein Mittelweg: Der Primary wartet nach einem COMMIT darauf, dass mindestens eine Replica die Transaktion ins Relay Log geschrieben — aber noch nicht ausgeführt — hat. Das reduziert das Risiko von Datenverlust beim Failover erheblich, erhöht aber die Schreiblatenz. In MySQL 8.0 ist semi-synchrone Replikation über das rpl_semi_sync_source_*-Plugin verfügbar.

-- Check current replication mode on primary
SHOW VARIABLES LIKE 'rpl_semi_sync%';

-- Check async replication lag (run on replica)
SHOW REPLICA STATUS\G
-- Key fields:
-- Seconds_Behind_Source: estimated lag in seconds
-- Source_Log_File: binary log file on primary that IO thread is reading
-- Read_Source_Log_Pos: position in that file
-- Relay_Source_Log_File: binary log file that SQL thread is applying
-- Exec_Source_Log_Pos: position SQL thread has applied up to
-- Replica_IO_Running: Yes = IO thread is running
-- Replica_SQL_Running: Yes = SQL thread is running
-- Last_Error: last replication error (should be empty)

3. Binary Log Formate: STATEMENT, ROW und MIXED

Das Binary Log Format bestimmt, wie Änderungen auf der Replica angewendet werden. Es hat erheblichen Einfluss auf Log-Größe, Replikationssicherheit und Diagnosierbarkeit. MySQL 8 verwendet standardmäßig ROW-basiertes Format.

STATEMENT-Format: Das Binary Log enthält die ursprünglichen SQL-Statements. Das erzeugt sehr kleine Logs und ist gut lesbar. Es schlägt aber bei nicht-deterministischen Funktionen fehl — NOW(), RAND() oder UUID() liefern auf Primary und Replica unterschiedliche Werte. Das kann zu Datendivergenz führen, die schwer zu erkennen ist.

ROW-Format: Das Binary Log enthält die tatsächlich geänderten Zeilen — nicht das Statement, sondern die Vorher/Nachher-Werte jeder betroffenen Zeile. Das ist größer, aber exakt und sicher. Eine Row-basierte Replikation ist stabil gegenüber nicht-deterministischen Funktionen und funktioniert auch für komplexe Triggers korrekt.

MIXED-Format: MySQL wechselt automatisch zwischen STATEMENT und ROW, abhängig davon, ob ein Statement nicht-deterministisch ist. Das war in älteren MySQL-Versionen ein guter Kompromiss, in MySQL 8 ist ROW jedoch der Standard und in den meisten Setups vorzuziehen.

-- Check the binary log format
SHOW VARIABLES LIKE 'binlog_format';
-- Recommended: ROW for MySQL 8

-- Check binary log position and files (run on primary)
SHOW MASTER STATUS;
SHOW BINARY LOGS;

-- Read binary log events (useful for debugging replication issues)
SHOW BINLOG EVENTS IN 'binlog.000042' LIMIT 20;

-- For ROW format: use mysqlbinlog with --verbose to see row changes
-- mysqlbinlog --verbose --base64-output=DECODE-ROWS binlog.000042 | head -100

4. GTID-Replikation: Einfacheres Failover

GTID (Global Transaction Identifier) ist ein eindeutiger Bezeichner für jede Transaktion im Replikationsverbund. Ein GTID besteht aus der UUID des Servers, auf dem die Transaktion ursprünglich ausgeführt wurde, und einer Sequenznummer: UUID:Sequenznummer, zum Beispiel 3E11FA47-71CA-11E1-9E33-C80AA9429562:23.

Der entscheidende Vorteil von GTID gegenüber der klassischen dateibasierten Replikation: Die Replica weiß genau, welche Transaktionen sie bereits ausgeführt hat und welche noch fehlen. Beim Failover muss kein neues Binary Log File und keine neue Position ermittelt werden — ein neuer Primary wird einfach auf Basis der GTID-Position synchronisiert. Das macht automatisierte Failover-Tools wie MHA und Orchestrator deutlich zuverlässiger.

-- Check if GTID mode is active
SHOW VARIABLES LIKE 'gtid_mode';
SHOW VARIABLES LIKE 'enforce_gtid_consistency';

-- Show which GTIDs have been executed on this server
SELECT @@global.gtid_executed;

-- Show which GTIDs the replica still needs to apply
-- (GTID set difference between primary and replica)
-- Run on replica:
SELECT gtid_subtract(
    '3E11FA47-71CA-11E1-9E33-C80AA9429562:1-100',  -- primary GTID set
    @@global.gtid_executed                           -- replica GTID set
) AS missing_gtids;

-- Set up replication with GTID (MySQL 8 syntax)
-- CHANGE REPLICATION SOURCE TO
--     SOURCE_HOST     = 'primary-host',
--     SOURCE_USER     = 'replication_user',
--     SOURCE_PASSWORD = 'replication_password',
--     SOURCE_AUTO_POSITION = 1;  -- GTID-based, no file/pos needed
-- START REPLICA;

5. Replikations-Lag diagnostizieren

Replikations-Lag ist die Zeitdifferenz, um die der Replica-Stand hinter dem Primary zurückliegt. Das Feld Seconds_Behind_Source in SHOW REPLICA STATUS gibt eine Schätzung — aber diese Schätzung hat eine wichtige Einschränkung: Sie basiert auf dem Timestamp des aktuell angewendeten Events. Wenn der Replica-SQL-Thread wartet, zeigt das Feld 0, obwohl der Replica in Wirklichkeit weit hinter dem Primary liegt.

Das Werkzeug pt-heartbeat aus dem Percona Toolkit löst dieses Problem: Es schreibt regelmäßig einen Timestamp in eine kleine Tabelle auf dem Primary und misst auf der Replica, wie alt dieser Timestamp dort ist. Das ergibt eine präzise, unabhängige Lag-Messung.

-- Basic replica status (run on replica server)
SHOW REPLICA STATUS\G

-- Key fields to monitor for lag:
-- Seconds_Behind_Source   — lag estimate (may be 0 even when lagging)
-- Replica_IO_Running       — should be "Yes"
-- Replica_SQL_Running      — should be "Yes"
-- Last_Error               — should be empty
-- Relay_Log_Space          — size of relay log (large = SQL thread behind)

-- Check relay log size vs. binary log position gap
SELECT
    (SELECT variable_value FROM performance_schema.global_status WHERE variable_name = 'Relay_Log_Space')  AS relay_log_space_bytes;

-- pt-heartbeat setup on primary (run once):
-- CREATE TABLE heartbeat (
--     ts             DATETIME(6) NOT NULL,
--     server_id      INT UNSIGNED NOT NULL,
--     file           VARCHAR(255),
--     position       BIGINT UNSIGNED,
--     relay_master_log_file VARCHAR(255),
--     exec_master_log_pos   BIGINT UNSIGNED,
--     PRIMARY KEY (server_id)
-- );
-- pt-heartbeat --update --database magento_db --daemonize

-- Monitor lag on replica:
-- pt-heartbeat --monitor --database magento_db

6. Lag-Ursachen und Lösungen: MTA und pt-heartbeat

Replikations-Lag entsteht aus mehreren möglichen Quellen. Die häufigste ist die Verarbeitungsgeschwindigkeit: Standardmäßig führt der Replica-SQL-Thread Änderungen seriell aus — ein Thread, eine Transaktion nach der anderen. Wenn der Primary unter Last viele parallele Schreiboperationen ausführt, kann der SQL-Thread der Replica einfach nicht mithalten.

Die Lösung ist Multi-Threaded Applier (MTA) — parallele Replikation. MySQL 8 unterstützt WRITESET-basierte parallele Replikation, die Transaktionen, die keine gemeinsamen Zeilen betreffen, parallel auf der Replica anwenden kann. Das ist deutlich effizienter als die ältere datenbankbasierte Parallelisierung.

-- Enable parallel replication on replica (MySQL 8)
-- Run on replica or set in my.cnf:
SET GLOBAL replica_parallel_workers       = 8;
SET GLOBAL replica_parallel_type         = 'WRITESET';
SET GLOBAL replica_preserve_commit_order = ON;

-- Check current parallel replication settings
SHOW VARIABLES LIKE 'replica_parallel%';
SHOW VARIABLES LIKE 'replica_preserve_commit_order';

-- Identify large transactions causing lag (run on primary)
-- Large single transactions lock the replica SQL thread for their entire duration
SELECT
    trx_id,
    trx_started,
    TIMESTAMPDIFF(SECOND, trx_started, NOW()) AS running_seconds,
    trx_rows_modified,
    trx_rows_locked
FROM information_schema.innodb_trx
WHERE TIMESTAMPDIFF(SECOND, trx_started, NOW()) > 10
ORDER BY running_seconds DESC;

-- Check for replication errors and clear if safe to do so
SHOW REPLICA STATUS\G
-- If Last_Error shows a known safe-to-skip error:
-- SET GLOBAL SQL_REPLICA_SKIP_COUNTER = 1;
-- START REPLICA;

Weitere häufige Lag-Ursachen: lange DDL-Operationen (ALTER TABLE) auf dem Primary sperren die Replica-SQL-Thread für die gesamte Dauer; schwache Replica-Hardware mit langsamerem Storage als der Primary; und zu kleine innodb_buffer_pool_size auf der Replica, die zu mehr Disk-I/O führt.

7. Magento mit Read Replica konfigurieren

Magento unterstützt nativ die Konfiguration einer Read Replica (Slave Connection) über die Datenbankverbindungskonfiguration. Leseabfragen werden dann automatisch auf die Replica geleitet, während Schreiboperationen weiterhin auf dem Primary ausgeführt werden. Wichtig: Da Replikation asynchron ist, kann die Replica kurz hinterherhinken. Für zeitkritische Lesevorgänge direkt nach einem Schreibvorgang muss die Anwendung das berücksichtigen.

-- Verify replica is in sync before enabling in Magento
-- Run on replica:
SHOW REPLICA STATUS\G
-- Seconds_Behind_Source should be 0 or near 0

-- Test read query on replica (to verify it has current data)
SELECT entity_id, increment_id, status, created_at
FROM sales_order
ORDER BY created_at DESC
LIMIT 5;

Die Konfiguration in Magento erfolgt in app/etc/env.php unter dem Schlüssel db. Der slave_connection-Block nimmt die Verbindungsdaten der Replica auf. Magento's Ressourcenmodell leitet dann automatisch Leseabfragen an die Replica-Verbindung weiter.

-- env.php slave_connection configuration (PHP array, shown as reference):
-- 'db' => [
--     'connection' => [
--         'default' => [
--             'host'     => 'primary-host',
--             'dbname'   => 'magento',
--             'username' => 'magento',
--             'password' => 'secret',
--         ],
--         'slave_connection' => [
--             'default' => [
--                 'host'     => 'replica-host',
--                 'dbname'   => 'magento',
--                 'username' => 'magento_readonly',
--                 'password' => 'secret',
--             ],
--         ],
--     ],
-- ],

-- Create a read-only user for the replica connection
-- Run on primary (will replicate to replica):
CREATE USER 'magento_readonly'@'%' IDENTIFIED BY 'strong_password_here';
GRANT SELECT ON magento.* TO 'magento_readonly'@'%';
FLUSH PRIVILEGES;

8. Failover: MHA und Orchestrator

Manueller Failover ist bei einem unerwarteten Primary-Ausfall zu langsam. Tools wie MHA (Master High Availability Manager) und Orchestrator automatisieren diesen Prozess: Sie erkennen den Primary-Ausfall, wählen die am wenigsten zurückliegende Replica aus, synchronisieren die anderen Replicas auf den neuen Stand und promoten die ausgewählte Replica zum neuen Primary.

-- Manual failover checklist on replica (when primary is down):

-- Step 1: Stop replication and check final position
STOP REPLICA;
SHOW REPLICA STATUS\G
-- Note: Exec_Source_Log_Pos — last applied position

-- Step 2: Verify no pending relay log events
SELECT COUNT(*) AS pending_events
FROM performance_schema.replication_applier_status_by_worker;

-- Step 3: Promote replica to primary
RESET REPLICA ALL;
-- Remove slave configuration, this server is now primary

-- Step 4: Verify GTID state on new primary
SELECT @@global.gtid_executed AS committed_transactions;

-- Step 5: Update other replicas to point to new primary
-- CHANGE REPLICATION SOURCE TO
--     SOURCE_HOST        = 'new-primary-host',
--     SOURCE_AUTO_POSITION = 1;  -- GTID-based auto-position
-- START REPLICA;

-- Step 6: Verify other replicas are catching up
SHOW REPLICA STATUS\G

Orchestrator bietet gegenüber MHA zusätzlich ein Web-Interface zur Visualisierung der Replikationstopologie und ermöglicht komplexere Topologien wie Kaskaden-Replikation. Für Magento-Shops mit einer einfachen Primary/Replica-Topologie ist MHA jedoch gut geeignet und einfacher zu betreiben.

Mironsoft

MySQL Replikation für Magento-Shops aufsetzen, überwachen und absichern

Wir helfen dabei, MySQL-Replikation mit GTID, Read Replica für Magento und automatisiertem Failover sicher zu planen und zu betreiben — mit Monitoring und Lag-Alerting inklusive.

Replikations-Setup

GTID-basierte Replikation von Grund auf konfigurieren und testen

Lag-Monitoring

pt-heartbeat und Alerting für Replikations-Lag einrichten

Failover-Plan

MHA oder Orchestrator für automatisierten Failover aufsetzen

10. Zusammenfassung

MySQL Replikation — Das Wichtigste auf einen Blick

Binary Log Format

ROW ist der Standard in MySQL 8 und die sicherste Wahl. STATEMENT ist kleiner, aber fehleranfällig bei nicht-deterministischen Funktionen. MIXED wechselt automatisch.

GTID

Globale Transaction IDs im Format UUID:Sequenz ermöglichen positionsunabhängiges Failover und sind Voraussetzung für MHA und Orchestrator.

Lag-Diagnose

Seconds_Behind_Source ist unzuverlässig — pt-heartbeat liefert präzise Lag-Messungen. MTA mit WRITESET löst Serial-Bottleneck des SQL-Threads.

Magento

slave_connection in env.php leitet Leseabfragen an die Replica. Zeitkritische Reads nach Writes brauchen besondere Behandlung wegen asynchronem Lag.

11. FAQ: MySQL Replikation

1 Was ist MySQL Replikation und wozu dient sie?
MySQL Replikation überträgt Änderungen vom Primary-Server auf einen oder mehrere Replica-Server. Sie dient der Lastverteilung (Read Replica) und der Hochverfügbarkeit (Failover bei Primary-Ausfall).
2 Was ist der Unterschied zwischen asynchroner und semi-synchroner Replikation?
Asynchron: Primary antwortet sofort nach dem COMMIT, ohne auf Replica zu warten — minimale Latenz, aber Datenverlust bei Primary-Ausfall möglich. Semi-synchron: Primary wartet auf Bestätigung durch mindestens eine Replica — mehr Sicherheit, aber höhere Schreiblatenz.
3 Welches Binary Log Format ist für Magento empfehlenswert?
ROW-Format ist der Standard in MySQL 8 und die sicherste Wahl. Es repliziert exakte Zeilenwerte statt SQL-Statements und ist robust gegenüber nicht-deterministischen Funktionen wie NOW() oder UUID().
4 Was ist GTID und warum vereinfacht es Failover?
GTID (Global Transaction Identifier) ist ein eindeutiger UUID:Sequenz-Bezeichner für jede Transaktion. Beim Failover muss keine Binlog-Position ermittelt werden — die Replica synchronisiert sich automatisch anhand der fehlenden GTIDs.
5 Warum ist Seconds_Behind_Source als Lag-Messung unzuverlässig?
Seconds_Behind_Source basiert auf dem Timestamp des gerade angewendeten Events. Wenn der SQL-Thread wartet oder der Relay Log leer ist, zeigt das Feld 0, auch wenn die Replica tatsächlich weit zurückliegt. pt-heartbeat misst den echten Lag präziser.
6 Was ist MTA und wie behebt es Replikations-Lag?
Multi-Threaded Applier (MTA) ermöglicht parallele Ausführung von Transaktionen auf der Replica. Mit replica_parallel_type = WRITESET können Transaktionen, die keine gemeinsamen Zeilen ändern, gleichzeitig angewendet werden — statt seriell Transaktion für Transaktion.
7 Wie konfiguriert man Magento für Read Replica?
In app/etc/env.php unter db.connection.slave_connection.default die Verbindungsdaten der Replica eintragen. Magento leitet dann Leseabfragen automatisch an die Replica-Verbindung weiter.
8 Was ist der Unterschied zwischen MHA und Orchestrator?
MHA ist ein bewährtes, einfach zu konfigurierendes Failover-Tool für einfache Primary/Replica-Topologien. Orchestrator bietet zusätzlich ein Web-Interface, Topologie-Visualisierung und unterstützt komplexere Replikationstopologien.
9 Warum verursachen lange ALTER TABLE-Statements Replikations-Lag?
DDL-Operationen wie ALTER TABLE sperren den Replica-SQL-Thread für ihre gesamte Ausführungsdauer. Während der DDL läuft, sammeln sich weitere Events im Relay Log, die erst danach abgearbeitet werden — das erzeugt sprunghaften Lag.
10 Wie erkennt man, dass die Replikation unterbrochen ist?
In SHOW REPLICA STATUS: Replica_IO_Running oder Replica_SQL_Running ist nicht 'Yes', oder Last_Error enthält eine Fehlermeldung. Ein Monitoring-Alert auf diese Felder ist Pflicht auf jedem Produktivsystem mit Replikation.