Semi-synchrone Replikation: Lag systematisch überwachen
AI generated
InnoDB
SQL
MySQL · Replikation · Monitoring
Semi-synchrone Replikation
Lag systematisch überwachen statt sich auf ACK-Zeiten zu verlassen

Semi-synchrone Replikation garantiert, dass ein Replica eine Transaktion empfangen hat, bevor der Source den Commit bestätigt. Sie garantiert aber ausdrücklich nicht, dass diese Transaktion auf dem Replica bereits angewendet wurde. Wer diese beiden Größen im Monitoring verwechselt, hält einen Replica für aktuell, der in Wirklichkeit deutlich hinterherhinkt.

12 Min. Lesezeit Monitoring Semi-Sync

1. Unterschied zwischen ACK-Wartezeit und tatsächlichem Replikations-Lag

Die ACK-Wartezeit ist die Zeitspanne, die ein Source auf die Bestätigung mindestens eines Replicas wartet, bevor er den Commit dem Client meldet. Diese Zeit ist üblicherweise sehr kurz, oft im niedrigen einstelligen Millisekundenbereich, weil das Replica lediglich bestätigen muss, dass das Event im eigenen Relay-Log angekommen ist, nicht dass es bereits angewendet wurde. Ein niedriger Wert für diese Wartezeit sagt daher wenig über den tatsächlichen Zustand der Datenbank auf dem Replica aus.

Der tatsächliche Replikations-Lag hingegen misst, wie weit der Apply-Prozess auf dem Replica hinter dem, was im Relay-Log bereits vorliegt, zurückliegt. Diese beiden Größen können weit auseinanderfallen: Ein Replica kann jede Transaktion binnen weniger Millisekunden bestätigen und trotzdem Minuten brauchen, um sie tatsächlich anzuwenden, wenn der SQL-Thread durch komplexe Statements oder Locking-Konflikte ausgebremst wird.

2. Wie das semi-synchrone ACK tatsächlich funktioniert

Semi-synchrone Replikation wird über die Plugins rpl_semi_sync_source auf dem Source und rpl_semi_sync_replica auf dem Replica realisiert. Sobald der Source eine Transaktion committet und die zugehörigen Binlog-Events an mindestens ein Replica gesendet hat, wartet er auf ein ACK-Signal, bevor er den Commit dem aufrufenden Client bestätigt. Dieses ACK sendet das Replica, sobald das empfangene Event im lokalen Relay-Log geschrieben, nicht angewendet, wurde.

Genau diese Design-Entscheidung macht semi-sync deutlich performanter als vollsynchrone Replikation, wie sie etwa Galera oder Group Replication im Zertifizierungsmodus umsetzen, weil kein Warten auf den vollständigen Apply-Vorgang nötig ist. Der Preis dafür ist, dass ein Ausfall des Sources direkt nach dem ACK, aber vor dem tatsächlichen Anwenden auf dem Replica, theoretisch zu einem Replica führen kann, das die Transaktion im Relay-Log, aber noch nicht in seinen Tabellen hat.


-- Auf dem Source
INSTALL PLUGIN rpl_semi_sync_source SONAME 'semisync_source.so';
SET PERSIST rpl_semi_sync_source_enabled = 1;

-- Auf dem Replica
INSTALL PLUGIN rpl_semi_sync_replica SONAME 'semisync_replica.so';
SET PERSIST rpl_semi_sync_replica_enabled = 1;
-- Anschliessend START REPLICA IO_THREAD auf dem Replica erneut ausführen

3. Warum eine niedrige ACK-Zeit nicht bedeutet, dass der Replica aktuell ist

Der Apply-Prozess auf dem Replica läuft historisch als einzelner SQL-Thread pro Kanal, der Events strikt sequenziell anwendet. Selbst mit aktivierter paralleler Replikation über replica_parallel_workers bleibt die Parallelität durch Abhängigkeiten zwischen Transaktionen auf derselben Zeile oder demselben Datenbankschema begrenzt, sodass ein einzelner langsamer Vorgang, etwa ein großes Batch-Update oder ein fehlender Index, den gesamten Apply-Fortschritt spürbar verzögert.

Ein Replica kann daher jede eingehende Transaktion binnen Millisekunden bestätigen und trotzdem einen Apply-Rückstand von mehreren Minuten aufbauen, sobald der SQL-Thread durch ressourcenintensive Operationen blockiert wird. Wer nur die semi-sync-ACK-Metriken überwacht, sieht in diesem Fall ein scheinbar völlig gesundes System, während Leseanfragen an diesen Replica bereits veraltete Daten zurückliefern.

4. Relevante Status-Variablen für semi-sync selbst

Auf dem Source geben Rpl_semi_sync_source_yes_tx und Rpl_semi_sync_source_no_tx Auskunft darüber, wie viele Transaktionen erfolgreich beziehungsweise nicht rechtzeitig bestätigt wurden, letzteres ein Hinweis auf einen Fallback zu asynchroner Replikation. Rpl_semi_sync_source_avg_net_wait_time zeigt die durchschnittliche Netzwerk-Wartezeit auf das ACK, ein Wert, der bei stabilen Netzwerkverbindungen nahezu konstant bleiben sollte.

Ein plötzlicher Anstieg bei Rpl_semi_sync_source_no_tx deutet fast immer auf Netzwerkprobleme oder überlastete Replicas hin, die das ACK-Zeitfenster regelmäßig verpassen. Da dieser Wert kumulativ seit dem letzten Server-Start gezählt wird, ist für ein Dashboard eine Ableitung der Differenz über ein festes Zeitfenster deutlich aussagekräftiger als der absolute Zählerstand.


SHOW STATUS LIKE 'Rpl_semi_sync_source_yes_tx';
SHOW STATUS LIKE 'Rpl_semi_sync_source_no_tx';
SHOW STATUS LIKE 'Rpl_semi_sync_source_avg_net_wait_time';
SHOW STATUS LIKE 'Rpl_semi_sync_source_status';

5. Performance-Schema-Tabellen zur Überwachung des tatsächlichen Apply-Lags

Für den tatsächlichen Rückstand liefert performance_schema.replication_applier_status_by_worker pro Apply-Worker den Zeitstempel der zuletzt angewendeten Transaktion, woraus sich eine präzise Differenz zur aktuellen Zeit berechnen lässt. Diese Tabelle ist deutlich aussagekräftiger als das klassische Seconds_Behind_Source aus SHOW REPLICA STATUS, das bei paralleler Replikation und bei Verbindungsabbrüchen bekanntermaßen ungenaue oder sogar NULL-Werte liefern kann.

Ergänzend zeigt replication_connection_status den zeitlichen Abstand zwischen dem Zeitpunkt, an dem eine Transaktion auf dem Source committet wurde, und dem Zeitpunkt, an dem sie auf dem Replica empfangen wurde, über die Spalten LAST_QUEUED_TRANSACTION_ORIGINAL_COMMIT_TIMESTAMP und LAST_QUEUED_TRANSACTION_IMMEDIATE_COMMIT_TIMESTAMP. Die Kombination beider Tabellen trennt sauber zwischen Netzwerk-Lag und Apply-Lag.


SELECT WORKER_ID,
       TIMESTAMPDIFF(SECOND, APPLYING_TRANSACTION_START_APPLY_TIMESTAMP, NOW())
         AS apply_lag_sekunden
FROM performance_schema.replication_applier_status_by_worker
WHERE SERVICE_STATE = 'ON';

6. Den echten Lag mit einer Heartbeat-Tabelle messen

Für eine anwendungsnahe, vom Replikationsprotokoll unabhängige Lag-Messung hat sich das Heartbeat-Muster bewährt, bekannt aus Werkzeugen wie pt-heartbeat: Eine kleine Tabelle auf dem Source wird in festem Intervall mit einem aktuellen Zeitstempel aktualisiert, dieses Update repliziert wie jede andere Transaktion. Auf dem Replica wird die Differenz zwischen dem gespeicherten Zeitstempel und der lokalen Serverzeit berechnet, was den tatsächlichen End-to-End-Lag inklusive Apply-Zeit unabhängig von internen Replikationsmetriken liefert.

Dieser Ansatz hat den Vorteil, dass er dieselbe Apply-Pipeline durchläuft wie jede reale Anwendungstransaktion und damit realistischer misst als eine reine Metadaten-Abfrage. Für Magento-Umgebungen mit Read Replicas für Reporting oder Suche empfiehlt sich diese Heartbeat-Tabelle zusätzlich zu den internen Metriken, weil sie unmittelbar die für Endnutzer relevante Datenaktualität widerspiegelt.


-- Auf dem Source alle 2 Sekunden per Cron/Event ausgefuehrt
UPDATE heartbeat SET ts = NOW(6) WHERE id = 1;

-- Auf dem Replica ausgewertet
SELECT TIMESTAMPDIFF(MICROSECOND, ts, NOW(6)) / 1000000 AS lag_sekunden
FROM heartbeat WHERE id = 1;

7. Alerting-Schwellenwerte für den Praxisbetrieb

Für die meisten Magento-nahen Setups mit Read Replicas hat sich eine gestaffelte Alarmierung bewährt: eine Warnung ab etwa fünf Sekunden Apply-Lag, die eher informativ ist und auf kurzzeitige Lastspitzen hindeutet, sowie ein kritischer Alarm ab etwa dreißig Sekunden, ab dem Leseanfragen an diesen Replica für zeitkritische Anwendungsfälle wie Bestandsanzeigen oder Bestellstatus aktiv umgeleitet werden sollten. Diese konkreten Werte sind kein Naturgesetz, sondern müssen an die tatsächliche Schreiblast und Fehlertoleranz der jeweiligen Anwendung angepasst werden.

Wichtiger als ein einzelner fixer Schwellenwert ist eine Trendbetrachtung: Ein Lag, der über mehrere Messintervalle hinweg kontinuierlich wächst, signalisiert ein strukturelles Problem, etwa einen dauerhaft überlasteten Replica, während ein kurzer Ausschlag nach einem großen Batch-Import meist unkritisch ist und sich von selbst wieder abbaut. Alerting-Regeln sollten deshalb auf Trend und Dauer reagieren, nicht ausschließlich auf einen einzelnen Momentanwert.

8. Der Fallback-Mechanismus bei überschrittenem ACK-Timeout

Antwortet kein Replica innerhalb der über rpl_semi_sync_source_timeout konfigurierten Zeitspanne, üblicherweise standardmäßig zehn Sekunden, fällt der Source automatisch auf asynchrone Replikation zurück, um Schreibzugriffe der Anwendung nicht unbegrenzt zu blockieren. Dieser Fallback wird über Rpl_semi_sync_source_status sichtbar, das dann von ON auf OFF wechselt, während semi-sync selbst aktiviert bleibt und bei der nächsten erfolgreichen Bestätigung automatisch wieder in den synchronen Modus zurückkehrt.

Für das Monitoring ist entscheidend, diesen Statuswechsel selbst zu überwachen, nicht nur die Lag-Werte, denn ein dauerhafter Fallback in den asynchronen Modus bedeutet, dass die semi-sync-Garantie faktisch nicht mehr greift, obwohl die Konfiguration weiterhin semi-sync ausweist. Ein Alert auf jeden Wechsel von Rpl_semi_sync_source_status auf OFF deckt genau diesen stillen Garantieverlust zuverlässig auf.

9. Praxisbeispiel: ein kompaktes Monitoring-Query-Set für Dashboards

Ein praxistaugliches Dashboard kombiniert typischerweise drei Ebenen: die semi-sync-Statuswerte für die ACK-Garantie selbst, die Performance-Schema-Abfrage für den Apply-Lag pro Worker, sowie die Heartbeat-Tabelle für die End-to-End-Sicht aus Anwendungsperspektive. Alle drei Werte lassen sich mit geringem Aufwand über ein einfaches Cron-Skript regelmäßig abfragen und an ein Monitoring-System wie Prometheus über den mysqld-exporter weiterleiten.

Für Alerting-Regeln empfiehlt sich, alle drei Werte gemeinsam zu betrachten statt isoliert: Ein hoher Apply-Lag bei gleichzeitig normalem semi-sync-Status weist auf ein Performance-Problem des Apply-Threads hin, während ein Fallback-Status bei niedrigem Apply-Lag eher auf ein Netzwerkproblem zwischen Source und Replica hindeutet. Diese Kombination erlaubt eine deutlich präzisere Diagnose als jede einzelne Metrik für sich.

Metrik Quelle Aussage Typischer Schwellenwert
ACK-Wartezeit Rpl_semi_sync_source_avg_net_wait_time Netzwerk-Round-Trip bis zur Empfangsbestätigung Warnung bei deutlichem Anstieg gegenüber Baseline
Apply-Lag pro Worker replication_applier_status_by_worker Tatsächlicher Rückstand des Anwendens auf dem Replica Warnung ab 5s, kritisch ab 30s
End-to-End-Lag Eigene Heartbeat-Tabelle Für Endnutzer spürbare Datenaktualität Abhängig von Anwendungsfall, meist 5 bis 15s
Semi-Sync-Status Rpl_semi_sync_source_status Ob die ACK-Garantie aktuell greift Jeder Wechsel auf OFF sofort alarmieren
Fehlgeschlagene ACKs Rpl_semi_sync_source_no_tx Häufigkeit von ACK-Timeouts Differenz über Zeitfenster statt absolutem Zähler

Mironsoft

Datenbank-Performance, Index-Tuning und Magento-DB-Optimierung

Magento-Shop, der an langsamen Datenbankabfragen leidet?

Wir analysieren MySQL-Datenbanken auf Performance-Bremsen, optimieren Indizes und Abfragen gezielt und richten Backup- und Replikationsstrategien ein, die im Ernstfall wirklich funktionieren.

Performance-Audit

Slow Query Log und Explain-Pläne systematisch auf Engpässe untersuchen.

Index-Optimierung

Indizes gezielt für die tatsächliche Abfragelast des Shops aufbauen.

Backup-Strategie

Zuverlässige Backup- und Restore-Prozesse für produktive Magento-Datenbanken einrichten.

10. Zusammenfassung

Semi-Sync-Lag: Das Wichtigste auf einen Blick

Kernunterschied

ACK bestätigt nur den Empfang im Relay-Log, nicht das tatsächliche Anwenden der Transaktion auf dem Replica.

Beste Quelle für Apply-Lag

performance_schema.replication_applier_status_by_worker liefert präzisere Werte als das klassische Seconds_Behind_Source.

Empfohlene Ergänzung

Eine eigene Heartbeat-Tabelle misst den End-to-End-Lag realistisch, weil sie dieselbe Apply-Pipeline wie Anwendungstransaktionen durchläuft.

Kritisches Signal

Ein Wechsel von Rpl_semi_sync_source_status auf OFF bedeutet stillen Verlust der synchronen Garantie und sollte sofort alarmiert werden.

11. FAQ: Semi-Sync-Lag: Das Wichtigste auf einen Blick

1Garantiert semi-sync, dass ein Replica immer aktuell ist?
Nein, semi-sync garantiert nur, dass mindestens ein Replica die Transaktion im Relay-Log empfangen hat, bevor der Commit bestätigt wird. Das tatsächliche Anwenden auf dem Replica kann davon unabhängig deutlich hinterherhinken.
2Warum ist Seconds_Behind_Source ungenau?
Der Wert kann bei paralleler Replikation, bei Verbindungsabbrüchen und in bestimmten Fehlerzuständen ungenau werden oder sogar NULL liefern. Die Performance-Schema-Tabelle replication_applier_status_by_worker liefert deutlich präzisere Zeitstempel pro Worker.
3Was ist eine Heartbeat-Tabelle und wofür wird sie gebraucht?
Eine kleine Tabelle, die der Source in festem Intervall mit einem aktuellen Zeitstempel aktualisiert. Da dieses Update dieselbe Apply-Pipeline durchläuft wie jede echte Anwendungstransaktion, liefert der Vergleich mit der lokalen Zeit auf dem Replica den realistischen End-to-End-Lag.
4Welcher Schwellenwert für Apply-Lag ist sinnvoll?
Es gibt keinen universellen Wert, in der Praxis hat sich aber eine Warnung ab etwa fünf Sekunden und ein kritischer Alarm ab etwa dreißig Sekunden für Magento-nahe Setups bewährt. Die konkreten Werte sollten an die tatsächliche Fehlertoleranz der jeweiligen Anwendung angepasst werden.
5Was passiert, wenn kein Replica innerhalb des Timeouts antwortet?
Der Source fällt automatisch auf asynchrone Replikation zurück, um Schreibzugriffe nicht unbegrenzt zu blockieren. Dieser Zustand ist über Rpl_semi_sync_source_status sichtbar und sollte separat überwacht werden, da die semi-sync-Garantie in diesem Zustand faktisch nicht mehr greift.
6Kehrt der Server nach einem Fallback automatisch zu semi-sync zurück?
Ja, sobald ein Replica wieder rechtzeitig innerhalb des Timeout-Fensters bestätigt, wechselt der Source automatisch zurück in den synchronen Modus, ohne dass ein manueller Eingriff nötig ist.
7Ist eine niedrige ACK-Wartezeit ein verlässliches Zeichen für Gesundheit?
Nur teilweise, sie zeigt lediglich, dass der Netzwerk-Roundtrip zum Relay-Log-Empfang schnell verläuft. Über den tatsächlichen Apply-Fortschritt auf dem Replica sagt sie nichts aus und sollte immer zusammen mit Apply-Lag-Metriken betrachtet werden.
8Wie unterscheidet sich semi-sync von vollsynchroner Replikation wie Group Replication?
Semi-sync wartet nur auf den Empfang im Relay-Log, nicht auf das vollständige Anwenden oder eine Zertifizierung. Vollsynchrone Verfahren garantieren mehr Konsistenz, kosten dafür aber deutlich mehr Latenz pro Transaktion.
9Sollte ich mehrere Replicas gleichzeitig für semi-sync-ACKs nutzen?
Ja, über rpl_semi_sync_source_wait_for_replica_count lässt sich festlegen, wie viele Replica-Bestätigungen mindestens nötig sind, was die Ausfallsicherheit der Garantie erhöht, allerdings auf Kosten einer potenziell längeren ACK-Wartezeit.
10Wie integriere ich diese Metriken in ein bestehendes Monitoring-System?
Über regelmäßige Abfragen der genannten Status- und Performance-Schema-Werte, meist per Cron-Skript oder direkt über den mysqld-exporter für Prometheus, kombiniert mit Alerting-Regeln, die Trend und Dauer statt nur einzelne Momentanwerte berücksichtigen.