PostgreSQL und Einstellungen zur Konsistenz von Aufzeichnungen fĂŒr jede einzelne Verbindung.

Die Übersetzung des Artikels wurde speziell fĂŒr die Studierenden des Kurses erstellt „Datenbanken“. Interessiert an einer Weiterentwicklung in diesem Bereich? Wir laden Sie ein zu Tag der offenen TĂŒr, an dem wir ausfĂŒhrlich ĂŒber das Programm, die Besonderheiten des Online-Formats, die Kompetenzen und die Karrieremöglichkeiten sprechen, die Absolventen nach dem Studium erwarten.

PostgreSQL und Einstellungen zur Konsistenz von Aufzeichnungen fĂŒr jede einzelne Verbindung.

PostgreSQL und Einstellungen zur Konsistenz von Aufzeichnungen fĂŒr jede einzelne Verbindung.
In Compose haben wir es mit vielen Datenbanken zu tun, was uns die Möglichkeit gibt, ihre FunktionalitĂ€t und SchwĂ€chen nĂ€her kennenzulernen. WĂ€hrend wir beginnen, die funktionalen Merkmale neuer Datenbanken zu schĂ€tzen, denken wir manchmal, dass es gut wĂ€re, wenn solche Funktionen auch in Ă€lteren Werkzeugen vorhanden wĂ€ren, mit denen wir schon lange arbeiten. Eine der neuen Funktionen, die wir in PostgreSQL sehen wollten, war die anpassbare Schreibkonsistenz pro Verbindung im gesamten Cluster. Und wie sich herausstellte, haben wir sie bereits, und heute wollen wir Ihnen Informationen darĂŒber geben, wie Sie sie nutzen können.

Warum brauche ich das?

Das Verhalten eines Clusters hĂ€ngt von Ihrer Anwendung ab. Nehmen wir beispielsweise eine Anwendung zur Rechnungszahlung. Sie benötigen eine hundertprozentige Konsistenz im Cluster, daher mĂŒssen Sie synchrone Commits aktivieren, damit Ihre Datenbank auf alle Änderungen wartet. Wenn Ihre Anwendung jedoch ein schnell wachsendes soziales Netzwerk ist, ziehen Sie sicherlich eine schnelle Reaktionszeit der hundertprozentigen Konsistenz vor. Um dies zu erreichen, können Sie in Ihrem Cluster asynchrone Commits verwenden.

Lernen Sie den Kompromiss kennen

Sie mĂŒssen einen Kompromiss zwischen Datenkonsistenz und Leistung eingehen. PostgreSQL tendiert zur Konsistenz, da die Standardkonfiguration in diesem Fall vorhersehbar ist und keine unerwarteten Überraschungen mit sich bringt. Lassen Sie uns nun die Kompromisse kennenlernen.

Kompromiss 1: Leistung

Wenn der PostgreSQL-Cluster keine Konsistenz benötigt, kann er durchaus asynchron arbeiten. Die Aufzeichnung erfolgt auf dem Cluster-Leiter, und seine Replikate erhalten nach wenigen Millisekunden die Aktualisierungen. Wenn der PostgreSQL-Cluster Konsistenz benötigt, muss er synchron arbeiten. Die Aufzeichnung wird beim Cluster-Leiter durchgefĂŒhrt, der die Aktualisierung an die Replikate sendet und die BestĂ€tigung abwartet, dass jede Replik die Aufzeichnung durchgefĂŒhrt hat, bevor sie die BestĂ€tigung an den Client sendet, der die Aufzeichnung initiiert hat, dass diese erfolgreich war. Der praktische Unterschied zwischen diesen AnsĂ€tzen besteht darin, dass die asynchrone Methode zwei Netzwerk-Hops erfordert, wĂ€hrend die synchrone vier erfordert.

Kompromiss 2: Konsistenz

Das Ergebnis im Falle eines Ausfalls des Leiters in diesen beiden AnsĂ€tzen wird ebenfalls unterschiedlich sein. Wenn die Arbeit asynchron ausgefĂŒhrt wird, werden bei einem solchen Fehler nicht alle Aufzeichnungen von den Replikaten erfasst. Wie viel geht verloren? Das hĂ€ngt von der Anwendung selbst und der Effizienz der Replikation ab. Mit der Compose-Replikation wird ein Replikat daran gehindert, Leiter zu werden, wenn die Menge an Informationen darin 1 MB kleiner ist als die des Leiters, was bedeutet, dass beim asynchronen Betrieb potenziell bis zu 1 MB an Aufzeichnungen verloren gehen kann.

Im synchronen Modus geschieht dies nicht. Wenn der Leiter ausfÀllt, werden alle Replikate aktualisiert, da jede Aufzeichnung, die auf dem Leiter bestÀtigt wurde, auch in den Replikaten bestÀtigt werden muss. Das ist die Konsistenz.

Das synchrone Verhalten macht Sinn in Anwendungen zur Zahlung von Rechnungen, wo Konsistenz einen klaren Vorteil bei der Suche nach einem Kompromiss zwischen Konsistenz und Leistung bietet. Das Wichtigste fĂŒr eine solche Anwendung sind gĂŒltige Daten. Denken Sie nun an ein soziales Netzwerk, in dem die Hauptaufgabe darin besteht, die Aufmerksamkeit der Benutzer zu halten, indem Anfragen so schnell wie möglich beantwortet werden. In diesem Fall hat die Leistung mit weniger Netzwerk-Hops und kĂŒrzerer Wartezeit auf BestĂ€tigungen PrioritĂ€t. Der Kompromiss zwischen Leistung und Konsistenz ist jedoch nicht der einzige, ĂŒber den man nachdenken muss.

Kompromiss 3: AusfÀlle

Es ist sehr wichtig zu verstehen, wie sich ein Cluster wĂ€hrend eines Fehlers verhĂ€lt. Lassen Sie uns die Situation betrachten, in der eine oder mehrere Repliken ausfallen. Wenn die Commits asynchron verarbeitet werden, wird der Leader weiterhin funktionieren, d.h. er wird Aufzeichnungen empfangen und bearbeiten, ohne auf fehlende Repliken zu warten. Wenn die Repliken zurĂŒck ins Cluster kommen, holen sie den Leader ein. Bei synchroner Replikation, wenn Repliken nicht antworten, hat der Leader keine Wahl und wird weiterhin auf die BestĂ€tigung des Commits warten, bis die Replik ins Cluster zurĂŒckkehrt und die Aufzeichnung annehmen und bestĂ€tigen kann.

Eine Verbindung pro Transaktion?

Jede Anwendung benötigt eine spezielle Kombination aus Konsistenz und Leistung. Es sei denn, es handelt sich um unsere Rechnungsanwendung, die wir uns als vollstĂ€ndig konsistent vorstellen, oder um unsere fast flĂŒchtige Social-Media-Anwendung. In allen anderen FĂ€llen gibt es Momente, in denen einige Operationen synchron und andere asynchron sein mĂŒssen. Sie möchten vielleicht nicht, dass das System wartet, bis eine Nachricht im Chat committet wurde, aber wenn in derselben Anwendung eine Zahlung durchgefĂŒhrt wird, wird man warten mĂŒssen.

All diese Entscheidungen trifft natĂŒrlich der Anwendungsentwickler. Die richtigen Entscheidungen darĂŒber, wann welcher Ansatz angewendet werden soll, helfen, das Beste aus dem Cluster herauszuholen. Es ist wichtig, dass der Entwickler zwischen ihnen auf SQL-Ebene fĂŒr Verbindungen und fĂŒr Transaktionen wechseln kann.

Praktische Sicherstellung der Kontrolle

StandardmĂ€ĂŸig sorgt PostgreSQL fĂŒr Konsistenz. Dies wird durch den Serverparameter synchronous_commitkontrolliert. StandardmĂ€ĂŸig ist er auf oneingestellt, hat jedoch drei andere Optionen: local, remote_write oder off.

Wenn der Parameter auf eingestellt ist, werden alle synchronen Commits gestoppt, selbst im lokalen System. Der Parameter in local definiert den synchronen Modus fĂŒr das lokale System, die Aufzeichnungen in Repliken erfolgen jedoch asynchron. off Remote_write geht noch weiter: Aufzeichnungen in Repliken erfolgen asynchron, aber es wird zurĂŒckgegeben, wenn die Replik die Aufzeichnung angenommen hat, diese jedoch nicht auf die Festplatte geschrieben hat. Wenn wir den verfĂŒgbaren Bereich an Optionen betrachten, wĂ€hlen wir das Verhalten und, da wir uns bewusst sind, dass

es sich um synchrone Aufzeichnungen handelt, wĂ€hlen wir on fĂŒr asynchrone Commits ĂŒber das Netzwerk, wĂ€hrend wir die lokalen Commits synchron lassen. local fĂŒr asynchrone Commits ĂŒber das Netzwerk und lassen dabei lokale Commits synchron.

Jetzt zeigen wir Ihnen, wie Sie dies im Handumdrehen einstellen können, aber stellen Sie sich vor, dass wir es fĂŒr den Server installiert haben. synchronous_commit in local Wir haben uns gefragt, ob man den Parameter synchronous_commit zur Laufzeit Ă€ndern kann, und es stellte sich heraus, dass es nicht nur möglich ist, dafĂŒr gibt es sogar zwei Methoden. Die erste besteht darin, die Sitzung Ihrer Verbindung wie folgt einzustellen:

SET SESSION synchronous_commit TO ON;  
// Ihre SchreibvorgÀnge kommen hierhin

Alle nachfolgenden SchreibvorgĂ€nge in der Sitzung bestĂ€tigen die Schreiboperationen fĂŒr die Replikate, bevor sie das positive Ergebnis an den verbundenen Client zurĂŒckgeben. Es sei denn, Sie Ă€ndern die Einstellung synchronous_commit wieder. Sie können den Teil SESSION im Befehl weglassen, da er den Standardwert haben wird.

Die zweite Methode ist nĂŒtzlich, wenn Sie einfach sicherstellen möchten, dass Sie fĂŒr eine Transaktion die synchrone Replikation erhalten. In vielen NoSQL-Datenbanken gibt es kein Konzept von Transaktionen, aber in PostgreSQL gibt es das. In diesem Fall starten Sie eine Transaktion und stellen dann synchronous_commit in on vor der AusfĂŒhrung des Schreibvorgangs fĂŒr die Transaktion ein. COMMIT wird die Transaktion festschreiben, indem es jeden Wert des Parameters verwendet, der zu diesem Zeitpunkt gesetzt war, obwohl es am besten ist, die Variable im Voraus zu setzen, damit andere Entwickler verstehen, dass die Aufzeichnungen nicht asynchron sind. synchronous_commitBEGIN; SET LOCAL synchronous_commit TO ON; // Ihre SchreibvorgĂ€nge kommen hierhin COMMIT;

Alle Commit-Transaktionen werden jetzt bestĂ€tigt, wie in Replikate geschrieben, bevor die Datenbank eine positive Antwort an den verbundenen Client zurĂŒckgibt.  

PostgreSQL konfigurieren

Vorher haben wir uns ein System von PostgreSQL mit

Wir haben uns ein PostgreSQL-System mit synchronous_commit, das in local, vorgestellt. Damit dies auf der Serverseite real ist, mĂŒssen Sie zwei Konfigurationsparameter des Servers festlegen. Ein weiterer Parameter synchronous_standby_names wird wirksam, wenn synchronous_commit in on. Er definiert, welche Replikate das Recht auf synchrone Commits haben, und wir werden ihn auf *setzen, was bedeutet, dass alle Replikate aktiviert werden. Diese Werte werden normalerweise in der Konfigurationsdatei durch HinzufĂŒgen von:

synchronous_commit = local  
synchronous_standby_names='*'

Indem wir den Parameter synchronous_commit auf den Wert localsetzen, schaffen wir ein System, in dem lokale Festplatten synchron bleiben, wĂ€hrend die Commits von Netzwerkreplikaten standardmĂ€ĂŸig asynchron sind. Es sei denn, wir entscheiden uns, diese Commits synchron zu gestalten, wie oben gezeigt.

Wenn Sie die Entwicklung des Projekt Governor verfolgt haben., Sie haben möglicherweise einige kĂŒrzliche Änderungen bemerkt (1, 2), die es den Benutzern von Governor ermöglichen, diese Einstellungen zu testen und ihre Konsistenz zu steuern.

Noch ein paar Worte


Vor einer Woche hÀtte ich Ihnen gesagt, dass es unmöglich ist, PostgreSQL so fein abzustimmen. Genau dann bestand Kurt, ein Mitglied des Compose-Plattformteams, darauf, dass es diese Möglichkeit gibt. Er besÀnftigte meine Bedenken und fand in der Dokumentation von PostgreSQL Folgendes:

PostgreSQL und Einstellungen zur Konsistenz von Aufzeichnungen fĂŒr jede einzelne Verbindung.

Dieser Parameter kann jederzeit geĂ€ndert werden. Das Verhalten fĂŒr jede Transaktion wird durch die Einstellung definiert, die zum Zeitpunkt des Commits aktiv ist. Daher ist es möglich und nĂŒtzlich, dass einige Transaktionen synchronen Commits durchfĂŒhren, wĂ€hrend andere asynchron sind. Um beispielsweise eine multistatement Transaktion dazu zu bringen, Commits asynchron durchzufĂŒhren, wenn der Standardwert entgegengesetzt ist, setzen Sie bitte SET LOCAL synchronous_commit TO OFF in der Transaktion.

Mit dieser kleinen Modifikation in der Konfigurationsdatei haben wir den Benutzern die Möglichkeit gegeben, ihre Konsistenz und Leistung zu steuern.

Quelle: habr.com

ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server đŸ”„ ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server - ProHoster