Wie Lakebase Postgres langsame Datenbankwiederherstellungen durch nahezu sofortige, Branch-basierte Wiederherstellungen ersetzt, um 100 TB in Sekundenschnelle wiederherzustellen.
von Cassie Murray und Carlota Soto
Bei verwalteten OLTP-Systemen waren Wiederherstellungen schon immer quälend langsam, und mit zunehmender Größe werden sie noch langsamer. Das bedeutet oft, dass große Produktionsdatenbanken, bei denen Ausfallzeiten am teuersten sind, am längsten auf eine Wiederherstellung warten müssen.
Die üblichen Behelfslösungen sind schwierig, teuer und risikoreich. Sie erfordern zusätzliche Replikate, zusätzliche Umgebungen und sogar einen DBA bei der Wiederherstellung, was jedoch keinen vollständigen Schutz garantiert. Ein Failover auf ein fehlerfreies Replikat hilft, wenn eine Maschine ausfällt, aber es hilft nicht, wenn der fehlerhafte Schreibvorgang bereits auf dem Standby-System vorhanden ist. Das bedeutet immer noch eine Wiederherstellung, und eine Wiederherstellung kann stundenlange Ausfallzeiten bedeuten.
Dieses Problem wird durch die Architektur traditioneller verwalteter OLTP-Systeme verursacht. Compute und Storage werden als eine einzige Maschine bereitgestellt. Eine Wiederherstellung beginnt mit der Bereitstellung einer neuen Instanz (und schon warten Sie); Snapshots befinden sich im Objektspeicher, während Postgres auf diesem Volume ausgeführt wird, sodass der Snapshot erst auf die Festplatte geladen werden muss (weiteres Warten); das WAL-Replay muss dann die Lücke zwischen dem Snapshot-Zeitpunkt und dem genauen Wiederherstellungszeitstempel schließen (noch mehr Warten). Mit wachsender Datenbank wird dies immer langsamer und teurer.
Die Lakebase-Postgres-Architektur bricht den Monolithen auf und verändert die Wiederherstellungsmechanik. Bei Lakebase sind Compute und Storage entkoppelt, und der Datenbankverlauf wird bereits so im Objektspeicher aufbewahrt, dass direkt darauf verwiesen werden kann. In dieser Architektur werden bei einer Wiederherstellung keine Daten auf eine neue Festplatte kopiert. Stattdessen wird einfach ein Branch zu einem bestimmten Zeitstempel erstellt – ein einfacher Metadatenvorgang statt eines mehrstündigen Kopier- und Replay-Prozesses.
In der Praxis schrumpft die Wiederherstellungszeit auf Sekunden, selbst wenn die Datenbank 100 TB groß ist. Und es ist so einfach, dass ein Agent es erledigen kann.

Die traditionelle Point-in-Time-Wiederherstellung (PITR) von Postgres basiert auf zwei Komponenten: einem Basis-Backup der Dateien und dem archivierten WAL für alles, was nach diesem Backup passiert ist. In einer verwalteten Postgres-Umgebung wie Amazon RDS ist dieses Backup in der Regel ein Snapshot, der im Objektspeicher liegt.
Die „Wiederherstellung aus dem Backup“ zu einem bestimmten Zeitpunkt T ist eigentlich ein Prozess, der aus drei Teilen besteht:
Dies erfordert die Bereitstellung von Compute- und Storage-Volumes (gekoppelt), die mindestens der primären Instanz entsprechen. Eine kleine Instanz kann in wenigen Minuten hochgefahren werden, aber eine große Instanz mit großen EBS-Volumes dauert in der Regel länger, sodass Sie warten müssen, bevor Sie überhaupt mit dem Wiederherstellungsprozess beginnen können.
RDS-Snapshots befinden sich in S3. „Wiederherstellen“ bedeutet also, diesen Snapshot aus dem Objektspeicher auf die Festplatte von Postgres zu übertragen.
Dieser Prozess ist bei großen Datenmengen langsam, weshalb RDS nicht auf den Abschluss wartet, bevor die wiederhergestellte Instanz als available bereitgestellt wird. Bei großen Volumes geschieht dies, während sich die meisten Tabellen- und Indexseiten noch in S3 befinden. Aber „verfügbar“ bedeutet nicht, dass sich der Working Set auf dem Postgres-Volume befindet. Wenn eine Abfrage einen Block betrifft, der noch nicht lokal vorhanden ist, ruft das Volume ihn sofort aus S3 ab, während der Rest im Hintergrund weiter geladen wird.
Diese Arten von Abfragen sind mit einer Latenz verbunden, die für eine interne Überprüfung in Ordnung ist, nicht aber für die Produktion. Die Wiederherstellung ist erst abgeschlossen, wenn sich die tatsächlich benötigten Daten auf dem Volume befinden, und das geht bei einer großen Datenbank nicht schnell. Je größer die Datenbank ist, desto mehr Zeit (in Stunden) wird dies in Anspruch nehmen.
Der Snapshot ist nur zum Zeitpunkt des Snapshots konsistent. Um T zu erreichen, muss Postgres noch die nach diesem Snapshot archivierten Transaktionsprotokolle einspielen. Wie lange dieses Replay dauert, hängt davon ab, wie viel zwischen dem Snapshot und T passiert ist. Ein Snapshot von vor einer Stunde ist viel schneller eingespielt als ein Snapshot von letzter Nacht. Wenn Sie zudem einen schreibintensiven Tag hatten, müssen viele WAL-Daten eingespielt werden. Auch das bedeutet wieder eine lange Wartezeit (zusätzlich dazu, dass die Instanz immer noch Daten aus S3 nachlädt).
Sofern die Datenbank nicht klein ist, ist PITR fast immer ein mehrstündiger Vorgang. Sie müssen den Monolithen bereitstellen, einen Snapshot aus S3 abrufen, das WAL einspielen und warten, bis genügend Daten des Volumes lokal vorhanden sind, um Datenverkehr aufzunehmen.
Während dieses gesamten Zeitfensters kann es zu Ausfallzeiten kommen. Ein fehlerfreies, hochverfügbares (HA) Replikat kann Sie retten, wenn die primäre Instanz ausfällt und das Replikat noch über intakte Daten verfügt. Es schützt Sie jedoch möglicherweise nicht vor den Folgen, die eine PITR erfordern – gelöschte Tabellen und fehlerhafte Schreibvorgänge befinden sich möglicherweise bereits auf dem Standby-System.
In einer Umfrage wurden 50 Entwickler, die produktive Postgres-Datenbanken mit mehr als 1 TB betreiben, nach ihren Erfahrungen mit Wiederherstellungen gefragt:
Dies führte zu potenziell negativen geschäftlichen Auswirkungen:

In Lakebase Postgres ermöglicht eine moderne Architektur einen anderen Weg für Wiederherstellungen.
Compute und dauerhafter Storage sind voneinander getrennt und über das WAL verbunden. Compute führt Postgres aus, was bedeutet, dass es SQL ausführt, Abfragen plant, MVCC anwendet, Sperren verwaltet und WAL generiert (alle regulären Postgres-Aufgaben). Was es jedoch nicht tut, ist, die dauerhafte Kopie Ihrer Daten zu besitzen.
Der Storage sorgt für Dauerhaftigkeit und Verlauf. Diese Aufgabe ist in drei Teile unterteilt, die von drei verschiedenen Komponenten ausgeführt werden:

Wenn ein Schreibvorgang eingeht:
Bei diesem Design nimmt der Schreibpfad eine interessante Form an. Die obige Architektur trennt das Committen einer Transaktion von der Materialisierung von Seiten, was vereinfacht ausgedrückt bedeutet: Alte Seitenversionen werden nie überschrieben. Der Verlauf Ihrer Datenbank baut sich als Timeline auf, auf die Sie verweisen können, und nicht als eine einzige Kopie, die Sie verändern.
Auf dem traditionellen Weg bedeutet eine Wiederherstellung meist, diesen vergangenen Zustand in einer separaten Instanz neu aufzubauen. Bei Lakebase gibt es jedoch einen unveränderlichen Storage-Verlauf, auf den verwiesen werden kann, sodass dieser Schritt überflüssig ist und durch ein anderes Primitiv ersetzt wird: einen Branch.
Während traditionelle Wiederherstellungen eine neue Instanz bereitstellen und Daten dorthin kopieren, ist eine Wiederherstellung in Lakebase ein Branch zu einem bestimmten Zeitpunkt im Verlauf. Dieser neue Branch verfügt über ein eigenes, unabhängiges Compute, einen eigenen Connection-String und kann völlig unabhängig von der Produktion abgefragt werden. Es ist kein Replikat der ursprünglichen Instanz, fühlt sich aber genau so an.
So nutzen Sie dieses Primitiv für eine Wiederherstellung:
Da dies das entscheidende Konzept ist, möchten wir es noch einmal betonen:
Diese Wiederherstellungsmethode macht Datenkopien völlig überflüssig. Der wiederhergestellte Branch muss keine Daten kopieren; er zeigt einfach auf die Image- und Delta-Layer, die bis zu diesem Zeitpunkt bereits existieren.
Der Vorteil ist, dass die Skalierung im Betrieb keinen Schrecken mehr verbreitet. Wenn eine Wiederherstellung lediglich Metadatenarbeit ist, hängt ihre Dauer nicht von der Größe Ihrer Daten ab, und der Mechanismus bleibt immer derselbe.

Unabhängig davon, wie groß Ihre Datenbank ist:
Ein Mensch oder ein Agent kann nach einem Vorfall immer sofort auf einen abfragbaren vergangenen Zustand zugreifen, selbst bei einer riesigen Postgres-Datenbank.

Wiederherstellungen in Lakebase sind ein einfacher Vorgang: Erstellen Sie einen Branch zu einem bestimmten Zeitstempel. Dieser Ablauf ist kurz genug, dass Agenten ihn als gewöhnlichen Tool-Aufruf behandeln können, nicht nur zur Behebung von Vorfällen.
Das ist genau der Teil, den Agenten-Plattformen wie Replit oder v0 nutzen, um Versionierungs- oder Undo-Funktionen zu entwickeln. Eine typische Schleife sieht so aus:
Klassisches PITR ist zu langsam und zu ressourcenintensiv, um Live-Workflows zu unterstützen, aber ein Branch zu einem bestimmten Zeitstempel ist schnell und kostengünstig genug, um Teil des Produkts zu sein.
Herkömmliche Wiederherstellungen werden mit zunehmender Größe der Datenbank langsamer und ressourcenintensiver. Bei Branch-basierten Wiederherstellungen ist das nicht der Fall. Da die Historie bereits außerhalb von Compute-Ressourcen liegt, können Sie einen vergangenen Zeitpunkt einfach als Branch öffnen, anstatt ihn neu aufzubauen. Unabhängig davon, ob Sie 10 GB oder 100 TB haben, sehen Wiederherstellungen immer gleich aus: Wählen Sie einen Zeitstempel, erstellen Sie den Branch und weisen Sie Compute-Ressourcen zu. Ausfälle im großen Maßstab verlieren so ihren Schrecken.
Probieren Sie es selbst aus: Erstellen Sie eine Lakebase-Postgres-Datenbank, laden Sie eine ordentliche Menge an Daten, führen Sie eine Wiederherstellung durch und fragen Sie sich, wie Sie so lange ohne diese Funktion auskommen konnten.
(Dieser Blogbeitrag wurde mit KI-gestützten Tools übersetzt.) Originalbeitrag
Abonnieren Sie unseren Blog und erhalten Sie die neuesten Beiträge direkt in Ihren Posteingang.