{"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 fehlertoleranter Cluster auf Basis von 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 mir die Aufgabe gestellt, ein ausfallsicheres Cluster zu entwickeln f\u00fcr <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\">PostgreSQL<\/a><\/noindex>, das in mehreren Rechenzentren innerhalb einer Stadt \u00fcber Glasfasern verbunden ist und in der Lage ist, den Ausfall (zum Beispiel durch Stromausfall) eines Rechenzentrums zu \u00fcberstehen. Als Software, die f\u00fcr die Ausfallsicherheit verantwortlich ist, habe ich mich f\u00fcr entschieden <noindex><a rel=\"nofollow\" href=\"https:\/\/clusterlabs.org\">Pacemaker<\/a><\/noindex>, weil dies die offizielle L\u00f6sung von RedHat zur Erstellung ausfallsicherer Cluster ist. Sie hat den Vorteil, dass RedHat Support daf\u00fcr bereitstellt und dass diese L\u00f6sung universell (modular) ist. Mit ihrer Hilfe 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 Erstellung solcher Module f\u00fcr spezifische Bed\u00fcrfnisse.<\/p>\n<p><\/p>\n<p>Zu dieser L\u00f6sung stellte sich die berechtigte Frage: Wie ausfallsicher wird das ausfallsichere Cluster sein? Um dies zu untersuchen, habe ich einen Teststand entwickelt, der verschiedene Ausf\u00e4lle an den Knoten des Clusters simuliert, auf die Wiederherstellung der Betriebsf\u00e4higkeit wartet, den ausgefallenen Knoten wiederherstellt und die Tests im Kreis fortsetzt. Urspr\u00fcnglich wurde dieses Projekt hapgsql genannt, aber im Laufe der Zeit hat mir der Name, der nur einen Vokal enth\u00e4lt, nicht mehr gefallen. Daher begann ich, ausfallsichere Datenbanken (und die auf sie verweisenden float IPs) zu nennen <strong>krogan<\/strong> (eine Figur aus einem Computerspiel, bei dem alle wichtigen Organe verdoppelt sind), w\u00e4hrend ich die Knoten, Cluster und das gesamte Projekt als <strong>tuchanka<\/strong> (den Planeten, auf dem die Kroganer leben) benannte.<\/p>\n<p><\/p>\n<p>Jetzt hat die F\u00fchrung genehmigt, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/domclick\/tuchanka\">das Projekt als Open Source unter der MIT-Lizenz zu ver\u00f6ffentlichen.<\/a><\/noindex>Das README wird in K\u00fcrze ins Englische \u00fcbersetzt (da erwartet wird, dass die Hauptnutzer Entwickler von Pacemaker und PostgreSQL sein werden), und die alte russische Version des README habe ich entschieden, (teilweise) in Form dieses Artikels zu gestalten.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellierung fehlertoleranter Cluster auf Basis von 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>Die Cluster werden auf virtuellen Maschinen <noindex><a rel=\"nofollow\" href=\"https:\/\/www.virtualbox.org\">VirtualBox<\/a><\/noindex>bereitgestellt. Insgesamt werden 12 virtuelle Maschinen bereitgestellt (insgesamt 36GiB), die 4 ausfallsichere Cluster bilden (verschiedene Varianten). Die ersten beiden Cluster bestehen aus zwei PostgreSQL-Servern, die in verschiedenen Rechenzentren untergebracht sind, und einem gemeinsamen Server <em>witness<\/em> c <strong>quorum device<\/strong> (untergebracht auf einer g\u00fcnstigen virtuellen Maschine im dritten Rechenzentrum), der die Ungewissheit l\u00f6st <strong>50%\/50%<\/strong>, indem er seine Stimme einer der Parteien gibt. Der dritte Cluster ist in drei Rechenzentren: ein Master, zwei Slaves, ohne <strong>quorum device<\/strong>. Der vierte Cluster besteht aus vier PostgreSQL-Servern, zwei in jedem Rechenzentrum: einem Master und den \u00fcbrigen Replikaten, und verwendet ebenfalls <em>witness<\/em> c <strong>quorum device<\/strong>. Der vierte Cluster h\u00e4lt den Ausfall von zwei Servern oder eines Rechenzentrums stand. Diese L\u00f6sung kann bei Bedarf auf eine gr\u00f6\u00dfere Anzahl von Replikaten skaliert werden.<\/p>\n<p><\/p>\n<p>Echtzeit-Dienst <noindex><a rel=\"nofollow\" href=\"https:\/\/www.ntp.org\">ntpd<\/a><\/noindex> wurde ebenfalls f\u00fcr Fehlertoleranz umkonfiguriert, verwendet dabei aber die Methode <code>ntpd<\/code> (<em>orphan mode<\/em>). Der Hauptserver <em>witness<\/em> fungiert als zentraler NTP-Server, verteilt seine Zeit an alle Cluster und synchronisiert damit alle Server untereinander. Wenn <em>witness<\/em> ein Server ausf\u00e4llt oder isoliert wird, beginnt einer der Server im Cluster (innerhalb des Clusters) seine Zeit zu verteilen. Ein unterst\u00fctzender zwischenspeichernder <strong>HTTP-Proxy<\/strong> wurde ebenfalls aufgestellt, <em>witness<\/em>mit dessen Hilfe die anderen virtuellen Maschinen Zugriff auf die Yum-Repositories haben. In der Realit\u00e4t werden solche Dienste wie Echtzeit und Proxy sicherlich auf dedizierten Servern gehostet, w\u00e4hrend sie im Stand auf <em>witness<\/em> aus wirtschaftlichen Gr\u00fcnden in Virtual Machines 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 daf\u00fcr ausgelegt, in mehreren Rechenzentren untergebracht zu werden, sind in einem flachen Netzwerk verbunden und m\u00fcssen den Ausfall oder die Netzwerkarbeit eines Rechenzentrums \u00fcberstehen. Daher <strong>nicht m\u00f6glich ist<\/strong> verwendet man zur Schutz gegen <strong>split-brain<\/strong> die Standardtechnologie Pacemaker, die als <em>STONITH<\/em> (Shoot The Other Node In The Head) oder <em>Fencing<\/em>. Ihr Kern besteht darin, dass, wenn die Knoten im Cluster anfangen, zu vermuten, dass mit einem bestimmten Knoten etwas nicht stimmt, er nicht reagiert oder sich nicht korrekt verh\u00e4lt, sie ihn gezwungen \u00fcber \"externe\" Ger\u00e4te, wie zum Beispiel die IPMI-Steuerkarte oder USV, abschalten. Aber dies funktioniert nur in F\u00e4llen, in denen bei einem einzelnen Ausfall des Servers IPMI oder USV weiter funktionieren. Hier ist jedoch Schutz gegen einen weitaus katastrophalen Ausfall geplant, bei dem das gesamte Rechenzentrum ausf\u00e4llt (zum Beispiel durch Stromausfall). Und bei solch einem Ausfall werden auch alle <em>stonith<\/em>-Ger\u00e4te (IPMI, USV usw.) nicht funktionieren.<\/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 \"mehr als die H\u00e4lfte + 1\" wird genannt <strong>Quota<\/strong>. Wenn das Quorum nicht erreicht wird, entscheidet der Knoten, dass er sich in Netzwerkkonnotation befindet und seine Ressourcen deaktivieren muss, d.h. es ist so eine <strong>Schutz vor Split-Brain<\/strong>. Wenn die Software, die f\u00fcr dieses Verhalten verantwortlich ist, nicht funktioniert, sollte ein Watchdog, zum Beispiel auf Basis von IPMI, aktiv werden.<\/p>\n<p><\/p>\n<p>Wenn die Anzahl der Knoten gerade ist (Cluster in zwei Rechenzentren), kann es zu einer sogenannten Unsicherheit kommen <strong>50%\/50%<\/strong> (<em>fifty-fifty<\/em>), wenn eine Netzwerktrennung das Cluster genau in der Mitte teilt. Daher wird f\u00fcr eine gerade Anzahl von Knoten <strong>quorum device<\/strong> ein unaufdringlicher Daemon hinzugef\u00fcgt, der auf der g\u00fcnstigsten virtuellen Maschine im dritten Rechenzentrum ausgef\u00fchrt werden kann. Er gibt seine Stimme einem der Segmente (das er sieht) und l\u00f6st somit die 50%\/50% Unsicherheit auf. Den Server, auf dem das Quorum-Ger\u00e4t ausgef\u00fchrt 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 verschoben werden, zum Beispiel von fehlerhaften Servern zu funktionierenden, oder auf Anweisung der Systemadministratoren. Damit die Clients wissen, wo sich die ben\u00f6tigten Ressourcen befinden (wohin sie sich verbinden sollen?), werden <em>schwebende IPs<\/em> (<strong>schwebende IP<\/strong>). Das sind IPs, die Pacemaker zwischen den Knoten verschieben kann (alles befindet sich in einem flachen Netzwerk). Jede von ihnen repr\u00e4sentiert eine Ressource (Dienst) und wird dort sein, wo man sich verbinden muss, um Zugriff auf diesen Dienst (in unserem Fall die DB) zu erhalten.<\/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 fehlertoleranter Cluster auf Basis von 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 Last 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 gibt es einen Server. Auf jedem Server laufen zwei Instanzen von PostgreSQL (in der Terminologie von PostgreSQL werden sie Cluster genannt, aber um Verwirrung zu vermeiden, nenne ich sie Instanzen, analog zu anderen Datenbanken, w\u00e4hrend ich Cluster nur f\u00fcr die Pacemaker-Cluster verwenden werde). Eine Instanz l\u00e4uft im Master-Modus und bietet ausschlie\u00dflich Dienstleistungen an (nur auf sie zeigt die Float-IP). Die zweite Instanz funktioniert als Slave f\u00fcr das zweite Rechenzentrum und wird nur Dienstleistungen anbieten, wenn ihr Master ausf\u00e4llt. Da eine Instanz (der Master) die meisten Dienste (Anfragen) bereitstellt, werden alle Serverressourcen f\u00fcr den Master optimiert (Speicher wird f\u00fcr den Cache shared_buffers bereitgestellt usw.), jedoch so, dass auch die zweite Instanz \u00fcber ausreichend Ressourcen verf\u00fcgt (auch wenn deren Leistung \u00fcber den Dateisystem-Cache suboptimal ist) f\u00fcr den Fall eines Ausfalls eines der Rechenzentren. Der Slave bietet keine Dienste an (f\u00fchrt keine Read-Only-Anfragen aus), solange der Cluster normal l\u00e4uft, um Ressourcenkriege mit dem Master auf demselben Ger\u00e4t zu vermeiden.<\/p>\n<p><\/p>\n<p>Im Fall von zwei Knoten ist die Fehlertoleranz nur bei asynchroner Replikation m\u00f6glich, da bei synchroner Replikation der Ausfall des Slaves zur Unterbrechung des Masters f\u00fchrt.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-witness\">Ausfall Witness<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellierung fehlertoleranter Cluster auf Basis von PostgreSQL und Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/3c046d13c0c6839de297827ca3a8928b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ausfall Witness (<em>quorum device<\/em>) werde ich nur f\u00fcr das Cluster Tuchanka1 betrachten, f\u00fcr alle anderen wird die Situation die gleiche sein. Bei einem Ausfall des Witness \u00e4ndert sich in der Cluster-Struktur nichts, alles funktioniert weiterhin wie gehabt. Aber das Quorum wird 2 aus 3 betragen, und jeder weitere Ausfall wird daher fatal f\u00fcr den Cluster sein. Es wird dennoch notwendig sein, es dringend zu reparieren.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka1\">Ausfall Tuchanka1<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellierung fehlertoleranter Cluster auf Basis von PostgreSQL und Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/112957293bd682428115e4e93c9f1a96.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ausfall eines der Rechenzentren f\u00fcr Tuchanka1. In diesem Fall <em>witness<\/em> gibt es seine Stimme dem zweiten Knoten im zweiten Rechenzentrum. Dort verwandelt sich der ehemalige Slave in einen Master, sodass auf einem Server beide Master laufen und beide ihre Float-IPs haben.<\/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 fehlertoleranter Cluster auf Basis von PostgreSQL und Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/c3af368f823fbd580b4ebb14cc87c750.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Klassisches Schema mit zwei Knoten. Auf einem l\u00e4uft der Master, auf dem anderen der Slave. Beide k\u00f6nnen Anfragen verarbeiten (der Slave nur Read-Only), daher zeigen beide Float-IPs an: krogan2 \u2014 auf den Master, krogan2s1 \u2014 auf den Slave. Die Fehlertoleranz ist sowohl beim Master als auch beim Slave gegeben.<\/p>\n<p><\/p>\n<p>Im Fall von zwei Knoten ist die Fehlertoleranz nur bei asynchroner Replikation m\u00f6glich, denn bei synchroner Replikation f\u00fchrt der Ausfall des Slaves zur Unterbrechung des Masters.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka2\">Ausfall Tuchanka2<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellierung fehlertoleranter Cluster auf Basis von PostgreSQL und Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/79bfcaf88c96d8ee16767dcef53741c1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Beim Ausfall eines der Rechenzentren <em>witness<\/em> Er stimmt f\u00fcr die zweite. Auf dem einzigen funktionierenden Rechenzentrum wird ein Master erstellt, auf den beide float IPs zeigen: die Master- und die Slave-IP. Selbstverst\u00e4ndlich muss die Instanz so konfiguriert sein, dass sie \u00fcber ausreichend Ressourcen (Limits f\u00fcr Verbindungen usw.) verf\u00fcgt, um gleichzeitig alle Verbindungen und Anfragen von der Master- und Slave-float-IP zu akzeptieren. Das bedeutet, dass sie bei normalem Betrieb \u00fcber ausreichende Limits verf\u00fcgen muss.<\/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 fehlertoleranter Cluster auf Basis von PostgreSQL und Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/17819fd97847f0573d429e422d799bc1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es gibt bereits eine andere Extremit\u00e4t. Manchmal gibt es Datenbanken, die sehr viele read-only-Anfragen erhalten (ein typischer Fall einer stark belasteten Website). Tuchanka4 ist eine Situation, in der es drei oder mehr Slaves geben kann, um solche Anfragen zu verarbeiten, aber dennoch nicht zu viele. Bei einer sehr gro\u00dfen Anzahl von Slaves muss ein hierarchisches Replikationssystem erfunden werden. Im minimalen Fall (auf dem Bild) gibt es in jedem der beiden Rechenzentren zwei Server, auf jedem davon l\u00e4uft eine PostgreSQL-Instanz.<\/p>\n<p><\/p>\n<p>Eine weitere Besonderheit dieses Schemas ist, dass hier bereits eine synchrone Replikation eingerichtet werden kann. Diese ist so konfiguriert, dass sie nach M\u00f6glichkeit in ein anderes Rechenzentrum repliziert, und nicht auf eine Replik im selben Rechenzentrum, in dem sich der Master befindet. Die float IP zeigt auf den Master und auf jeden Slave. Im Idealfall sollte zwischen den Slaves eine Anfragerobustheit hergestellt werden. <em>sql proxy<\/em>, zum Beispiel auf der Clientseite. Verschiedene Typen von Clients ben\u00f6tigen m\u00f6glicherweise unterschiedliche Typen <em>sql proxy<\/em>, und nur die Entwickler der Clients wissen, welcher Typ welcher ben\u00f6tigt. Diese Funktionalit\u00e4t kann sowohl von einem externen Daemon als auch von einer Client-Bibliothek (Connection Pool) usw. realisiert werden. All dies liegt au\u00dferhalb des Themas der hochverf\u00fcgbaren Datenbankcluster (Hochverf\u00fcgbarkeit <em>SQL proxy<\/em> l\u00e4sst sich unabh\u00e4ngig realisieren, zusammen mit der Klientenverf\u00fcgbarkeit).<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka4\">Ausfall Tuchanka4<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellierung fehlertoleranter Cluster auf Basis von PostgreSQL und Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/e005ae90ffd63abdb272012b94735618.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Bei einem Ausfall eines Rechenzentrums (d.h. zwei Server) stimmt der Witness f\u00fcr den zweiten. Infolgedessen arbeiten in dem zweiten Rechenzentrum zwei Server: auf einem l\u00e4uft der Master, und auf diesen zeigt die Master-float-IP (f\u00fcr die Annahme von read-write-Anfragen); und auf dem zweiten Server arbeitet ein Slave mit synchroner Replikation, und auf diesen zeigt eine der Slave-float-IPs (f\u00fcr read-only-Anfragen).<\/p>\n<p><\/p>\n<p>Das erste, was zu beachten ist: Arbeitsf\u00e4hige Slave-float-IPs werden nicht alle sein, sondern nur eine. Und f\u00fcr die korrekte Arbeit mit dieser muss sichergestellt sein, dass <em>sql proxy<\/em> Alle Anfragen wurden an die einzig verbleibende float IP umgeleitet; falls nicht, <em>sql proxy<\/em> kann man alle float IPs der Slaves durch Kommas in der URL f\u00fcr die Verbindung auflisten. In diesem Fall wird die <em>libpq<\/em> Verbindung zum ersten aktiven IP hergestellt, so ist es im System f\u00fcr automatisiertes Testen implementiert. M\u00f6glicherweise wird es in anderen Bibliotheken, wie JDBC, nicht so funktionieren, und es ist erforderlich, <em>sql proxy<\/em>. Dies wurde so gemacht, weil f\u00fcr float IPs der Slaves ein Verbot besteht, gleichzeitig auf demselben Server zu laufen, damit sie gleichm\u00e4\u00dfig \u00fcber die Slave-Server verteilt werden, wenn mehrere betrieben werden.<\/p>\n<p><\/p>\n<p>Zweitens: Selbst im Falle eines Ausfalls des Rechenzentrums wird die synchrone Replikation erhalten bleiben. Und selbst wenn ein sekund\u00e4rer Ausfall passiert, also wenn einer der beiden Server im verbleibenden Rechenzentrum ausf\u00e4llt, wird der Cluster zwar aufh\u00f6ren, Dienste anzubieten, jedoch die Informationen \u00fcber alle best\u00e4tigten Transaktionen, f\u00fcr die er eine Commit-Best\u00e4tigung gegeben hat, behalten (keine Informationsverluste bei sekund\u00e4ren Ausf\u00e4llen).<\/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 fehlertoleranter Cluster auf Basis von 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 eine Situation, in der es drei voll funktionierende Rechenzentren gibt, in denen jeweils ein voll funktionierender DB-Server vorhanden ist. In diesem Fall <em>quorum device<\/em> nicht n\u00f6tig. In einem Rechenzentrum l\u00e4uft der Master, in den beiden anderen \u2014 Slaves. Die Replikation ist synchron, vom Typ ANY (slave1, slave2), das hei\u00dft, der Kunde erh\u00e4lt die Best\u00e4tigung des Commits, wenn einer der Slaves zuerst antwortet, dass er den Commit angenommen hat. Es gibt eine float IP f\u00fcr den Master und zwei f\u00fcr die Slaves. Im Gegensatz zu Tuchanka4 sind alle drei float IPs ausfallsicher. F\u00fcr die Lastenverteilung von read-only SQL-Anfragen kann man <em>sql proxy<\/em> (mit separater Ausfallsicherheit) verwenden, oder der einen H\u00e4lfte der Kunden eine Slave-float IP zuweisen und der anderen H\u00e4lfte die zweite.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka3\">Ausfall Tuchanka3<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellierung fehlertoleranter Cluster auf Basis von PostgreSQL und Pacemaker\" src=\"\/wp-content\/uploads\/2020\/08\/1e61158be3c23742384d3621e8f7896b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Im Falle eines Ausfalls eines der Rechenzentren bleiben zwei \u00fcbrig. In einem ist der Master und die float IP vom Master aktiv, im anderen \u2014 ein Slave und beide Slave-float IPs (auf der Instanz sollte eine doppelte Ressourcensicherung vorhanden sein, um alle Verbindungen von beiden Slave-float IPs anzunehmen). Zwischen Master und Slave gibt es eine synchrone Replikation. Au\u00dferdem wird der Cluster die Informationen \u00fcber die best\u00e4tigten und abgeschlossenen Transaktionen beibehalten (keine Informationsverluste) im Fall der Zerst\u00f6rung zweier Rechenzentren (sofern sie nicht gleichzeitig zerst\u00f6rt werden).<\/p>\n<p><\/p>\n<p><em>Eine detaillierte Beschreibung der Dateistruktur und der Bereitstellung habe ich beschlossen, nicht einzuf\u00fcgen. Wer spielen m\u00f6chte, kann das alles im README nachlesen. Ich gebe nur die Beschreibung des automatisierten Testsystems an.<\/em><\/p>\n<p><\/p>\n<h1 id=\"sistema-avtomaticheskogo-testirovaniya\">Automatisches Testsystem<\/h1>\n<p><\/p>\n<p>Zur \u00dcberpr\u00fcfung der Ausfallsicherheit von Clustern unter Simulation verschiedener St\u00f6rungen wurde ein automatisches Testsystem entwickelt. Es wird durch ein Skript gestartet <code>test\/failure<\/code>. Das Skript kann Cluster-IDs als Parameter 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>testet nur den zweiten und dritten Cluster. Wenn keine Parameter angegeben sind, werden alle Cluster getestet. Alle Cluster werden parallel getestet, und die Ergebnisse werden im Tmux-Paneel ausgegeben. Tmux verwendet einen dedizierten Tmux-Server, daher kann das Skript aus dem Standard-Tmux gestartet werden, wodurch ein verschachtelter Tmux entsteht. Ich empfehle, ein gro\u00dfes Terminal mit kleiner Schriftgr\u00f6\u00dfe zu verwenden. Vor Beginn des Tests werden alle VMs auf den Snapshot zum Zeitpunkt des Skriptabschlusses zur\u00fcckgesetzt. <code>setup<\/code>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellierung fehlertoleranter Cluster auf Basis von 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 entsprechend der Anzahl der getesteten Cluster aufgeteilt, standardm\u00e4\u00dfig (im Screenshot) sind es vier. Ich werde den Inhalt der Spalten am Beispiel von Tuchanka2 weiter erl\u00e4utern. Die Paneele auf dem Screenshot sind nummeriert:<\/p>\n<p><\/p>\n<ol>\n<li>Hier werden die Statistiken der Tests angezeigt. Spalten:\n<ul>\n<li><strong>failure<\/strong> \u2014 der Name des Tests (Funktion im Skript), der die St\u00f6rung emuliert.<\/li>\n<li><strong>Reaktion<\/strong> \u2014 die durchschnittliche Zeit in Sekunden, die ben\u00f6tigt wird, damit der Cluster seine Betriebsf\u00e4higkeit wiederherstellt. Gemessen wird ab dem Beginn der Skriptausf\u00fchrung, das die St\u00f6rung emuliert, bis zu dem Zeitpunkt, an dem der Cluster seine Betriebsf\u00e4higkeit wiederherstellt und weiterhin Dienste anbieten kann. Wenn die Zeit sehr kurz ist, zum Beispiel sechs Sekunden (was in Clustern mit mehreren Arbeitern (Tuchanka3 und Tuchanka4) vorkommen kann), bedeutet dies, dass die St\u00f6rung auf einem asynchronen Arbeiter aufgetreten ist und sich nicht auf die Betriebsf\u00e4higkeit ausgewirkt hat, es gab keine Statuswechsel im Cluster.<\/li>\n<li><strong>deviation<\/strong> \u2014 zeigt die Streuung (Pr\u00e4zision) des Wertes <strong>Reaktion<\/strong> durch die Methode \u201eStandardabweichung\u201c an.<\/li>\n<li><strong>count<\/strong> \u2014 wie oft dieser Test ausgef\u00fchrt wurde.<\/li>\n<\/ul>\n<\/li>\n<li>Das kurze Protokoll gibt Aufschluss dar\u00fcber, womit der Cluster gerade besch\u00e4ftigt ist. Es wird die Iterationsnummer (Test), der Zeitstempel und der Name der Operation angezeigt. Eine zu lange Ausf\u00fchrung (&gt; 5 Minuten) weist auf ein Problem hin.<\/li>\n<li><strong>heart<\/strong> (Herz) \u2014 die aktuelle Zeit. Zur visuellen Beurteilung der Funktionalit\u00e4t <em>Meister<\/em> wird in seine Tabelle st\u00e4ndig die aktuelle Zeit unter Verwendung der Float-IP des Meisters geschrieben. Bei Erfolg wird das Ergebnis in diesem Panel angezeigt.<\/li>\n<li><strong>Schlag<\/strong> (Puls) \u2014 die \u201eaktuelle Zeit\u201c, die zuvor vom Skript aufgezeichnet wurde <strong>heart<\/strong> in den Meister, wird jetzt gelesen von <em>Slave<\/em> durch seine Float-IP. Dies erm\u00f6glicht eine visuelle Beurteilung der Funktionalit\u00e4t des Slaves und der Replikation. In Tuchanka1 gibt es keine Slaves mit Float-IP (keine Slaves, die Dienstleistungen erbringen), aber es gibt zwei Instanzen (DB), daher wird hier nicht <strong>Schlag<\/strong>, und <strong>heart<\/strong> die zweite Instanz angezeigt.<\/li>\n<li>\u00dcberwachung des Cluster-Zustands mit dem Tool <code>pcs mon<\/code>. Zeigt die Struktur, Ressourcenzuteilung nach Knoten und andere n\u00fctzliche Informationen an.<\/li>\n<li>Hier wird das Systemmonitoring von jeder virtuellen Maschine des Clusters angezeigt. Es kann mehr solcher Panels geben \u2014 je nach Anzahl der virtuellen Maschinen im Cluster. Zwei Diagramme <em>CPU-Auslastung<\/em> (in virtuellen Maschinen mit zwei Prozessoren), Name der virtuellen Maschine, <em>Systemauslastung<\/em> (genannt Load Average, weil er \u00fcber 5, 10 und 15 Minuten gemittelt ist), Daten zu Prozessen und Speicherzuweisung.<\/li>\n<li>Nachverfolgung des Skripts, das die Tests durchf\u00fchrt. Im Falle eines Fehlers \u2014 pl\u00f6tzlicher Arbeitsunterbrechung oder endlosem 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. Zuerst durchl\u00e4uft das Skript alle Testarten, w\u00e4hlt zuf\u00e4llig die virtuelle Maschine aus, auf die dieser Test angewendet werden soll. Danach wird ein unendlicher Testzyklus durchgef\u00fchrt, bei dem sowohl die virtuellen Maschinen als auch der Fehler jedes Mal zuf\u00e4llig ausgew\u00e4hlt werden. Ein pl\u00f6tzlicher Abschluss des Testskripts (unteres Panel) oder ein endloser Wartezyklus auf etwas (&gt; 5 Minuten Ausf\u00fchrungszeit einer Operation, was in der Nachverfolgung sichtbar ist) deutet darauf hin, dass einer der Tests auf diesem Cluster fehlgeschlagen ist.<\/p>\n<p><\/p>\n<p>Jeder Test besteht aus folgenden Operationen:<\/p>\n<p><\/p>\n<ol>\n<li>Ausf\u00fchren einer Funktion, die einen Fehler emuliert.<\/li>\n<li><strong>Bereit?<\/strong> \u2014 Warten auf die Wiederherstellung der Funktionalit\u00e4t des Clusters (wenn alle Dienstleistungen bereitgestellt werden).<\/li>\n<li>Angezeigt wird die Wartezeit bis zur Wiederherstellung des Clusters (<em>Reaktion<\/em>).<\/li>\n<li><strong>Reparatur<\/strong> \u2014 der Cluster wird \u201erepariert\u201c. Danach sollte er in den vollst\u00e4ndig funktionsf\u00e4higen Zustand zur\u00fcckkehren und bereit f\u00fcr den n\u00e4chsten Fehler sein.<\/li>\n<\/ol>\n<p><\/p>\n<p>Hier ist eine Liste der Tests mit einer Beschreibung, was sie tun:<\/p>\n<p><\/p>\n<ul>\n<li><strong>ForkBomb<\/strong>: erstellt &quot;Out of memory&quot; mit einer Fork-Bombe.<\/li>\n<li><strong>OutOfSpace<\/strong>: der Festplattenspeicher ist voll. Der Test ist jedoch eher symbolisch, da bei der geringen Last, die beim Testen entsteht, in der Regel keine Ausf\u00e4lle von PostgreSQL auftreten, wenn die Festplatte voll ist.<\/li>\n<li><strong>Postgres-KILL<\/strong>: t\u00f6tet 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 aus <code>VBoxManage controlvm &quot;virtuelle Maschine&quot; poweroff<\/code>.<\/li>\n<li><strong>Reset<\/strong>: startet die virtuelle Maschine mit dem Befehl neu <code>VBoxManage controlvm &quot;virtuelle Maschine&quot; zur\u00fccksetzen<\/code>.<\/li>\n<li><strong>SBD-STOP<\/strong>: h\u00e4ngt den SBD-Daemon 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 beendet korrekt den Betrieb.<\/li>\n<li><strong>UnLink<\/strong>: Netzwerkisolierung, Befehl <code>VBoxManage controlvm &quot;virtuelle Maschine&quot; setlinkstate1 aus<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Beenden des Tests entweder mit dem Standardbefehl tmux &quot;kill-window&quot; <strong>Ctrl-b &amp;<\/strong>, oder mit dem Befehl &quot;detach-client&quot; <strong>Ctrl-b d<\/strong>: dabei endet der Test, tmux wird geschlossen, und die virtuellen Maschinen werden heruntergefahren.<\/p>\n<p><\/p>\n<h1 id=\"vyyavlennye-pri-testirovanii-problemy\">Die beim Testen aufgetretenen Probleme<\/h1>\n<p><\/p>\n<ul>\n<li>\n<p>Zur Zeit <em>der watchdog Daemon sbd<\/em> verarbeitet das Stoppen der \u00fcberwachten Daemonen, jedoch nicht deren H\u00e4ngenbleiben. Folglich werden Fehler, die nur zu einem H\u00e4ngenbleiben f\u00fchren, fehlerhaft behandelt. <em>Corosync<\/em> und <em>Pacemaker<\/em>, aber sie h\u00e4ngen dabei nicht auf <em>sbd<\/em>. Zur \u00dcberpr\u00fcfung <em>Corosync<\/em> gibt es bereits <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClusterLabs\/sbd\/pull\/83\"><strong>PR#83<\/strong> (in GitHub bei <em>sbd<\/em>)<\/a><\/noindex>, verabschiedet in den Branch <em>master<\/em>. Versprochen wurde (in PR#83), dass es auch f\u00fcr Pacemaker etwas \u00c4hnliches geben wird, ich hoffe, dass dies bis <em>RedHat 8<\/em> realisiert wird. Doch solche \u201eFehler\u201c sind theoretisch, sie lassen sich leicht k\u00fcnstlich imitieren, zum Beispiel <code>killall -STOP corosync<\/code>, kommen jedoch in der Realit\u00e4t niemals vor.<\/p>\n<p>\n<\/li>\n<li>\n<p>Der <em>Pacemaker<\/em> In der Version f\u00fcr <em>CentOS 7<\/em> ist das <em>sync_timeout<\/em> arbeiten <em>quorum device<\/em>falsch gesetzt, mit der Folge, dass <noindex><a rel=\"nofollow\" href=\"https:\/\/lists.clusterlabs.org\/pipermail\/users\/2019-August\/026145.html\">bei einem Ausfall eines Knotens mit einer gewissen Wahrscheinlichkeit auch der zweite Knoten neu gestartet wurde<\/a><\/noindex>, auf den der Master \u00fcberwechseln sollte. Dieser Fehler wurde durch Erh\u00f6hung <em>sync_timeout<\/em> arbeiten <em>quorum device<\/em> w\u00e4hrend des Setups (im Skript <code>setup\/setup1<\/code>) behoben. Diese Korrektur wurde von den Entwicklern nicht akzeptiert, stattdessen haben sie versprochen, die Infrastruktur so zu \u00fcberarbeiten (irgendwann in der unbestimmten Zukunft), dass dieser Timeout automatisch berechnet wird. <em>Pacemaker<\/em>Wenn bei der Konfiguration der Datenbank angegeben ist, dass in<\/p>\n<p>\n<\/li>\n<li>\n<p>LC_MESSAGES <code>(Textnachrichten) Unicode verwendet werden kann, zum Beispiel<\/code> ru_RU.UTF-8 <code>, dann wird bei der Ausf\u00fchrung von<\/code>postgres <em>in einer Umgebung, in der die Locale nicht UTF-8 ist, beispielsweise in einer leeren Umgebung (hier<\/em> pacemaker <em>pgsqlms<\/em>+<em>(paf) gestartet wird<\/em>, werden im Log anstelle von UTF-8-Zeichen Fragezeichen angezeigt. <em>in einer Umgebung, in der die Locale nicht UTF-8 ist, beispielsweise in einer leeren Umgebung (hier<\/em>), dann <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/13FE0F7C-5140-499C-8C2E-0BE64BC3A48B%40ya.ru\">Die Entwickler von PostgreSQL haben sich nicht darauf geeinigt, was in diesem Fall zu tun ist. Das kann umgangen werden, indem man<\/a><\/noindex>LC_MESSAGES=en_US.UTF-8 <code>setzt.<\/code> Bei der Konfiguration (Erstellung) einer DB-Instanz.<\/p>\n<p>\n<\/li>\n<li>\n<p>Wenn wal_receiver_timeout eingestellt ist (standardm\u00e4\u00dfig 60s), findet beim Test PostgreSQL-STOP 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 der Replikation zum neuen Master statt.<\/a><\/noindex>Die Replikation dort ist synchron, daher stoppt nicht nur der Slave, sondern auch der neue Master. Dies wird durch Setzen von wal_receiver_timeout=0 bei der PostgreSQL-Konfiguration umgangen.<\/p>\n<p>\n<\/li>\n<li>\n<p>Selten beobachtete ich ein H\u00e4ngen der Replikation bei PostgreSQL im ForkBomb-Test (Speicher\u00fcberlauf). <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 zum neuen Master reconnecten.<\/a><\/noindex>Ich habe so etwas nur in den Clustern tuchanka3 und tuchanka4 erlebt, wo der Master aufgrund der synchronen Replikation h\u00e4ngen blieb. Das Problem verschwand von selbst nach einiger Zeit (etwa zwei Stunden). Zus\u00e4tzliche Untersuchungen sind erforderlich, um dies zu beheben. Nach den Symptomen scheint es sich um einen vorherigen Fehler zu handeln, der durch einen anderen Grund verursacht wird, aber mit denselben Konsequenzen.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Das Krogans-Bild wurde von <noindex><a rel=\"nofollow\" href=\"http:\/\/fav.me\/d8fo42n\">Deviant Art<\/a><\/noindex> mit Genehmigung des Autors entnommen:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellierung fehlertoleranter Cluster auf Basis von 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 5.0.1.1 - 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.\" \/>\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) 5.0.1.1\" \/>\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.\" \/>\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 basierend auf PostgreSQL und Pacemaker | ProHoster","description":"Einf\u00fchrung Vor einiger Zeit wurde mir die Aufgabe gestellt, ein ausfallsicheres Cluster f\u00fcr PostgreSQL zu entwickeln.","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.","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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}