Datenbank-Replikation verstehen: Von Primary bis Read-Replica
AI generated
SELECT
JOIN
SQL · Data Engineering · Replikation · Hochverfuegbarkeit
Datenbank-Replikation verstehen
Von Primary bis Read-Replica ohne Rateraten

Datenbank-Replikation verteilt Daten von einer Primary-Instanz auf eine oder mehrere Replica-Instanzen, um Leselast zu skalieren und Ausfallsicherheit zu erhoehen. Wer synchrone von asynchroner Replikation nicht sauber unterscheidet, riskiert entweder unnoetige Latenz oder stille Datenverluste im Failover-Fall.

18 Min. Lesezeit Primary · Replica · Replikations-Lag · Failover PostgreSQL · MySQL

1. Was Datenbank-Replikation wirklich loest

Datenbank-Replikation kopiert Daten von einer Primary-Instanz kontinuierlich auf eine oder mehrere Replica-Instanzen. Der Grund ist selten reine Redundanz zum Selbstzweck, sondern zwei sehr konkrete Probleme: Leselast, die eine einzelne Instanz nicht mehr stemmen kann, und Ausfallsicherheit, wenn die Primary-Instanz aus irgendeinem Grund nicht mehr erreichbar ist. Ohne Datenbank-Replikation ist jede Anwendung von der Verfuegbarkeit genau einer Datenbank-Instanz abhaengig, ein Single Point of Failure, der in produktiven Systemen selten akzeptabel ist.

Der Unterschied zwischen guter und schlechter Replikations-Architektur liegt selten in der Technik selbst, sondern im Verstaendnis der Konsistenzgarantien. Wer Datenbank-Replikation als reine Kopie ohne Verzoegerung missversteht, baut Anwendungen, die auf einer Replica lesen und veraltete Daten fuer aktuell halten. Die folgenden Abschnitte erklaeren physische und logische Replikation, synchrone gegenueber asynchroner Replikation, und wie Read-Replicas und Failover-Strategien in der Praxis konfiguriert werden.

2. Physische vs. logische Replikation

Physische Datenbank-Replikation kopiert die Datenbank auf Byte-Ebene: jede Aenderung an Datenseiten wird identisch auf die Replica uebertragen, meist ueber denselben Write-Ahead-Log-Mechanismus, der auch fuer Crash-Recovery genutzt wird. Das Ergebnis ist eine exakte Kopie der Primary-Instanz, inklusive Indizes, Statistiken und interner Struktur. Physische Replikation ist effizient, weil sie keine SQL-Interpretation braucht, hat aber einen Nachteil: Die Replica muss dieselbe Datenbank-Version und dieselbe Architektur haben wie die Primary.

Logische Datenbank-Replikation repliziert auf Ebene von Aenderungsoperationen (INSERT, UPDATE, DELETE), nicht auf Byte-Ebene. Das erlaubt Flexibilitaet, die physische Replikation nicht bietet: unterschiedliche Datenbank-Versionen zwischen Primary und Replica, selektive Replikation nur bestimmter Tabellen, und sogar Replikation zwischen unterschiedlichen Datenbank-Engines. Der Preis dafuer ist ein hoeherer Verarbeitungsaufwand, weil jede Aenderung interpretiert und erneut angewendet werden muss.


-- PostgreSQL: set up physical streaming replication
-- On the primary (postgresql.conf)
-- wal_level = replica
-- max_wal_senders = 10

-- On the replica: base backup, then recovery config
-- pg_basebackup -h primary_host -D /var/lib/postgresql/data -U replicator -P

-- Check replication status on the primary
SELECT client_addr, state, sync_state, replay_lag
FROM pg_stat_replication;

-- Logical replication: publication on primary, subscription on replica
CREATE PUBLICATION orders_pub FOR TABLE orders;
-- On the replica
CREATE SUBSCRIPTION orders_sub
CONNECTION 'host=primary_host dbname=shop user=replicator'
PUBLICATION orders_pub;

3. Synchrone vs. asynchrone Replikation

Bei synchroner Datenbank-Replikation bestaetigt die Primary-Instanz eine Transaktion erst dann als committed, wenn mindestens eine Replica die Aenderung ebenfalls bestaetigt hat. Das garantiert, dass ein committeter Datensatz niemals verloren geht, selbst wenn die Primary unmittelbar danach ausfaellt. Der Preis ist erhoehte Latenz bei jeder Schreiboperation, weil auf die Netzwerk-Bestaetigung der Replica gewartet werden muss, was bei geografisch entfernten Replicas spuerbar wird.

Asynchrone Datenbank-Replikation bestaetigt eine Transaktion sofort auf der Primary, unabhaengig davon, ob die Replica die Aenderung bereits erhalten hat. Das minimiert Schreib-Latenz, hat aber eine ernste Konsequenz: Faellt die Primary genau zwischen Commit und Uebertragung an die Replica aus, gehen die letzten Transaktionen unwiederbringlich verloren. Die meisten produktiven Systeme nutzen asynchrone Replikation fuer Read-Replicas und reservieren synchrone Replikation fuer Faelle, in denen Datenverlust inakzeptabel ist, etwa bei Finanztransaktionen.

4. Read-Replicas fuer Leselast-Verteilung

Eine Read-Replica ist eine schreibgeschuetzte Kopie der Primary-Datenbank, die ausschliesslich Leseanfragen bedient. Diese Form der Datenbank-Replikation loest ein sehr konkretes Skalierungsproblem: Bei stark lesenden Anwendungen (Reporting-Dashboards, Produktkataloge, Suchfunktionen) ist die Leselast oft um Groessenordnungen hoeher als die Schreiblast. Statt die Primary mit dieser Leselast zu belasten, verteilt man Leseanfragen auf mehrere Read-Replicas und entlastet die Primary fuer Schreiboperationen.

Wichtig ist, dass Anwendungscode explizit zwischen Lese- und Schreibverbindung unterscheidet, meist ueber einen Connection-Router oder ein Datenbank-Proxy wie PgBouncer oder ProxySQL. Eine haeufige Fehlerquelle: Eine Anwendung schreibt auf die Primary und liest unmittelbar danach von einer Replica, bevor die Aenderung dort angekommen ist, der Nutzer sieht seine eigene Aenderung nicht. Dieses Problem heisst Read-after-Write-Konsistenz und muss bei Datenbank-Replikation explizit adressiert werden, etwa durch gezieltes Lesen von der Primary direkt nach einem Schreibvorgang.

5. Replikations-Lag verstehen und messen

Replikations-Lag ist die Zeitspanne zwischen einer Aenderung auf der Primary und ihrer Ankunft auf einer Replica. Bei asynchroner Datenbank-Replikation ist dieser Lag niemals exakt null, sondern schwankt je nach Netzwerklatenz, Schreiblast auf der Primary und Ressourcen der Replica. Wachsender Lag ist ein Fruehwarnsignal: Entweder die Replica-Hardware ist unterdimensioniert, oder die Schreiblast auf der Primary uebersteigt die Verarbeitungskapazitaet der Replica.

Monitoring des Replikations-Lags gehoert zu jedem produktiven Replikations-Setup. In PostgreSQL liefert pg_stat_replication den Lag in Bytes und optional in Zeit, in MySQL zeigt SHOW REPLICA STATUS den Wert Seconds_Behind_Source. Alerting bei einem Lag oberhalb eines definierten Schwellwerts verhindert, dass Anwendungen unbemerkt stark veraltete Daten von einer Replica lesen.


-- MySQL: check replication lag on a replica
SHOW REPLICA STATUS\G
-- Look for: Seconds_Behind_Source, Replica_IO_Running, Replica_SQL_Running

-- PostgreSQL: replication lag in bytes and time on the primary
SELECT
  client_addr,
  pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS lag_bytes,
  replay_lag
FROM pg_stat_replication;

-- Alert threshold example: fail health check if lag exceeds 30 seconds
SELECT CASE
  WHEN EXTRACT(EPOCH FROM replay_lag) > 30 THEN 'UNHEALTHY'
  ELSE 'HEALTHY'
END AS replica_status
FROM pg_stat_replication
LIMIT 1;

6. Failover-Strategien beim Primary-Ausfall

Faellt die Primary-Instanz aus, muss eine der Replicas zur neuen Primary befoerdert werden, ein Prozess namens Failover. Manuelles Failover, bei dem ein Mensch den Ausfall erkennt und die Beforderung ausloest, ist einfach zu verstehen, aber langsam, oft mehrere Minuten. Automatisches Failover mit Werkzeugen wie Patroni oder Orchestrator erkennt den Ausfall selbststaendig und promotet eine geeignete Replica innerhalb von Sekunden, birgt aber ein eigenes Risiko: Split-Brain, bei dem zwei Instanzen gleichzeitig glauben, die Primary zu sein.

Ein robustes Failover-Setup fuer Datenbank-Replikation nutzt einen externen Konsens-Mechanismus (etwa etcd oder Consul), um eindeutig festzulegen, welche Instanz die Primary ist, statt sich auf lokale Heuristiken einzelner Knoten zu verlassen. Nach einem Failover muessen zudem alle verbleibenden Replicas neu auf die neue Primary ausgerichtet werden, und Anwendungsverbindungen muessen automatisch auf die neue Primary umgeleitet werden, meist ueber einen virtuellen Hostnamen oder einen Proxy.


-- Check current replica status before promoting it during failover
SELECT pg_is_in_recovery(); -- true on a replica, false on a primary

-- Promote a PostgreSQL replica to become the new primary
-- (executed by the failover tool, e.g. Patroni, not manually in normal operation)
SELECT pg_promote();

-- After promotion, verify the new primary accepts writes
INSERT INTO health_check (checked_at) VALUES (NOW());

7. Multi-Primary-Replikation und ihre Fallstricke

Multi-Primary-Replikation erlaubt Schreiboperationen auf mehreren Instanzen gleichzeitig, statt sie auf eine einzige Primary zu beschraenken. Das klingt attraktiv fuer geografisch verteilte Anwendungen, bringt aber ein grundlegendes Problem mit sich: Konflikterkennung. Werden dieselbe Zeile auf zwei verschiedenen Primaries gleichzeitig geaendert, muss ein Konfliktloesungsmechanismus entscheiden, welche Aenderung gewinnt, meist ueber Last-Write-Wins oder anwendungsspezifische Logik.

In der Praxis ist Multi-Primary-Datenbank-Replikation deutlich komplexer zu betreiben als ein einfaches Primary-Replica-Modell und wird meist nur eingesetzt, wenn geografisch verteilte Schreiblast einen echten geschaeftlichen Vorteil bringt. Fuer die meisten Anwendungen ist ein einzelnes Primary mit mehreren Read-Replicas ausreichend und deutlich einfacher zu betreiben, zu debuggen und zu ueberwachen.


-- Last-write-wins conflict resolution: a common pattern for multi-primary setups
CREATE TABLE customer_profile (
  customer_id INT PRIMARY KEY,
  email VARCHAR(200),
  updated_at TIMESTAMP NOT NULL,
  origin_node VARCHAR(50) NOT NULL
);

-- Conflict resolution logic applied during replication merge:
-- keep the row with the most recent updated_at, break ties by origin_node
SELECT DISTINCT ON (customer_id) *
FROM customer_profile
ORDER BY customer_id, updated_at DESC, origin_node ASC;

8. Replikation in der Anwendung beruecksichtigen

Anwendungscode muss Datenbank-Replikation aktiv beruecksichtigen, statt sie als transparente Infrastruktur-Angelegenheit zu behandeln. Kritische Leseoperationen unmittelbar nach einem Schreibvorgang gehoeren auf die Primary geroutet, nicht auf eine Replica mit unbekanntem Lag. Weniger kritische Leseoperationen, etwa fuer Reporting oder Analytics, koennen problemlos auf Replicas laufen, selbst mit mehreren Sekunden Verzoegerung.

Ein bewaehrtes Muster ist das explizite Markieren von Datenbank-Verbindungen als read-write oder read-only im Anwendungscode, kombiniert mit einem Connection-Router, der diese Markierung respektiert. So bleibt die Entscheidung, ob eine Query auf die Primary oder eine Replica geht, eine bewusste, testbare Entscheidung, statt eines impliziten Zufallsergebnisses eines Load Balancers.


-- Example: explicit read/write connection routing at the application layer
-- Write connection: always the primary
-- DSN: postgresql://app_user@primary.internal:5432/shop

-- Read connection: routed to a replica pool via a proxy
-- DSN: postgresql://app_user@replica-pool.internal:5432/shop

-- Critical read right after a write: force primary explicitly
BEGIN;
UPDATE orders SET status = 'paid' WHERE order_id = 1001;
COMMIT;

-- Immediately re-reading order 1001 must use the primary connection,
-- not the replica pool, to guarantee read-after-write consistency
SELECT status FROM orders WHERE order_id = 1001; -- via primary DSN

-- Non-critical reporting query: safe to run on any replica
SELECT region, SUM(total_amount)
FROM orders
WHERE created_at > NOW() - INTERVAL '30 days'
GROUP BY region; -- via replica-pool DSN

9. Replikationsmodelle im Vergleich

Die Wahl des richtigen Replikationsmodells haengt von Konsistenzanforderungen, Latenztoleranz und Betriebsaufwand ab.

Modell Datenverlust-Risiko Schreib-Latenz Betriebsaufwand
Asynchron, einzelne Replica Gering bis mittel Niedrig Niedrig
Synchron, einzelne Replica Sehr gering Hoch Mittel
Automatisches Failover Gering Modellabhaengig Hoch
Multi-Primary Konfliktrisiko Niedrig lokal Sehr hoch

Fuer die meisten Anwendungen ist asynchrone Datenbank-Replikation mit einer oder mehreren Read-Replicas und automatisiertem Failover ein guter Kompromiss zwischen Betriebsaufwand und Ausfallsicherheit. Synchrone Replikation lohnt sich nur, wenn Datenverlust im Failover-Fall geschaeftlich inakzeptabel ist, und Multi-Primary sollte die Ausnahme bleiben, nicht die Standard-Architektur.

Mironsoft

Data Engineering, Hochverfuegbarkeit und Replikations-Architektur

Datenbank-Replikation, die im Ernstfall zuverlaessig failovert?

Wir konfigurieren Read-Replicas, automatisches Failover und Monitoring fuer den Replikations-Lag, damit euer Primary-Ausfall kein Produktionsvorfall wird.

Replica-Setup

Read-Replicas und Connection-Routing fuer Lese- und Schreibpfade konfigurieren

Failover-Automation

Patroni oder aequivalente Werkzeuge fuer automatisches Failover einrichten

Lag-Monitoring

Alerting auf Replikations-Lag, bevor Anwendungen veraltete Daten ausliefern

10. Zusammenfassung

Datenbank-Replikation loest zwei zentrale Probleme: Verteilung von Leselast auf mehrere Instanzen und Ausfallsicherheit gegenueber dem Verlust der Primary-Instanz. Physische Replikation kopiert auf Byte-Ebene und ist effizient, logische Replikation repliziert Aenderungsoperationen und bietet mehr Flexibilitaet. Synchrone Replikation verhindert Datenverlust um den Preis hoeherer Latenz, asynchrone Replikation minimiert Latenz um den Preis eines moeglichen Datenverlusts im Failover-Fall.

Read-Replicas entlasten die Primary bei lesehastigen Anwendungen, muessen aber mit Read-after-Write-Konsistenz im Anwendungscode explizit beruecksichtigt werden. Automatisches Failover reduziert Ausfallzeiten drastisch, erfordert aber einen robusten Konsens-Mechanismus, um Split-Brain zu vermeiden. Wer Datenbank-Replikation richtig konfiguriert, gewinnt Skalierbarkeit und Ausfallsicherheit, ohne stille Konsistenzprobleme in Kauf zu nehmen.

Datenbank-Replikation verstehen — Das Wichtigste auf einen Blick

Physisch vs. logisch

Physisch kopiert Byte-Ebene und ist effizient, logisch repliziert Aenderungsoperationen und ist flexibler.

Synchron vs. asynchron

Synchron verhindert Datenverlust bei hoeherer Latenz, asynchron minimiert Latenz mit Restrisiko.

Read-Replicas

Entlasten die Primary bei Leselast, Read-after-Write-Konsistenz aktiv im Code beruecksichtigen.

Failover

Automatisches Failover mit Konsens-Mechanismus, um Split-Brain-Situationen zu vermeiden.

11. FAQ: Datenbank-Replikation verstehen

1Was ist Datenbank-Replikation?
Kontinuierliches Kopieren von Daten der Primary auf Replicas, fuer Leselast-Verteilung und Ausfallsicherheit.
2Physisch vs. logisch?
Physisch kopiert byte-genau ueber das WAL, logisch repliziert einzelne Aenderungsoperationen.
3Synchron vs. asynchron?
Synchron verhindert Datenverlust mit hoeherer Latenz, asynchron minimiert Latenz mit Restrisiko.
4Was ist eine Read-Replica?
Schreibgeschuetzte Kopie fuer Leseanfragen, entlastet die Primary bei Leselast.
5Was ist Replikations-Lag?
Verzoegerung zwischen Aenderung auf Primary und Ankunft auf Replica, sollte ueberwacht werden.
6Was ist Read-after-Write-Konsistenz?
Nutzer sieht eigene Aenderung nicht, wenn sofort von einer verzoegerten Replica gelesen wird.
7Was ist Failover?
Beforderung einer Replica zur neuen Primary bei Ausfall, manuell oder automatisiert.
8Was ist Split-Brain?
Zwei Instanzen glauben gleichzeitig, die Primary zu sein, meist nach fehlerhaftem Failover.
9Was ist Multi-Primary-Replikation?
Mehrere Instanzen akzeptieren Schreiboperationen gleichzeitig, mit Konflikterkennungsproblemen.
10Wann synchrone Replikation nutzen?
Wenn Datenverlust geschaeftlich inakzeptabel ist, sonst reicht asynchrone Replikation mit Monitoring.