{"id":92570,"date":"2020-08-28T19:42:21","date_gmt":"2020-08-28T17:42:21","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker"},"modified":"2020-08-28T19:42:21","modified_gmt":"2020-08-28T17:42:21","slug":"modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","title":{"rendered":"Modellierung von ausfallsicheren Clustern basierend auf PostgreSQL und Pacemaker","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1 id=\"vvedenie\">Einf\u00fchrung<\/h1>\n<p><\/p>\n<p>Vor einiger Zeit wurde ich mit der Aufgabe betraut, ein ausfallsicheres Cluster zu entwickeln f\u00fcr <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\">PostgreSQL<\/a><\/noindex>, das in mehreren Rechenzentren betrieben wird, die durch Glasfaser innerhalb einer Stadt verbunden sind und in der Lage sind, einen Ausfall (z. B. Stromausfall) eines Rechenzentrums zu \u00fcberstehen. Als Software, die f\u00fcr die Ausfallsicherheit verantwortlich ist, habe ich mich f\u00fcr <noindex><a rel=\"nofollow\" href=\"https:\/\/clusterlabs.org\">Pacemaker<\/a><\/noindex>entschieden, da es sich um die offizielle L\u00f6sung von RedHat zur Erstellung von ausfallsicheren Clustern handelt. Sie zeichnet sich dadurch aus, dass RedHat Unterst\u00fctzung bietet und dass sie modular (universell) ist. Damit kann die Ausfallsicherheit nicht nur f\u00fcr PostgreSQL, sondern auch f\u00fcr andere Dienste gew\u00e4hrleistet werden, entweder durch die Verwendung standardm\u00e4\u00dfiger Module oder durch die Entwicklung spezifischer Module f\u00fcr besondere Anforderungen.<\/p>\n<p><\/p>\n<p>Zu dieser L\u00f6sung stellt sich die berechtigte Frage: Wie hoch ist die Ausfallsicherheit eines hochverf\u00fcgbaren Clusters? Um dies zu erforschen, habe ich eine Testumgebung entwickelt, die verschiedene Ausf\u00e4lle an den Knoten des Clusters simuliert, auf die Wiederherstellung der Funktionalit\u00e4t wartet, den ausgefallenen Knoten wiederherstellt und die Tests in einer Schleife fortsetzt. Urspr\u00fcnglich nannte sich dieses Projekt hapgsql, aber mit der Zeit langweilte mich der Name, der nur einen Vokal enth\u00e4lt. Daher begann ich, hochverf\u00fcgbare Datenbanken (und die darauf verweisenden Float-IPs) nach <strong>krogan<\/strong> (einem Charakter aus einem Videospiel, bei dem alle wichtigen Organe doppelt vorhanden sind), w\u00e4hrend ich die Knoten, Cluster und das Projekt selbst nach <strong>tuchanka<\/strong> (dem Planeten, auf dem die Kroganer leben) benannte.<\/p>\n<p><\/p>\n<p>Jetzt hat die Gesch\u00e4ftsf\u00fchrung erlaubt, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/domclick\/tuchanka\">das Projekt unter der MIT-Lizenz f\u00fcr die Open-Source-Community zu \u00f6ffnen.<\/a><\/noindex>Die README wird bald ins Englische \u00fcbersetzt (da erwartet wird, dass die Hauptnutzer Entwickler von Pacemaker und PostgreSQL sind), und die alte russische Version der README habe ich beschlossen, (teilweise) in Form dieses Artikels zu gestalten.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellierung von ausfallsicheren Clustern basierend auf PostgreSQL und Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/7ebb04b3e56337060e981da319192a28.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Cluster werden auf virtuellen Maschinen <noindex><a rel=\"nofollow\" href=\"https:\/\/www.virtualbox.org\">VirtualBox<\/a><\/noindex>. Es werden insgesamt 12 VMs (insgesamt 36GiB) bereitgestellt, die 4 hochverf\u00fcgbare Cluster bilden (verschiedene Variationen). Die ersten beiden Cluster bestehen aus zwei PostgreSQL-Servern, die in verschiedenen Rechenzentren platziert sind, und einem gemeinsamen Server <em>Witness<\/em> c <strong>Quorum-Ger\u00e4t<\/strong> (untergebracht auf einer kosteng\u00fcnstigen VM in einem dritten Rechenzentrum), das Unklarheiten aufl\u00f6st <strong>50%\/50%<\/strong>, indem es seine Stimme einer der Seiten gibt. Das dritte Cluster verteilt sich auf drei Rechenzentren: ein Master, zwei Slave-Server, ohne <strong>Quorum-Ger\u00e4t<\/strong>. Das vierte Cluster besteht aus vier PostgreSQL-Servern, zwei pro Rechenzentrum: ein Master, die anderen Replikate, und nutzt ebenfalls <em>Witness<\/em> c <strong>Quorum-Ger\u00e4t<\/strong>. Das vierte kann den Ausfall von zwei Servern oder eines Rechenzentrums \u00fcberstehen. Diese L\u00f6sung kann, wenn n\u00f6tig, auf eine gr\u00f6\u00dfere Anzahl von Replikaten skaliert werden.<\/p>\n<p><\/p>\n<p>Zeitdienst <noindex><a rel=\"nofollow\" href=\"https:\/\/www.ntp.org\">ntpd<\/a><\/noindex> wurde ebenfalls f\u00fcr Hochverf\u00fcgbarkeit neu konfiguriert, jedoch verwendet es die Methode des <code>ntpd<\/code> (<em>Orphan-Modus<\/em>). Der gemeinsame Server <em>Witness<\/em> fungiert als zentraler NTP-Server, der seine Zeit an alle Cluster verteilt und somit alle Server synchronisiert. Wenn <em>Witness<\/em> ausfallen oder isoliert werden, dann wird einer der Cluster-Server (innerhalb des Clusters) die Zeit zur Verf\u00fcgung stellen. Der unterst\u00fctzende Cache <strong>HTTP-Proxy<\/strong> ist ebenfalls aktiviert auf <em>Witness<\/em>, wodurch die anderen virtuellen Maschinen Zugriff auf die Yum-Repositories haben. In der Praxis werden solche Dienste wie Zeitserver und Proxy wahrscheinlich auf dedizierten Servern gehostet, w\u00e4hrend sie in der Testumgebung auf <em>Witness<\/em> nur zur Einsparung von virtuellen Maschinen und Platz platziert sind.<\/p>\n<p><\/p>\n<h1 id=\"versii\">Versionen<\/h1>\n<p><\/p>\n<p>v0. Funktioniert mit CentOS 7 und PostgreSQL 11 auf VirtualBox 6.1.<\/p>\n<p><\/p>\n<h1 id=\"struktura-klasterov\">Clusterstruktur<\/h1>\n<p><\/p>\n<p>Alle Cluster sind f\u00fcr die Bereitstellung in mehreren Rechenzentren konzipiert, in einem flachen Netzwerk verbunden und m\u00fcssen den Ausfall oder die Netzwerkisolierung eines Rechenzentrums \u00fcberstehen. Daher <strong>nicht erstellt werden kann<\/strong> wird zur Abwehr von <strong>Split-Brain<\/strong> die standardm\u00e4\u00dfige Pacemaker-Technologie verwendet, die als <em>STONITH<\/em> (\u201eShoot The Other Node In The Head\u201c) oder <em>Fencing<\/em>. Das Prinzip: Wenn Knoten in einem Cluster den Verdacht haben, dass bei einem Knoten etwas nicht stimmt, dieser nicht antwortet oder sich fehlerhaft verh\u00e4lt, dann schalten sie ihn \u00fcber externe Ger\u00e4te, wie beispielsweise die IPMI-Management-Karte oder eine USV, zwangsweise ab. Dies funktioniert jedoch nur, wenn im Falle eines Einzelserverausfalls IPMI oder die USV weiterhin betriebsbereit sind. Hier wird ein Schutz gegen einen viel katastrophaleren Ausfall geplant, bei dem das gesamte Rechenzentrum ausf\u00e4llt (zum Beispiel durch Stromausfall). Bei solch einem Ausfall funktionieren auch die <em>stonith<\/em>-Ger\u00e4te (IPMI, USV usw.) nicht mehr.<\/p>\n<p><\/p>\n<p>Stattdessen basiert das System auf der Idee des Quorums. Alle Knoten haben eine Stimme, und nur die Knoten, die mehr als die H\u00e4lfte aller Knoten sehen, k\u00f6nnen arbeiten. Diese Anzahl, die \u201eH\u00e4lfte+1\u201c genannt wird, ist das <strong>Quorum<\/strong>. Wenn das Quorum nicht erreicht wird, entscheidet der Knoten, dass er in einer Netzwerkisolierung ist und seine Ressourcen abschalten muss, d.h. dies ist eine <strong>Schutzma\u00dfnahme gegen Split-Brain<\/strong>. Wenn die Software, die f\u00fcr solch ein Verhalten verantwortlich ist, nicht funktioniert, wird ein Watchdog eingreifen, beispielsweise auf Basis von IPMI.<\/p>\n<p><\/p>\n<p>Wenn die Anzahl der Knoten gerade ist (Cluster in zwei Rechenzentren), kann die sogenannte Unbestimmtheit auftreten <strong>50%\/50%<\/strong> (<em>fifty-fifty<\/em>), wenn die Netzwerkisolierung das Cluster genau in zwei H\u00e4lften teilt. Daher wird bei einer geraden Anzahl von Knoten hinzugef\u00fcgt <strong>Quorum-Ger\u00e4t<\/strong> \u2014 ein unauff\u00e4lliger Daemon, der auf der g\u00fcnstigsten virtuellen Maschine im dritten Rechenzentrum gestartet werden kann. Er gibt seine Stimme einem der Segmente (das er sieht) und l\u00f6st damit die 50%\/50% Unbestimmtheit auf. Der Server, auf dem das Quorum-Ger\u00e4t laufen wird, habe ich genannt <em>Witness<\/em> (Terminologie aus repmgr, hat mir gefallen).<\/p>\n<p><\/p>\n<p>Ressourcen k\u00f6nnen von einem Ort zum anderen bewegt werden, zum Beispiel von defekten Servern zu funktionierenden, oder auf Befehl von Systemadministratoren. Damit die Kunden wissen, wo sich die ben\u00f6tigten Ressourcen befinden (wozu sie sich verbinden m\u00fcssen?), werden <em>schwebende IPs<\/em> (<strong>float IP<\/strong>). Das sind IPs, die Pacemaker zwischen den Knoten verschieben kann (alles befindet sich im flachen Netzwerk). Jede von ihnen symbolisiert eine Ressource (Service) und wird dort platziert, wo man sich verbinden muss, um Zugang zu diesem Service zu erhalten (in unserem Fall zur DB).<\/p>\n<p><\/p>\n<h2 id=\"tuchanka1-shema-s-uplotneniem\">Tuchanka1 (Schema mit Verdichtung)<\/h2>\n<p><\/p>\n<h3 id=\"struktura\">Struktur<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellierung von ausfallsicheren Clustern basierend auf PostgreSQL und Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/5651238e36f4af1c32f117191cf30261.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Die Idee war, dass wir viele kleine Datenbanken mit geringer Auslastung haben, f\u00fcr die es sich nicht lohnt, einen dedizierten Slave-Server im Hot-Standby-Modus f\u00fcr Read-Only-Transaktionen zu unterhalten (es besteht keine Notwendigkeit f\u00fcr eine solche Ressourcenverschwendung).<\/p>\n<p><\/p>\n<p>In jedem Rechenzentrum befindet sich ein Server. Auf jedem Server laufen zwei Instanzen von PostgreSQL (in der Terminologie von PostgreSQL werden sie als Cluster bezeichnet, um Verwirrung zu vermeiden, nenne ich sie Instanzen (analog zu anderen DBs), w\u00e4hrend ich Cluster nur f\u00fcr Pacemaker-Clustern verwenden werde). Eine Instanz arbeitet im Master-Modus und bietet ausschlie\u00dflich Dienste an (auf sie verweist die Float-IP). Die zweite Instanz fungiert als Slave f\u00fcr das zweite Rechenzentrum und bietet Dienstleistungen nur an, wenn der Master ausf\u00e4llt. Da die meisten Dienste (Anfragen) von nur einer der beiden Instanzen (dem Master) bereitgestellt werden, werden alle Serverressourcen auf den Master optimiert (Speicher wird f\u00fcr den Cache von shared_buffers bereitgestellt usw.), wobei jedoch auch gen\u00fcgend Ressourcen f\u00fcr die zweite Instanz (auch wenn sie nur suboptimal \u00fcber den Cache des Dateisystems arbeitet) bereitgestellt werden, um einen Ausfall eines der Rechenzentren abzufangen. Der Slave bietet keine Dienste an (f\u00fchrt keine schreibgesch\u00fctzten Anfragen aus), solange der Cluster normal arbeitet, um Ressourcenkonflikte mit dem Master auf demselben Server zu vermeiden.<\/p>\n<p><\/p>\n<p>Bei zwei Knoten ist Hochverf\u00fcgbarkeit nur mit asynchroner Replikation m\u00f6glich, da bei synchroner Replikation der Ausfall des Slave-Servers zum Stillstand des Masters f\u00fchrt.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-witness\">Ausfall des Witness<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellierung von ausfallsicheren Clustern basierend auf PostgreSQL und Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/3c046d13c0c6839de297827ca3a8928b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ausfall des Witness (<em>Quorum-Ger\u00e4t<\/em>) werde ich nur f\u00fcr das Cluster Tuchanka1 betrachten, bei allen anderen wird es die gleiche Geschichte sein. Bei einem Ausfall des Witness \u00e4ndert sich in der Clusterstruktur nichts, alles funktioniert weiterhin wie gewohnt. Aber das Quorum wird 2 von 3 betragen, wodurch jeder weitere Ausfall fatal f\u00fcr das Cluster wird. Es muss dringend repariert werden.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka1\">Ausfall Tuchanka1<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellierung von ausfallsicheren Clustern basierend auf PostgreSQL und Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/112957293bd682428115e4e93c9f1a96.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Der Ausfall eines der Rechenzentren f\u00fcr Tuchanka1. In diesem Fall <em>Witness<\/em> gibt seine Stimme dem zweiten Knoten im zweiten Rechenzentrum ab. Dort wird der vorherige Slave zum Master und somit arbeiten beide Master auf einem Server, auf den beide ihre Float-IP zeigen.<\/p>\n<p><\/p>\n<h2 id=\"tuchanka2-klassicheskaya\">Tuchanka2 (klassisch)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-1\">Struktur<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellierung von ausfallsicheren Clustern basierend auf PostgreSQL und Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/c3af368f823fbd580b4ebb14cc87c750.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Klassisches Setup mit zwei Knoten. Auf einem arbeitet der Master, auf dem anderen der Slave. Beide k\u00f6nnen Anfragen bearbeiten (Slave nur read-only), daher zeigen beide auf ihre Float-IPs: krogan2 \u2013 auf den Master, krogan2s1 \u2013 auf den Slave. Die Hochverf\u00fcgbarkeit gilt sowohl f\u00fcr den Master als auch f\u00fcr den Slave.<\/p>\n<p><\/p>\n<p>Bei zwei Knoten ist Ausfallsicherheit nur mit asynchroner Replikation m\u00f6glich, da die synchronisierte Replikation zur Stilllegung des Masters f\u00fchrt, wenn ein Slave ausf\u00e4llt.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka2\">Ausfall von Tuchanka2<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellierung von ausfallsicheren Clustern basierend auf PostgreSQL und Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/79bfcaf88c96d8ee16767dcef53741c1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Bei einem Ausfall eines der Rechenzentren <em>Witness<\/em> wird f\u00fcr das zweite abgestimmt. Im einzigen betriebsbereiten Rechenzentrum wird der Master hochgefahren, und beide Float-IP-Adressen, die Master- und Slave-IP, zeigen darauf. Nat\u00fcrlich muss die Instanz so konfiguriert sein, dass sie \u00fcber ausreichende Ressourcen (Limits f\u00fcr Verbindungen usw.) verf\u00fcgt, um gleichzeitig alle Verbindungen und Anfragen von den Master- und Slave-Float-IP-Adressen zu akzeptieren. Das hei\u00dft, im Normalbetrieb sollte sie ausreichend Reserven bei den Limits haben.<\/p>\n<p><\/p>\n<h2 id=\"tuchanka4-mnogo-rabov\">Tuchanka4 (viele Slaves)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-2\">Struktur<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellierung von ausfallsicheren Clustern basierend auf PostgreSQL und Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/17819fd97847f0573d429e422d799bc1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Das ist bereits eine andere Extremit\u00e4t. Es gibt Datenbanken, die viele Leseanfragen erhalten (typischer Fall bei stark frequentierten Websites). Tuchanka4 ist eine Situation, in der es drei oder mehr Slaves geben kann, um solche Anfragen zu bearbeiten, allerdings nicht zu viele. Bei einer sehr gro\u00dfen Anzahl von Slaves w\u00e4re es notwendig, ein hierarchisches Replikationssystem zu entwickeln. Im Minimalfall (wie auf dem Bild) befinden sich in jedem der beiden Rechenzentren zwei Server, auf denen jeweils eine PostgreSQL-Instanz l\u00e4uft.<\/p>\n<p><\/p>\n<p>Eine weitere Besonderheit dieses Schemas besteht darin, dass hier bereits eine synchrone Replikation eingerichtet werden kann. Sie ist so konfiguriert, dass sie nach M\u00f6glichkeit in ein anderes Rechenzentrum repliziert, anstatt auf eine Replik im selben Rechenzentrum wie das Master zuzugreifen. Sowohl das Master als auch jeder Slave verwenden eine Float-IP. Ideal w\u00e4re es, zwischen den Slaves eine Lastverteilung f\u00fcr die Anfragen durchzuf\u00fchren, beispielsweise <em>SQL-Proxy<\/em>, um verschiedenen Arten von Clients gerecht zu werden. Unterschiedliche Typen von Clients ben\u00f6tigen m\u00f6glicherweise unterschiedliche Typen von <em>SQL-Proxy<\/em>, und nur die Entwickler der Clients wissen, welcher f\u00fcr wen erforderlich ist. Diese Funktionalit\u00e4t kann sowohl durch einen externen Daemon als auch durch eine Clientbibliothek (Connection Pool) usw. realisiert werden. All dies geht \u00fcber das Thema des ausfallsicheren DB-Clusters hinaus (Ausfallsicherheit <em>SQL-Proxy<\/em> kann unabh\u00e4ngig umgesetzt werden, zusammen mit der Ausfallsicherheit des Clients).<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka4\">Ausfall Tuchanka4<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellierung von ausfallsicheren Clustern basierend auf PostgreSQL und Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/e005ae90ffd63abdb272012b94735618.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wenn ein Rechenzentrum ausf\u00e4llt (d.h. zwei Server), stimmt das Witness f\u00fcr den zweiten ab. Daraus ergibt sich, dass im zweiten Rechenzentrum zwei Server betrieben werden: auf einem l\u00e4uft der Master, der durch die Master-Float-IP angezeigt wird (f\u00fcr die Annahme von Read-Write-Anfragen); und auf dem zweiten Server l\u00e4uft ein Slave mit synchroner Replikation, der durch eine der Slave-Float-IPs angezeigt wird (f\u00fcr Read-Only-Anfragen).<\/p>\n<p><\/p>\n<p>Das Erste, was zu beachten ist: von den Slave-Float-IPs wird nicht jede arbeitsf\u00e4hig sein, sondern nur eine. Und f\u00fcr die korrekte Funktion mit dieser muss sichergestellt sein, dass <em>SQL-Proxy<\/em> alle Anfragen auf die einzige verbleibende Float-IP weitergeleitet werden; und wenn <em>SQL-Proxy<\/em> nicht, kann die Auflistung aller Slave-Float-IPs durch Kommas im URL f\u00fcr die Verbindung erfolgen. In diesem Fall wird die <em>libpq<\/em> Verbindung zum ersten funktionierenden IP hergestellt, so ist es im System f\u00fcr automatische Tests implementiert. M\u00f6glicherweise funktioniert es in anderen Bibliotheken, z.B. JDBC, nicht so, und es ist notwendig <em>SQL-Proxy<\/em>. Dies geschieht, weil die Float-IPs f\u00fcr die Slaves das gleichzeitige Hochfahren auf einem Server untersagt ist, um eine gleichm\u00e4\u00dfige Verteilung auf die Slave-Server zu gew\u00e4hrleisten, wenn mehrere in Betrieb sind.<\/p>\n<p><\/p>\n<p>Zweitens: Selbst im Falle eines Ausfalls des Rechenzentrums bleibt die synchrone Replikation bestehen. Und selbst wenn es zu einem sekund\u00e4ren Ausfall kommt, das hei\u00dft, einer der beiden Server im verbleibenden Rechenzentrum ausf\u00e4llt, wird der Cluster zwar seine Dienste einstellen, jedoch die Informationen \u00fcber alle best\u00e4tigten Transaktionen, f\u00fcr die eine Best\u00e4tigung gegeben wurde, weiterhin speichern (es gibt keinen Informationsverlust bei einem sekund\u00e4ren Ausfall).<\/p>\n<p><\/p>\n<h2 id=\"tuchanka3-3-data-centra\">Tuchanka3 (3 Rechenzentren)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-3\">Struktur<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellierung von ausfallsicheren Clustern basierend auf PostgreSQL und Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/e11f9884b92fe20a63b5080ae8c7f82b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dies ist ein Cluster f\u00fcr Situationen, in denen drei voll funktionsf\u00e4hige Rechenzentren vorhanden sind, in denen jeweils ein vollst\u00e4ndig funktionsf\u00e4higer Datenbankserver betrieben wird. In diesem Fall <em>Quorum-Ger\u00e4t<\/em> ist nicht erforderlich. In einem Rechenzentrum arbeitet der Master, in zwei anderen die Slaves. Die Replikation ist synchron, Typ ANY (slave1, slave2), das bedeutet, dass der Kunde eine Committ-Best\u00e4tigung erh\u00e4lt, sobald einer der Slaves zuerst antwortet, dass er das Commit akzeptiert hat. Die Ressourcen werden durch eine einzelne Floating-IP f\u00fcr den Master und zwei f\u00fcr die Slaves angegeben. Im Gegensatz zu Tuchanka4 sind alle drei Floating-IPs fehlertolerant. Zur Lastverteilung von read-only SQL-Anfragen kann man <em>SQL-Proxy<\/em> (mit separater Fehlertoleranz) oder der H\u00e4lfte der Kunden einen Slave-Floating-IP zuweisen und der anderen H\u00e4lfte die zweite.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka3\">Ausfall von Tuchanka3<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellierung von ausfallsicheren Clustern basierend auf PostgreSQL und Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/1e61158be3c23742384d3621e8f7896b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wenn einer der Rechenzentren ausf\u00e4llt, bleiben zwei \u00fcbrig. In einem wird der Master und die Float-IP vom Master betrieben, im anderen der Slave und beide Slave-Float-IPs (auf der Instanz sollte eine doppelte Ressourcenvorhaltung vorhanden sein, um alle Verbindungen von beiden Slave-Float-IPs zu akzeptieren). Zwischen Master und Slave erfolgt eine synchrone Replikation. Das Cluster speichert auch Informationen \u00fcber best\u00e4tigte und committierte Transaktionen (es wird keine Informationsverluste geben) im Falle der Zerst\u00f6rung von zwei Rechenzentren (sofern diese nicht gleichzeitig zerst\u00f6rt werden).<\/p>\n<p><\/p>\n<p><em>Eine detaillierte Beschreibung der Dateistruktur und des Deployments habe ich entschieden nicht einzuf\u00fcgen. Wer experimentieren m\u00f6chte, kann alles in der README nachlesen. Ich gebe nur eine Beschreibung der automatischen Tests an.<\/em><\/p>\n<p><\/p>\n<h1 id=\"sistema-avtomaticheskogo-testirovaniya\">Das System f\u00fcr automatisierte Tests<\/h1>\n<p><\/p>\n<p>Zur \u00dcberpr\u00fcfung der Ausfallsicherheit von Clustern unter Simulation verschiedener St\u00f6rungen wurde ein System f\u00fcr automatische Tests entwickelt. Es wird \u00fcber ein Skript gestartet <code>test\/failure<\/code>. Das Skript kann als Parameter die Nummern der Cluster annehmen, die getestet werden sollen. Zum Beispiel dieser Befehl:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">test\/failure 2 3<\/code><\/pre>\n<p><\/p>\n<p>Es werden nur der zweite und der dritte Cluster getestet. Wenn keine Parameter angegeben sind, werden alle Cluster getestet. Alle Cluster werden parallel getestet, und das Ergebnis wird im tmux Panel angezeigt. Tmux verwendet einen dedizierten tmux-Server, daher kann das Skript aus dem standardm\u00e4\u00dfigen tmux gestartet werden, was zu einem verschachtelten tmux f\u00fchrt. Ich empfehle, das Terminal in einem gro\u00dfen Fenster und mit kleiner Schriftgr\u00f6\u00dfe zu verwenden. Vor dem Teststart werden alle virtuellen Maschinen auf den Snapshot zum Zeitpunkt des Skriptschlusses zur\u00fcckgesetzt. <code>setup<\/code>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellierung von ausfallsicheren Clustern basierend auf PostgreSQL und Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/b546bab1ebbbe365991e1ff3d1667237.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Das Terminal ist in Spalten unterteilt, je nach Anzahl der getesteten Cluster, standardm\u00e4\u00dfig (im Screenshot) sind es vier. Den Inhalt der Spalten werde ich am Beispiel von Tuchanka2 erl\u00e4utern. Die Panels im Screenshot sind nummeriert:<\/p>\n<p><\/p>\n<ol>\n<li>Hier wird die Statistik der Tests angezeigt. Spalten:\n<ul>\n<li><strong>failure<\/strong> \u2014 der Name des Tests (Funktionen im Skript), der einen Fehler simuliert.<\/li>\n<li><strong>reaction<\/strong> \u2014 die durchschnittliche Zeit in Sekunden, die ben\u00f6tigt wird, um einen Cluster wieder in Betrieb zu nehmen. Gemessen wird die Zeit vom Start des Skripts, das einen Ausfall emuliert, bis zu dem Zeitpunkt, an dem der Cluster wieder betriebsbereit ist und weiterhin Dienstleistungen anbieten kann. Wenn die Zeit sehr kurz ist, beispielsweise sechs Sekunden (was in Clustern mit mehreren Slaves wie Tuchanka3 und Tuchanka4 vorkommen kann), bedeutet dies, dass der Ausfall auf einem asynchronen Slave aufgetreten ist und keine Auswirkungen auf die Betriebsf\u00e4higkeit hatte, ohne dass es zu Zustandswechseln des Clusters kam.<\/li>\n<li><strong>Abweichung<\/strong> \u2014 zeigt die Streuung (Genauigkeit) des Wertes an <strong>reaction<\/strong> nach der Methode der \u201eStandardabweichung\u201c.<\/li>\n<li><strong>Anzahl<\/strong> \u2014 wie oft dieser Test durchgef\u00fchrt wurde.<\/li>\n<\/ul>\n<\/li>\n<li>Das kurze Protokoll erm\u00f6glicht eine Einsch\u00e4tzung, was der Cluster gerade tut. Es wird die Iterationsnummer (Test), ein Zeitstempel und der Name der Operation ausgegeben. Eine zu lange Ausf\u00fchrungszeit (&gt; 5 Minuten) deutet auf ein Problem hin.<\/li>\n<li><strong>Herz<\/strong> (Herz) \u2014 die aktuelle Zeit. Zur visuellen Bewertung der Betriebsf\u00e4higkeit <em>des Masters<\/em> wird in seine Tabelle st\u00e4ndig die aktuelle Zeit unter Verwendung der float IP des Masters eingetragen. Bei Erfolg wird das Ergebnis in diesem Panel angezeigt.<\/li>\n<li><strong>Heartbeat<\/strong> (Puls) \u2014 \u201eaktuelle Zeit\u201c, die zuvor von einem Skript aufgezeichnet wurde <strong>Herz<\/strong> in den Master, wird jetzt von <em>Slave<\/em> \u00fcber dessen Float-IP gelesen. Erm\u00f6glicht eine visuelle Einsch\u00e4tzung der Funktionalit\u00e4t des Slaves und der Replikation. In Tuchanka1 gibt es keine Slaves mit Float-IP (keine Slaves, die Dienstleistungen anbieten), aber es gibt zwei Instanzen (DB), daher wird hier nicht <strong>Heartbeat<\/strong>, und <strong>Herz<\/strong> die zweite Instanz angezeigt.<\/li>\n<li>\u00dcberwachung des Clusterzustands mit dem Tool <code>pcs mon<\/code>. Zeigt die Struktur, die Verteilung der Ressourcen auf den Knoten und andere n\u00fctzliche Informationen an.<\/li>\n<li>Hier wird das Systemmonitoring jeder virtuellen Maschine des Clusters ausgegeben. Es k\u00f6nnen mehrere solcher Panels vorhanden sein \u2014 so viele virtuelle Maschinen wie es im Cluster gibt. Zwei Grafiken <em>CPU-Auslastung<\/em> (in den virtuellen Maschinen mit zwei Prozessoren), Name der virtuellen Maschine, <em>Systemauslastung<\/em> (auch als Lastdurchschnitt bezeichnet, da sie \u00fcber 5, 10 und 15 Minuten gemittelt wird), Daten zu Prozessen und der Speicherauslastung.<\/li>\n<li>Tracing des Skripts, das Tests durchf\u00fchrt. Im Falle eines Fehlers \u2014 pl\u00f6tzlicher Unterbrechung der Ausf\u00fchrung oder unendlichem Wartezyklus \u2014 kann hier die Ursache f\u00fcr solches Verhalten gesehen werden.<\/li>\n<\/ol>\n<p><\/p>\n<p>Die Tests werden in zwei Phasen durchgef\u00fchrt. Zun\u00e4chst durchl\u00e4uft das Skript alle Testvarianten und w\u00e4hlt zuf\u00e4llig eine virtuelle Maschine aus, auf die dieser Test angewendet wird. Danach erfolgt eine Endlosschleife von Tests, wobei die virtuellen Maschinen und eventuelle Fehler jedes Mal zuf\u00e4llig gew\u00e4hlt werden. Ein unerwartetes Ende des Testskripts (untere Leiste) oder eine Endlosschleife, in der auf etwas gewartet wird (&gt; 5 Minuten Ausf\u00fchrungszeit f\u00fcr eine Operation, sichtbar in der Trace) deutet darauf hin, dass einer der Tests in diesem Cluster gescheitert ist.<\/p>\n<p><\/p>\n<p>Jeder Test besteht aus den folgenden Operationen:<\/p>\n<p><\/p>\n<ol>\n<li>Starten einer Funktion, die einen Fehler simuliert.<\/li>\n<li><strong>Bereit?<\/strong> \u2014 Warten auf die Wiederherstellung des Clusters (wenn alle Dienste wieder bereitgestellt sind).<\/li>\n<li>Die Wartezeit auf die Wiederherstellung des Clusters wird angezeigt (<em>reaction<\/em>).<\/li>\n<li><strong>Fix<\/strong> \u2014 der Cluster \"wird repariert\". Danach sollte er in den vollst\u00e4ndig funktionsf\u00e4higen Zustand zur\u00fcckkehren und bereit sein f\u00fcr den n\u00e4chsten Fehler.<\/li>\n<\/ol>\n<p><\/p>\n<p>Hier ist die Liste der Tests mit einer Beschreibung, was sie tun:<\/p>\n<p><\/p>\n<ul>\n<li><strong>ForkBomb<\/strong>: \u0441\u043e\u0437\u0434\u0430\u0435\u0442 &quot;Out of memory&quot; \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u043e\u0440\u043a-\u0431\u043e\u043c\u0431\u044b.<\/li>\n<li><strong>OutOfSpace<\/strong>: die Festplatte ist voll. Der Test ist jedoch eher symbolisch, da die Belastung w\u00e4hrend des Tests minimal ist; bei einer vollen Festplatte kommt es normalerweise nicht zu einem Ausfall von PostgreSQL.<\/li>\n<li><strong>Postgres-KILL<\/strong>: beendet PostgreSQL mit dem Befehl <code>killall -KILL postgres<\/code>.<\/li>\n<li><strong>Postgres-STOP<\/strong>: h\u00e4ngt PostgreSQL mit dem Befehl <code>killall -STOP postgres<\/code>.<\/li>\n<li><strong>PowerOff<\/strong>: \u201eschaltet\u201c die Virtuelle Maschine mit dem Befehl <code>VBoxManage controlvm &quot;\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u043a\u0430&quot; poweroff<\/code>.<\/li>\n<li><strong>Reset<\/strong>: startet die Virtuelle Maschine mit dem Befehl <code>VBoxManage controlvm &quot;\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u043a\u0430&quot; reset<\/code>.<\/li>\n<li><strong>SBD-STOP<\/strong>: h\u00e4ngt den SBD-D\u00e4mon mit dem Befehl <code>killall -STOP sbd<\/code>.<\/li>\n<li><strong>ShutDown<\/strong>: sendet \u00fcber SSH den Befehl an die Virtuelle Maschine <code>systemctl poweroff<\/code>, das System wird ordnungsgem\u00e4\u00df heruntergefahren.<\/li>\n<li><strong>UnLink<\/strong>: Netzwerkisolierung, der Befehl <code>VBoxManage controlvm &quot;\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u043a\u0430&quot; setlinkstate1 off<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043b\u0438\u0431\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 tmux &quot;kill-window&quot; <strong>Ctrl-b &amp;<\/strong>, \u043b\u0438\u0431\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 &quot;detach-client&quot; <strong>Ctrl-b d<\/strong>: dabei wird der Test beendet, tmux wird geschlossen, die virtuellen Maschinen werden heruntergefahren.<\/p>\n<p><\/p>\n<h1 id=\"vyyavlennye-pri-testirovanii-problemy\">Aufgedeckte Probleme w\u00e4hrend des Tests<\/h1>\n<p><\/p>\n<ul>\n<li>\n<p>Aktuell muss man entweder Audio oder Aussetzen\/Wiederherstellen w\u00e4hlen. Wir warten darauf, dass der Autor des gesamten Moduls die Funktionalit\u00e4t verbessert. <em>der watchdog-D\u00e4mon sbd<\/em> verarbeitet das Stoppen der beobachteten D\u00e4monen, jedoch nicht deren H\u00e4ngenbleiben. Folglich werden St\u00f6rungen, die nur zum H\u00e4ngenbleiben f\u00fchren, nicht korrekt verarbeitet. <em>Corosync<\/em> und <em>Pacemaker<\/em>, w\u00e4hrend sbd nicht aufh\u00e4ngt. <em>. Zur \u00dcberpr\u00fcfung<\/em>PR#83 <em>Corosync<\/em> vorhanden ist, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClusterLabs\/sbd\/pull\/83\"><strong>(in GitHub auf<\/strong> , akzeptiert in den Branch <em>. Zur \u00dcberpr\u00fcfung<\/em>)<\/a><\/noindex>, \u043f\u0440\u0438\u043d\u044f\u0442 \u0432 \u0432\u0435\u0442\u043a\u0443 <em>master<\/em>. Es wurde (in PR#83) versprochen, dass es auch f\u00fcr Pacemaker etwas \u00c4hnliches geben wird, ich hoffe, dass bis dahin <em>RedHat 8<\/em> das umgesetzt wird. Aber solche \"Fehler\" sind theoretischer Natur, sie k\u00f6nnen leicht k\u00fcnstlich erzeugt werden, beispielsweise durch <code>killall -STOP corosync<\/code>, kommen jedoch in der Praxis niemals vor.<\/p>\n<p>\n<\/li>\n<li>\n<p>U <em>Pacemaker<\/em> in der Version f\u00fcr <em>CentOS 7<\/em> sync_timeout <em>falsch eingestellt ist, was dazu f\u00fchrt,<\/em> u <em>Quorum-Ger\u00e4t<\/em>dass im Falle eines Ausfalls eines Knotens mit gewisser Wahrscheinlichkeit auch der zweite Knoten, <noindex><a rel=\"nofollow\" href=\"https:\/\/lists.clusterlabs.org\/pipermail\/users\/2019-August\/026145.html\">auf den der Master umziehen sollte, neu gestartet wird. Das wurde behoben durch eine Erh\u00f6hung<\/a><\/noindex>w\u00e4hrend der Bereitstellung (im Skript <em>falsch eingestellt ist, was dazu f\u00fchrt,<\/em> u <em>Quorum-Ger\u00e4t<\/em> setup\/setup1 <code>). Diese Korrektur wurde von den Entwicklern nicht angenommen, stattdessen haben sie versprochen, die Infrastruktur so zu \u00fcberarbeiten, dass dieser Timeout automatisch berechnet wird (irgendwann in der unbestimmten Zukunft).<\/code>Wenn bei der Konfiguration der Datenbank angegeben ist, dass in <em>Pacemaker<\/em>LC_MESSAGES<\/p>\n<p>\n<\/li>\n<li>\n<p>(Textnachrichten) Unicode verwendet werden kann, zum Beispiel <code>ru_RU.UTF-8<\/code> , dann wird beim Starten <code>in einer Umgebung, in der das Gebietsschema nicht UTF-8 ist, sagen wir in einer leeren Umgebung (hier<\/code>pacemaker <em>postgres<\/em> pgsqlms <em>(paf) startet<\/em>+<em>, im Log werden anstelle von UTF-8-Zeichen Fragezeichen angezeigt.<\/em>Die Entwickler von PostgreSQL haben sich nicht darauf geeinigt, was in diesem Fall zu tun ist. Es kann umgangen werden, man muss <em>postgres<\/em>), dann <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/13FE0F7C-5140-499C-8C2E-0BE64BC3A48B%40ya.ru\">LC_MESSAGES=en_US.UTF-8<\/a><\/noindex>. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 PostgreSQL \u0442\u0430\u043a \u0438 \u043d\u0435 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438\u0441\u044c, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435. \u042d\u0442\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u0441\u044f, \u043d\u0443\u0436\u043d\u043e \u0441\u0442\u0430\u0432\u0438\u0442\u044c <code>LC_MESSAGES=en_US.UTF-8<\/code> bei der Konfiguration (Erstellung) einer DB-Instanz.<\/p>\n<p>\n<\/li>\n<li>\n<p>Wenn wal_receiver_timeout (standardm\u00e4\u00dfig 60s) eingestellt ist, tritt bei einem PostgreSQL-STOP-Test auf dem Master in den Clustern tuchanka3 und tuchanka4 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/60590EC6-4062-4F25-A49C-3948ED2A7D47%40ya.ru\">keine Wiederverbindung zur Replikation mit dem neuen Master auf.<\/a><\/noindex>Die Replikation ist dort synchron, weshalb nicht nur der Slave, sondern auch der neue Master stoppt. Dies kann behoben werden, indem wal_receiver_timeout=0 bei der PostgreSQL-Konfiguration gesetzt wird.<\/p>\n<p>\n<\/li>\n<li>\n<p>Gelegentlich habe ich ein H\u00e4ngenbleiben der Replikation bei PostgreSQL im ForkBomb-Test (Speicher\u00fcberlauf) beobachtet. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/60590EC6-4062-4F25-A49C-3948ED2A7D47%40ya.ru\">Nach ForkBomb k\u00f6nnen die Slaves manchmal nicht mit dem neuen Master wieder verbunden werden.<\/a><\/noindex>Ich habe dies nur in den Clustern tuchanka3 und tuchanka4 erlebt, wo der Master aufgrund der synchronen Replikation h\u00e4ngen blieb. Das Problem l\u00f6ste sich von selbst nach einer gewissen Zeit (ungef\u00e4hr zwei Stunden). Weitere Untersuchungen sind erforderlich, um dies zu beheben. Die Symptome \u00e4hneln einem fr\u00fcheren Bug, der durch eine andere Ursache ausgel\u00f6st wird, aber die gleichen Folgen hat.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Das Krogan-Bild stammt von <noindex><a rel=\"nofollow\" href=\"http:\/\/fav.me\/d8fo42n\">Deviant Art<\/a><\/noindex> mit Erlaubnis des Autors:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellierung von ausfallsicheren Clustern basierend auf PostgreSQL und Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/ded1ead387814d97d84d0fb89e025386.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/domclick\/blog\/516538\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u043f\u0435\u0440\u0435\u0434\u043e \u043c\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0434\u043b\u044f PostgreSQL, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0430\u0445, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u0442\u043e\u0432\u043e\u043b\u043e\u043a\u043d\u043e\u043c \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0433\u043e\u0440\u043e\u0434\u0430, \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u0439 \u0432\u044b\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0431\u0435\u0441\u0442\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435) \u043e\u0434\u043d\u043e\u0433\u043e \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0430. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u043e\u0444\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c, \u0432\u044b\u0431\u0440\u0430\u043b Pacemaker, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0442 RedHat \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432. \u041e\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0442\u0435\u043c, \u0447\u0442\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":92571,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-92570","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u043f\u0435\u0440\u0435\u0434\u043e \u043c\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0434\u043b\u044f PostgreSQL, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0430\u0445, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u0442\u043e\u0432\u043e\u043b\u043e\u043a\u043d\u043e\u043c \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0433\u043e\u0440\u043e\u0434\u0430, \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u0439 \u0432\u044b\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0431\u0435\u0441\u0442\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435) \u043e\u0434\u043d\u043e\u0433\u043e \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0430. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u043e\u0444\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c, \u0432\u044b\u0431\u0440\u0430\u043b Pacemaker, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0442 RedHat \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432. \u041e\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0442\u0435\u043c, \u0447\u0442\u043e\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u043d\u0430 \u0431\u0430\u0437\u0435 PostgreSQL \u0438 Pacemaker | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u043f\u0435\u0440\u0435\u0434\u043e \u043c\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0434\u043b\u044f PostgreSQL, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0430\u0445, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u0442\u043e\u0432\u043e\u043b\u043e\u043a\u043d\u043e\u043c \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0433\u043e\u0440\u043e\u0434\u0430, \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u0439 \u0432\u044b\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0431\u0435\u0441\u0442\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435) \u043e\u0434\u043d\u043e\u0433\u043e \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0430. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u043e\u0444\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c, \u0432\u044b\u0431\u0440\u0430\u043b Pacemaker, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0442 RedHat \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432. \u041e\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0442\u0435\u043c, \u0447\u0442\u043e\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-08-28T17:42:21+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-28T17:42:21+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Modellierung ausfallsicherer Cluster mit PostgreSQL und Pacemaker | ProHoster","description":"Einf\u00fchrung Vor einiger Zeit wurde ich mit der Aufgabe betraut, einen ausfallsicheren Cluster f\u00fcr PostgreSQL zu entwickeln, der in mehreren Rechenzentren betrieben wird, die durch Glasfaser in einer Stadt verbunden sind und in der Lage sind, einen Ausfall (zum Beispiel einen Stromausfall) eines Rechenzentrums zu \u00fcberstehen. F\u00fcr die Software, die f\u00fcr die Ausfallsicherheit verantwortlich ist, habe ich Pacemaker gew\u00e4hlt, da dies die offizielle L\u00f6sung von RedHat zur Erstellung von ausfallsicheren Clustern ist. Sie hat den Vorteil, dass","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u043d\u0430 \u0431\u0430\u0437\u0435 PostgreSQL \u0438 Pacemaker | ProHoster","og:description":"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u043f\u0435\u0440\u0435\u0434\u043e \u043c\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0434\u043b\u044f PostgreSQL, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0430\u0445, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u0442\u043e\u0432\u043e\u043b\u043e\u043a\u043d\u043e\u043c \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0433\u043e\u0440\u043e\u0434\u0430, \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u0439 \u0432\u044b\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0431\u0435\u0441\u0442\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435) \u043e\u0434\u043d\u043e\u0433\u043e \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0430. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u043e\u0444\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c, \u0432\u044b\u0431\u0440\u0430\u043b Pacemaker, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0442 RedHat \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432. \u041e\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0442\u0435\u043c, \u0447\u0442\u043e","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-08-28T17:42:21+00:00","article:modified_time":"2020-08-28T17:42:21+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"92570","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:06:03","updated":"2022-09-29 15:28:29"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/92570","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=92570"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/92570\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/92571"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=92570"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=92570"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=92570"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}