Verteilte Deadlocks in der Aurora Postgre SQL Limitless Database - Amazon Aurora

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Verteilte Deadlocks in der Aurora Postgre SQL Limitless Database

In einer DB-Shard-Gruppe können Deadlocks zwischen Transaktionen auftreten, die auf verschiedene Router und Shards verteilt sind. Beispielsweise werden zwei gleichzeitige verteilte Transaktionen ausgeführt, die sich über zwei Shards erstrecken, wie in der folgenden Abbildung dargestellt.

Verteilter Deadlock bei zwei verteilten Transaktionen.

Die Transaktionen sperren Tabellen und erzeugen Warteereignisse in den beiden Shards wie folgt:

  1. Verteilte Transaktion 1:

    UPDATE table SET value = 1 WHERE key = 'shard1_key';

    Dies hält eine Sperre für Shard 1 aufrecht.

  2. Verteilte Transaktion 2:

    UPDATE table SET value = 2 WHERE key = 'shard2_key';

    Dies hält eine Sperre für Shard 2 aufrecht.

  3. Verteilte Transaktion 1:

    UPDATE table SET value = 3 WHERE key = 'shard2_key';

    Die verteilte Transaktion 1 wartet auf Shard 2.

  4. Verteilte Transaktion 2:

    UPDATE table SET value = 4 WHERE key = 'shard1_key';

    Die verteilte Transaktion 2 wartet auf Shard 1.

In diesem Szenario erkennen weder Shard 1 noch Shard 2 das Problem: Transaktion 1 wartet auf Transaktion 2 auf Shard 2 und Transaktion 2 wartet auf Transaktion 1 auf Shard 1. Aus globaler Sicht wartet Transaktion 1 auf Transaktion 2 und Transaktion 2 wartet auf Transaktion 1. Diese Situation, in der zwei Transaktionen auf zwei verschiedenen Shards aufeinander warten, wird als verteilter Deadlock bezeichnet.

Aurora Postgre SQL Limitless Database kann verteilte Deadlocks automatisch erkennen und lösen. Ein Router in der DB-Shard-Gruppe wird benachrichtigt, wenn eine Transaktion zu lange auf den Erwerb einer Ressource wartet. Der Router, der die Benachrichtigung empfängt, beginnt, die erforderlichen Informationen von allen Routern und Shards innerhalb der DB-Shardgruppe zu sammeln. Der Router beendet dann Transaktionen, die an einem verteilten Deadlock beteiligt sind, bis die restlichen Transaktionen in der DB-Shard-Gruppe weitergeführt werden können, ohne gegenseitig blockiert zu werden.

Sie erhalten die folgende Fehlermeldung, wenn Ihre Transaktion Teil eines verteilten Deadlocks war und dann vom Router beendet wurde:

ERROR: aborting transaction participating in a distributed deadlock

Der rds_aurora.limitless_distributed_deadlock_timeout DB-Cluster-Parameter legt fest, wie lange jede Transaktion auf einer Ressource wartet, bevor der Router aufgefordert wird, nach einem verteilten Deadlock zu suchen. Sie können den Parameterwert erhöhen, wenn Ihre Arbeitslast weniger anfällig für Deadlock-Situationen ist. Die Standardeinstellung ist 1000 Millisekunden (1 Sekunde).

Der verteilte Deadlock-Zyklus wird in den SQL Postgre-Logs veröffentlicht, wenn ein knotenübergreifender Deadlock gefunden und behoben wird. Zu den Informationen über jeden Prozess, der Teil des Deadlocks ist, gehören die folgenden:

  • Koordinatorknoten, der die Transaktion gestartet hat

  • Virtuelle Transaktions-ID (xid) der Transaktion auf dem Koordinatorknoten im Format backend_id/backend_local_xid

  • ID der verteilten Sitzung der Transaktion