Warum sehe ich einen hohen Speicherverbrauch in meiner PostgreSQL-Quelldatenbank, wenn ich eine AWS-DMS-CDC-Aufgabe ausführe?
Ich möchte den hohen Speicherverbrauch in meiner PostgreSQL-Quelldatenbank beheben, wenn ich eine Change Data Capture (CDC, Datenerfassung ändern)-Aufgabe von AWS Database Migration Service (AWS DMS) ausführe.
Kurzbeschreibung
Wenn du PostgreSQL als Quelle für eine CDC-Aufgabe verwendest, verwendet AWS DMS logische PostgreSQL-Replikationsslots, um Änderungen aus der Quelldatenbank abzurufen. In den Slots werden Write-Ahead Logs (WALs, Write-Ahead-Protokolle) gespeichert, die AWS DMS benötigt, auch wenn du keine WALs mit der PostgreSQL-Quelle verbindest. AWS DMS entfernt WALs erst aus PostgreSQL, nachdem es die erforderlichen Änderungen aus dem Replikationsslot abgerufen und den restart_lsn des Replikationsslots vorangetrieben hat.
Weitere Informationen findest du unter Logical decoding concepts (Konzepte zur logischen Decodierung) auf der PostgreSQL-Website.
Probleme mit dem Speichervolumen können aus den folgenden Gründen auftreten:
- Du stoppst die AWS-DMS-CDC-Aufgabe für eine lange Zeit. Wenn du AWS DMS nicht mit der Quelldatenbank verbindest, übernimmt es keine Änderungen aus dem Replikationsslot an der Quelle. PostgreSQL behält also kontinuierlich WALs bei.
- Du hast eine hohe Workload, die zu einer übermäßigen WAL-Generierung führt. Wenn du logische Replikationsslots verwendest, behält PostgreSQL WALs bei, wenn der Replikationsslot die Log Sequence Numbers (LSNs, Protokoll-Sequenznummern) benötigt.
- Du hast inaktive Replikationsslots. Selbst wenn ein Replikationsslot inaktiv ist, enthält das WAL, das der Replikationsslot beibehält, immer noch Informationen über die Tabelle, das Schema oder die Datenbank. Dadurch wird der Speicherplatz in der Quelle aufgefüllt, auch wenn die Tabellen keine Transaktionen enthalten.
Lösung
Prüfen, ob Replikationsslots eine hohe Speicherplatznutzung in der PostgreSQL-Quelle verursachen
Führe eine der folgenden Abfragen aus, um zu überprüfen, ob Replikationsslots eine hohe Speicherplatznutzung in der PostgreSQL-Datenbank verursachen:
Für PostgreSQL v9:
psql=> SELECT slot_name, pg_size_pretty(pg_xlog_location_diff(pg_current_xlog_location(),restart_lsn)) AS replicationSlotLag, active FROM pg_replication_slots ;
Für PostgreSQL v10 und höher:
psql=> SELECT slot_name, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(),restart_lsn)) AS replicationSlotLag, active FROM pg_replication_slots ;
Beispielausgabe:
slot_name | replicationslotlag | active---------------------------------------------------------------+--------------------+-------- xc36ujql35djp_00013322_907c1e0a_9f8b_4c13_89ea_ef0ea1cf143d | 129 GB | f 7pajuy7htthd7sqn_00013322_a27bcebf_7d0f_4124_b336_92d0fb9f5130 | 704 MB | t zp2tkfo4ejw3dtlw_00013322_03e77862_689d_41c5_99ba_021c8a3f851a | 624 MB | t
Wenn für einen Replikationsslot ein aktiver Status auf f (falsch) gesetzt ist, nutzt die Datenbank diesen Slot nicht.
Führe die folgende Abfrage aus, um ungenutzte Slots zu löschen:
psql=> SELECT pg_drop_replication_slot('YOUR_SLOTNAME');
Hinweis: Ersetze YOUR_SLOTNAME durch den Slot-Namen.
Weitere Informationen findest du unter Warum habe ich in Amazon Relational Database Service (Amazon RDS) für PostgreSQL die Fehlermeldung „No space left on device“ oder „DiskFull“ erhalten?
Die WAL-Heartbeat-Funktion aktivieren
Um des Speicherverbrauch in einer PostgreSQL-Quelldatenbank zu reduzieren, aktiviere das Extra Connection Attribute (ECA, Extra Verbindungsattribut) heartbeatEnable. Dieses Attribut hilft, Szenarien mit vollem Speicherplatz in der PostgreSQL-Quelle zu verhindern.
Um die WAL-Heartbeat-Funktion zu aktivieren, füge dem PostgreSQL-Quellendpunkt das folgende ECA hinzu:
heartbeatEnable=Y;
Hinweis: Die Heartbeat-Transaktion wird auf der Quelle nur ausgeführt, wenn eine AWS-DMS-Aufgabe ausgeführt wird. Wenn du AWS-DMS-Aufgaben anhältst, hat die WAL-Heartbeat-Funktion keine Wirkung.
Du kannst auch die folgenden ECAs angeben:
heartbeatFrequency=frequency;heartbeatSchema=schemaname;
Das heartbeatFrequency-Attribut bestimmt, wie oft (in Minuten) die Heartbeat-Transaktion auf der PostgreSQL-Quelle ausgeführt wird. Ersetze frequency durch die Häufigkeit, mit der die Transaktion ausgeführt werden soll. Wenn du beispielsweise heartbeatFrequency auf den Wert 15 setzt, führt AWS DMS die Heartbeat-Transaktion alle 15 Minuten auf der Quelle aus.
Das heartbeatSchema-Attribut gibt an, in welchem Datenbankschema AWS DMS Datenbankobjekte erstellt, um die Heartbeat-Transaktion zu generieren. Ersetze schemaname durch dein Datenbankschema.
Die maximale Größe eines Slots in PostgreSQL festlegen
Du kannst max_slot_wal_keep_size auf die Quelldatenbank in PostgreSQL Version 13 und höher anwenden. Dadurch wird die maximale Anzahl an WALs festgelegt, die Replikationsslots beibehalten können. Weitere Informationen findest du unter max_slot_wal_keep_size auf der PostgreSQL-Website.
Hinweis: Die Einstellung max_slot_wal_keep_size hilft dir, Probleme mit vollem Speicherplatz in der PostgreSQL-Quelle zu vermeiden. Dies kann jedoch dazu führen, dass die PostgreSQL-Quelldatenbank WALs löscht, bevor die AWS-DMS-CDC-Aufgabe die Änderungen aus dem Replikationsslot liest. Dies kann dazu führen, dass die Aufgabe fehlschlägt.
Ähnliche Informationen
Types of PostgreSQL replication slots (Arten von PostgreSQL-Replikationsslots) auf der Hevo-Website
- Sprache
- Deutsch

Relevanter Inhalt
AWS OFFICIALAktualisiert vor einem Jahr
AWS OFFICIALAktualisiert vor 3 Jahren
AWS OFFICIALAktualisiert vor 2 Jahren
AWS OFFICIALAktualisiert vor 6 Monaten