Warum sehe ich einen hohen Speicherverbrauch in meiner PostgreSQL-Quelldatenbank, wenn ich eine AWS-DMS-CDC-Aufgabe ausführe?

Letzte Aktualisierung: 25.07.2022

Ich führe einen AWS Database Migration Service (AWS DMS) Change-Data-Capture-Task (CDC) aus und verwende eine PostgreSQL-Datenbank als Quelle. Warum sehe ich einen hohen Speicherverbrauch in meiner Quelldatenbank, wenn ich eine AWS-DMS-CDC-Aufgabe ausführe?

Kurzbeschreibung

Wenn Sie PostgreSQL als Quelle für eine CDC-Aufgabe verwenden, verwendet AWS DMS logische Replikationssteckplätze, eine PostgreSQL-Funktion, um Änderungen aus der Quelldatenbank abzurufen. Diese Slots stellen einen Stream von Vorgängen dar, die in derselben Reihenfolge wiedergegeben werden, in der sie in der PostgreSQL-Quelldatenbank ausgeführt wurden.

Logische Replikationssteckplätze schulen standardmäßig die von AWS DMS benötigten Übersetzungsprotokolle (WAL) neu, auch wenn sie nicht mit der PostgreSQL-Quelle verbunden sind. Daher wird WAL erst dann aus PostgreSQL entfernt, nachdem AWS DMS bestätigt hat, dass es die benötigten Änderungen aus dem Replikationssteckplatz abgerufen hat. AWS DMS bestätigt, dass es die erforderlichen Änderungen hat, indem es den Wert restart_lsn des Replikationssteckplatzes erweitert.

Ursachen für hohen Speicherverbrauch auf einer PostgreSQL-Quelle

Aufgrund der Art und Weise, wie PostgreSQL die Funktion des logischen Replikationssteckplatzes implementiert, können in einigen Szenarien Probleme mit dem Speichervolume in der Quelldatenbank auftreten.

  • Die AWS-DMS-CDC-Aufgabe wird für eine lange Zeit angehalten. Dies bedeutet, dass AWS DMS nicht mit der Quelldatenbank verbunden ist und keine Änderungen aus dem Replikationssteckplatz auf der Quelle verwendet. Das bedeutet, dass PostgreSQL kontinuierlich WAL beibehält, ohne ältere WAL zu löschen, die nicht von AWS DMS gelesen wurde. Der Speicher in der Quelldatenbank füllt sich also irgendwann.
  • Hohe Workload – Hohe Workloads, die zu einer übermäßigen WAL-Generierung führen, können auch dazu führen, dass der Speicher in einer PostgreSQL-Datenbank voll wird, wenn die logischen Replikationssteckplätze verwendet werden. Dies geschieht, weil die WAL weiterhin von PostgreSQL beibehalten wird, wenn die Protokollsequenznummern (LSNs) vom Replikationssteckplatz benötigt werden.
  • Replikationssteckplätze im Leerlauf – Auch wenn eine Tabelle, ein Schema oder eine Datenbank, von der AWS DMS Änderungen repliziert, inaktiv ist, enthält die vom Replikationssteckplatz aufbewahrte WAL immer noch Informationen über diese Tabelle, dieses Schema oder diese Datenbank. Dies führt dazu, dass der Speicher in der Quelle voll wird, auch wenn in den Tabellen keine Transaktionen stattfinden.

Auflösung

Überprüfen Sie, ob Replikationssteckplätze eine hohe Speicherplatznutzung auf der PostgreSQL-Quelle verursachen

Um zu überprüfen, ob Replikationssteckplätze die Ursache für eine hohe Speicherplatznutzung in Ihrer PostgreSQL-Datenbank sind, führen Sie die Abfragen aus, die unter Warum wurde bei Amazon RDS für PostgreSQL die Fehlermeldung „Kein Speicherplatz auf dem Gerät vorhanden“ oder „DiskFull“ angezeigt?

Hinweis: Viele dieser Abfragen können in selbstverwalteten PostgreSQL-Installationen verwendet werden.

Schalten Sie die WAL-Heartbeat-Funktion ein

Aktivieren Sie die AWS-DMS-WAL-Heartbeat-Funktion, um den Speicherverbrauch in einer PostgreSQL-Quelldatenbank zu vermeiden. Diese Funktion ahmt eine Dummy-Transaktion nach, sodass logische Replikationssteckplätze im Leerlauf nicht an alten WAL-Protokollen festhalten. Dieser Heartbeat hält restart_lsn in Bewegung und verhindert, dass sich der Speicherplatz auf der PostgreSQL-Quelle füllt.

Um die WAL-Heartbeat-Funktion zu aktivieren, fügen Sie dem PostgreSQL-Quellendpunkt dieses zusätzliche Verbindungsattribut (ECA) hinzu:

heartbeatEnable=Y;

Geben Sie optional diese zusätzlichen ECAs an:

heartbeatFrequency=frequency;heartbeatSchema=schemaname;

HeartbeatFrequency bestimmt, wie oft (in Minuten) die Heartbeat-Transaktion auf der PostgreSQL-Quelle ausgeführt wird. Wenn Sie beispielsweise HeartbeatFrequency auf einen Wert von 15 festlegen, führt AWS DMS die Heartbeat-Transaktion alle 15 Minuten auf der Quelle aus.

HeartbeatSchema gibt an, in welchem Datenbankschema AWS DMS Datenbankobjekte zur Generierung der Heartbeat-Transaktion erstellt.

Hinweis: Die Heartbeat-Transaktion wird nur auf der Quelle ausgeführt, wenn eine AWS-DMS-Aufgabe ausgeführt wird. Wenn Ihre AWS-DMS-Aufgaben angehalten werden, hat die WAL-Heartbeat-Funktion keine Wirkung.

Begrenzen Sie die Größe eines Steckplatzes in PostgreSQL

Sie können max_slot_wal_keep_size auf die Quelldatenbank in PostgreSQL 13 und höher anwenden. Dadurch wird die maximale Menge an WAL festgelegt, die von Replikationssteckplätzen beibehalten werden kann.

Hinweis: Die Einstellung max_slot_wal_keep_size kann Ihnen helfen, Probleme mit vollem Speicher in der PostgreSQL-Quelle zu vermeiden. Es kann aber auch dazu führen, dass WAL aus der Quelle gelöscht wird, bevor die AWS-DMS-CDC-Aufgabe ihre Änderungen aus dem Replikationssteckplatz lesen kann. Die Aufgabe schlägt also fehl.