{"id":96515,"date":"2020-10-12T19:43:02","date_gmt":"2020-10-12T17:43:02","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/odyssey-roadmap-chto-eshhyo-my-hotim-ot-pulera-soedinenij-andrej-borodin-2019"},"modified":"2020-10-12T19:43:02","modified_gmt":"2020-10-12T17:43:02","slug":"odyssey-roadmap-chto-eshhyo-my-hotim-ot-pulera-soedinenij-andrej-borodin-2019","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/odyssey-roadmap-chto-eshhyo-my-hotim-ot-pulera-soedinenij-andrej-borodin-2019","title":{"rendered":"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/6c445191705a4c96939cd094bc457a53.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In dem Bericht wird Andrey Borodin erl\u00e4utern, wie sie die Erfahrungen mit der Skalierung von PgBouncer bei der Gestaltung des Connection Poolers ber\u00fccksichtigt haben. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex\/odyssey\">Odyssee<\/a><\/noindex>, wie sie es in der Produktion ausgerollt haben. Au\u00dferdem diskutieren wir, welche Funktionen wir uns im neuen Versionen des Poolers w\u00fcnschen w\u00fcrden: Es ist uns wichtig, nicht nur unsere eigenen Bed\u00fcrfnisse zu decken, sondern auch die Gemeinschaft der Benutzer weiterzuentwickeln. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex\/odyssey\">Odyssee<\/a><\/noindex>.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Video:<\/p>\n<p>\n<center><div class=\"youtube-placeholder\" data-id=\"OUx40ABHFZY\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/OUx40ABHFZY\/hqdefault.jpg\" alt=\"Video abspielen\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/dd2ea50b72e3d9c4e795aecbf9afdd25.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hallo zusammen! Mein Name ist Andrey. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/0a2f1880005bec1f61b72fb23b555adc.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Bei Yandex besch\u00e4ftige ich mich mit der Entwicklung von Open Source-Datenbanken. Und heute haben wir ein Thema \u00fcber den Connection Pooler. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/c18e7c937423d2514faa12e820e78e70.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wenn Sie wissen, wie man Connection Pooler auf Russisch nennt, lassen Sie es mich bitte wissen. Ich w\u00fcrde gerne einen guten technischen Begriff finden, der sich in der technischen Literatur etabliert. <\/p>\n<p><\/p>\n<p>Das Thema ist ziemlich kompliziert, weil viele Datenbanken einen eingebauten Connection Pooler haben und man dar\u00fcber nicht einmal Bescheid wissen muss. Einige Einstellungen gibt es zwar \u00fcberall, aber so l\u00e4uft es in Postgres nicht. Parallel dazu h\u00e4lt Nikolai Samokhvalov auf der HighLoad++ 2019 eine Pr\u00e4sentation \u00fcber die Optimierung von Abfragen in Postgres. Ich verstehe, dass hier Leute sind, die ihre Abfragen bereits perfekt optimiert haben, und das sind Personen, die mit selteneren systemtechnischen Problemen konfrontiert sind, die mit Netzwerken und Ressourcenauslastung zusammenh\u00e4ngen. An einigen Stellen k\u00f6nnte das ziemlich schwierig sein, da die Probleme nicht offensichtlich sind.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/89c660dd530575e2938e6bf312b83e95.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Bei Yandex gibt es Postgres. In Yandex.Cloud leben viele Dienste von Yandex. Wir haben mehrere Petabyte Daten, die nicht weniger als eine Million Abfragen pro Sekunde in Postgres generieren. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/288bfa37b9dcd60acd22ba48f0ef8a39.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und wir stellen allen Diensten ein ziemlich typisches Cluster zur Verf\u00fcgung \u2013 das ist der Haupt-Knoten des Clusters, zwei normale Replikate (ein synchrones und ein asynchrones), Datensicherung und die Skalierung von Leseabfragen auf dem Replikat. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/c249ca55bb387e25a5560324024cc523.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jeder Knoten des Clusters ist ein Postgres, auf dem au\u00dfer Postgres und System\u00fcberwachung auch ein Connection Pooler installiert ist. Der Connection Pooler wird f\u00fcr das Fencing und zu seinem eigentlichen Zweck verwendet. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/0e29be55cc048007db21c80bbb08a9d4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Was ist der eigentliche Zweck des Connection Pooler? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/e2fbbd440c2781573cb35deeef358f20.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In Postgres gilt das Prozessmodell f\u00fcr die Arbeit mit Datenbanken. Das bedeutet, dass eine Verbindung ein Prozess ist, ein Backend von Postgres. Und in diesem Backend gibt es viele verschiedene Caches, die es teuer machen, sie f\u00fcr verschiedene Verbindungen unterschiedlich zu gestalten. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/587498063b1af8fac4a845961c654bc2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dar\u00fcber hinaus gibt es im Postgres-Code ein Array namens procArray. Es enth\u00e4lt die grundlegenden Informationen \u00fcber Netzwerkverbindungen. Fast alle Algorithmen zur Verarbeitung des procArray haben eine lineare Komplexit\u00e4t, da sie das gesamte Array der Netzwerkverbindungen durchlaufen. Das ist ein ziemlich schneller Zyklus, aber mit einer gro\u00dfen Anzahl von eingehenden Netzwerkverbindungen wird es etwas teurer. Wenn es also teurer wird, kann man letztendlich einen sehr hohen Preis f\u00fcr eine gro\u00dfe Anzahl von Netzwerkverbindungen zahlen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/b534a38d0bfae7a65fc4258155a50280.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es gibt 3 m\u00f6gliche Ans\u00e4tze:<\/p>\n<p><\/p>\n<ul>\n<li>Auf der Anwendungseite. <\/li>\n<li>Auf der Datenbankseite. <\/li>\n<li>Und dazwischen, d. h. verschiedene Kombinationen. <\/li>\n<\/ul>\n<p><\/p>\n<p>Leider befindet sich der integrierte Pooler derzeit in der Entwicklungsphase. Freunde bei PostgreSQL Professional sind haupts\u00e4chlich damit besch\u00e4ftigt. Wann er erscheinen wird, ist schwer vorherzusagen. Tats\u00e4chlich haben wir f\u00fcr die Wahl des Architekten zwei L\u00f6sungen: den Pool auf der Anwendungseite und den Proxy-Pool. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/702527a09e9fc86dd39b7fd69dcf1fc9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Der Pool auf der Anwendungseite ist der einfachste Weg. Fast alle Client-Treiber bieten Ihnen die M\u00f6glichkeit, Millionen Ihrer Verbindungen im Code in wenigen Dutzend Datenbankverbindungen darzustellen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/7b66b9e20d22f472ca5ac39f6b9e0ba4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es gibt jedoch ein Problem, wenn Sie zu einem bestimmten Zeitpunkt den Backend skalieren m\u00f6chten, wenn Sie es auf viele virtuelle Maschinen bereitstellen m\u00f6chten. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/f216fd7a8c01c2b07891e2242c48b06a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dann erkennen Sie auch, dass Sie mehrere Verf\u00fcgbarkeitszonen und mehrere Rechenzentren haben. Der Ansatz mit dem Client-seitigen Pooling f\u00fchrt zu gro\u00dfen Zahlen. Gro\u00df bedeutet etwa 10.000 Verbindungen. Das ist das Maximum, was normal funktionieren kann. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/e5bc5f284fd8ff568bbe16c3895b7ac6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wenn man \u00fcber Proxy-Pooler spricht, gibt es zwei Pooler, die eine Menge F\u00e4higkeiten haben. Sie sind nicht nur Pooler. Sie sind Pooler + haben weitere gro\u00dfartige Funktionen. Das sind <noindex><a rel=\"nofollow\" href=\"https:\/\/www.pgpool.net\/\">Pgpool<\/a><\/noindex> und <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/crunchy-proxy\">Crunchy-Proxy<\/a><\/noindex>. <\/p>\n<p><\/p>\n<p>Aber leider ist diese zus\u00e4tzliche Funktionalit\u00e4t nicht f\u00fcr alle notwendig. Und das f\u00fchrt dazu, dass Pooler nur sessi\u00f6nliches Pooling unterst\u00fctzen, d. h. ein eingehender Client, ein ausgehender Client zur Datenbank. <\/p>\n<p><\/p>\n<p>F\u00fcr unsere Anforderungen ist das nicht sehr gut geeignet, daher verwenden wir PgBouncer, das Transaktions-Pooling implementiert, d. h. die Serververbindungen werden den Clientverbindungen nur f\u00fcr die Dauer der Transaktion zugeordnet. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/e5fedbe14656d2ac2cde8d1878a950e2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und bei unserer Last ist das tats\u00e4chlich der Fall. <strong>Aber es gibt einige Probleme.<\/strong>.<img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/61fd36cadcd9948d624dafa711777307.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Die Probleme beginnen, wenn Sie eine Sitzung diagnostizieren m\u00f6chten, da alle eingehenden Verbindungen lokal sind. Alle kommen \u00fcber loopback, und es wird schwierig, die Sitzung zu verfolgen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/36108c4956c410a1b1f286a88bc393d6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nat\u00fcrlich k\u00f6nnen Sie application_name_add_host verwenden. Dies ist eine Methode auf der Seite von Bouncer, um eine IP-Adresse zu application_name hinzuzuf\u00fcgen. Aber application_name wird \u00fcber eine zus\u00e4tzliche Verbindung festgelegt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/b4cec483aa776f48db7ad3966c3b78e4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In diesem Diagramm stellt die gelbe Linie die tats\u00e4chlichen Anfragen dar, w\u00e4hrend die blaue Linie die Anfragen sind, die in die Datenbank gelangen. Der Unterschied besteht darin, dass application_name eingestellt ist, der nur f\u00fcr das Tracking ben\u00f6tigt wird, aber keineswegs kostenlos ist. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/c02ea73a6f1a2a4cd6af6c621f321ab4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dar\u00fcber hinaus kann man in Bouncer keinen einzelnen Pool einschr\u00e4nken, d.h. die Anzahl der Verbindungen zur Datenbank f\u00fcr einen bestimmten Benutzer oder eine bestimmte Datenbank. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/3431a463e04106066e2799aead66f571.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Worauf f\u00fchrt das? Sie haben einen stark belasteten Dienst, der in C++ geschrieben ist, und in der N\u00e4he befindet sich ein kleiner Dienst in Node, der der Datenbank nichts antut, aber dessen Treiber verr\u00fcckt spielt. Er \u00f6ffnet 20.000 Verbindungen, w\u00e4hrend alles andere warten muss. Ihr Code ist sogar in Ordnung. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/d7fa321714dc017b017945dffcf79bc6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir haben nat\u00fcrlich einen kleinen Patch f\u00fcr Bouncer geschrieben, der diese Einstellung hinzugef\u00fcgt hat, d.h. eine Begrenzung der Clients auf den Pool. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/d58884fc5ac0f90ff8442f126972157a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Das h\u00e4tte man auf der Seite von Postgres machen k\u00f6nnen, d.h. die Rollen in der Datenbank auf eine bestimmte Anzahl von Verbindungen einschr\u00e4nken.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/8d6ff70db72964ed4eae5eaa47309931.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aber dann verlieren Sie die M\u00f6glichkeit zu verstehen, warum Sie keine Verbindungen zum Server haben. PgBouncer gibt keinen Verbindungsfehler durch, er gibt immer die gleiche Information zur\u00fcck. Und Sie k\u00f6nnen nicht verstehen: Vielleicht hat sich Ihr Passwort ge\u00e4ndert, vielleicht ist die Datenbank einfach abgest\u00fcrzt, vielleicht stimmt etwas nicht. Aber eine Diagnose gibt es nicht. Wenn eine Sitzung nicht hergestellt werden kann, erfahren Sie nicht, warum das nicht m\u00f6glich ist. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/cb3048344a94f2953bf403485d28e69f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Irgendwann schauen Sie sich die Diagramme der Anwendung an und sehen, dass die Anwendung nicht funktioniert.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/e67c6680bb9a7f41242af9f9e4920916.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sie schauen in den Task-Manager und sehen, dass Bouncer einthreaded ist. Das ist der Wendepunkt im Leben des Dienstes. Sie verstehen, dass Sie sich auf die Skalierung der Datenbank in anderthalb Jahren vorbereitet haben, aber jetzt m\u00fcssen Sie den Pooler skalieren. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/4c140c4ba6db19cb9939c1148638fb73.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir sind zu dem Schluss gekommen, dass wir mehr PgBouncer ben\u00f6tigen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/d369f572a66c16a8917e13393324a644.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/542629\/\">https:\/\/lwn.net\/Articles\/542629\/<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Wir haben Bouncer etwas gepatcht. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/97755489a25ebfe38efd56ff897bd8fa.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und haben es so eingerichtet, dass mehrere Bouncers \u00fcber TCP-Port-Wiederverwendung gestartet werden k\u00f6nnen. Und das Betriebssystem verteilt eingehende TCP-Verbindungen automatisch round-robin zwischen ihnen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/ac30d3f067de2a8cd66ad2325c3a3b58.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Das ist f\u00fcr die Clients transparent, d.h. es sieht so aus, als h\u00e4tten Sie einen Bouncer, aber es gibt eine Fragmentierung der idle-Verbindungen zwischen den laufenden Bouncers. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/53825f075db00b026c12013a610be456.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und irgendwann k\u00f6nnen Sie feststellen, dass diese 3 Bouncers jeweils ihren Kern zu 100 % verbrauchen. Sie ben\u00f6tigen ziemlich viele Bouncers. Warum? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/66c17883a043e157cd7ceab2c2a4e326.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Weil Sie TLS haben. Sie haben eine verschl\u00fcsselte Verbindung. Und wenn Sie PostgreSQL mit TLS und ohne TLS benchmarken, werden Sie feststellen, dass die Anzahl der aktiven Verbindungen um fast zwei Gr\u00f6\u00dfenordnungen mit aktivierter Verschl\u00fcsselung sinkt, da der TLS-Handshake CPU-Ressourcen verbraucht. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/6101121ebe136af16e5eb1a484c65d66.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und oben k\u00f6nnen Sie viele kryptografische Funktionen sehen, die bei der Welle eingehender Verbindungen ausgef\u00fchrt werden. Da unser prim\u00e4rer Server zwischen Verf\u00fcgbarkeitszonen wechseln kann, ist eine Welle eingehender Verbindungen eine recht typische Situation. Das bedeutet, dass aus irgendeinem Grund der alte prim\u00e4re Server nicht verf\u00fcgbar war und die gesamte Last in ein anderes Rechenzentrum gesendet wurde. Sie werden alle gleichzeitig zur Begr\u00fc\u00dfung mit TLS ankommen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/c238ac2f511568590dc275e01c192c00.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Eine gro\u00dfe Anzahl von TLS-Handshakes k\u00f6nnte sich jedoch nicht begr\u00fc\u00dfen, sondern ihn strangulieren. Aufgrund des Timeouts kann die Welle eingehender Verbindungen ununterbrochen werden. Wenn Sie einen Retry in die Datenbank ohne exponentiellen Backoff haben, werden sie immer wieder in einer koh\u00e4renten Welle ankommen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/f42d0b210174d4d172254603ae6b834a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hier ist ein Beispiel f\u00fcr 16 PgBouncer, die 16 Kerne zu 100 % auslasten.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/8d048d3774c09e5b6a3fb3c7bff62084.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir sind zu einem kaskadierenden PgBouncer gekommen. Dies ist die beste Konfiguration, die wir mit unserer Last auf dem Bouncer erreichen k\u00f6nnen. Externe Bouncers dienen uns f\u00fcr den TCP-Handshake, w\u00e4hrend interne Bouncers f\u00fcr das eigentliche Pooling dienen, um externe Verbindungen nicht zu stark zu fragmentieren.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/3a4ee4ea46d5fe8479a5a7222ee134da.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In dieser Konfiguration ist ein sanfter Neustart m\u00f6glich. Sie k\u00f6nnen alle 18 Bouncers einzeln neu starten. Aber es ist ziemlich schwierig, eine solche Konfiguration aufrechtzuerhalten. Systemadministratoren, DevOps und die Personen, die tats\u00e4chlich f\u00fcr diesen Server verantwortlich sind, werden mit einem solchen Schema nicht besonders erfreut sein. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/5291fe67dbe02036f3ff8e98bdd84d1b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es scheint, als k\u00f6nnten wir all unsere Anpassungen in Open Source vorantreiben, aber der Bouncer wird nicht sehr gut unterst\u00fctzt. Zum Beispiel wurde die M\u00f6glichkeit, mehrere PgBouncer auf einem Port auszuf\u00fchren, vor einem Monat eingepflegt. Der Pull-Request f\u00fcr diese Funktion wurde vor einigen Jahren gestellt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/2059d7f49649d136249103db4aa3ec19.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/libpq-cancel.html\">https:\/\/www.postgresql.org\/docs\/current\/libpq-cancel.html<\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pgbouncer\/pgbouncer\/pull\/79\">https:\/\/github.com\/pgbouncer\/pgbouncer\/pull\/79<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Oder ein weiteres Beispiel. In Postgres k\u00f6nnen Sie eine laufende Abfrage abbrechen, indem Sie ein geheimes Kommando \u00fcber eine andere Verbindung senden, ohne zus\u00e4tzliche Authentifizierung. Doch einige Clients senden einfach einen TCP-Reset, d. h. sie trennen die Netzwerkverbindung. Was wird Bouncer in diesem Fall tun? Er wird nichts tun. Er wird die Abfrage weiterhin ausf\u00fchren. Wenn Sie eine enorme Anzahl von Verbindungen haben, die die Datenbank mit kleinen Abfragen \u00fcberflutet haben, reicht es einfach nicht aus, die Verbindung von Bouncer zu trennen; es ist auch n\u00f6tig, die laufenden Abfragen, die in der Datenbank ausgef\u00fchrt werden, zu beenden. <\/p>\n<p><\/p>\n<p>Das wurde gepatcht und dieses Problem wurde immer noch nicht in den upstream Bouncer integriert. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/a9695b6d9e640a5543dc73429eb0050b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und so sind wir zu dem Punkt gelangt, dass wir unseren eigenen Connection Pooler ben\u00f6tigen, der sich weiterentwickeln, gepatcht werden kann, in dem wir Probleme schnell beheben k\u00f6nnen und der nat\u00fcrlich mehrthreading-f\u00e4hig sein muss. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/e755cd9b06a004f0eced1dc12fd3a6fb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Multithreading haben wir als Hauptaufgabe festgelegt. Wir m\u00fcssen gut mit der Welle eingehender TLS-Verbindungen umgehen k\u00f6nnen. <\/p>\n<p><\/p>\n<p>Daf\u00fcr mussten wir eine separate Bibliothek entwickeln, die Machinarium genannt wird und dazu dient, die Maschinenzust\u00e4nde einer Netzwerkverbindung als sequenziellen Code zu beschreiben. Wenn Sie den Quellcode von libpq ansehen, werden Sie ziemlich komplexe Aufrufe sehen, die Ihnen ein Ergebnis zur\u00fcckgeben und sagen: \u201eRuf mich sp\u00e4ter wieder an. Im Moment habe ich IO, aber wenn das IO vorbei ist, habe ich eine Last f\u00fcr den Prozessor\u201c. Und das ist ein mehrstufiges Schema. Netzwerkinteraktionen werden normalerweise als Zustandsmaschine beschrieben. Mit einer Vielzahl von Regeln wie: \u201eWenn ich vorher einen Header des Pakets der Gr\u00f6\u00dfe N erhalten habe, warte ich jetzt auf N Bytes\u201c oder \u201eWenn ich ein SYNC-Paket gesendet habe, warte ich jetzt auf ein Paket mit den Metadaten des Ergebnisses\u201c. Es entsteht ein ziemlich schwieriger, kontraintuitiver Code, als ob das Labyrinth in eine lineare Entfaltung umgewandelt worden w\u00e4re. Wir haben es so gemacht, dass der Programmierer anstelle einer Zustandsmaschine den Hauptpfad der Interaktion als normalen imperativen Code beschreibt. In diesem imperativen Code m\u00fcssen einfach Stellen eingef\u00fcgt werden, an denen die Ausf\u00fchrungsreihenfolge durch das Warten auf Daten aus dem Netzwerk unterbrochen werden muss, indem der Ausf\u00fchrungskontext an eine andere Koroutine (green thread) \u00fcbergeben wird. Dieser Ansatz \u00e4hnelt dem, dass wir den erwarteten Pfad im Labyrinth linear aufschreiben und dann Abzweigungen hinzuf\u00fcgen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/a6bfb4b11961c7db3a7c7184674e3bc2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Am Ende haben wir einen Thread, der TCP accept ausf\u00fchrt und das TCP-Verbindung durch Round-Robin an mehrere Worker weitergibt. <\/p>\n<p><\/p>\n<p>Dabei arbeitet jede Client-Verbindung immer auf einem einzigen Prozessor. Das macht sie cache-freundlich. <\/p>\n<p><\/p>\n<p>Au\u00dferdem haben wir die Zusammenstellung kleiner Pakete zu einem gro\u00dfen Paket \u00fcberarbeitet, um den System-TCP-Stack zu entlasten.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/7d740c23baecdd2f993c83cd54a0a8e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zudem haben wir das transaktionale Pooling verbessert, sodass Odyssey bei aktivierter Einstellung ein CANCEL und ROLLBACK senden kann, falls die Netzwerkverbindung unterbrochen wird, d. h. wenn niemand auf die Anfrage wartet. Odyssey wird der Datenbank mitteilen, dass sie sich nicht anstrengen soll, die Anfrage auszuf\u00fchren, die wertvolle Ressourcen verbrauchen k\u00f6nnte.<\/p>\n<p><\/p>\n<p>Wenn m\u00f6glich, behalten wir die Verbindungen zu demselben Client bei. Das erm\u00f6glicht es, application_name_add_host nicht neu zu installieren. Wenn dies m\u00f6glich ist, haben wir keine zus\u00e4tzliche Neuinstallation der Parameter, die f\u00fcr die Diagnose ben\u00f6tigt werden. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/afb2fb7fb16d65c9ea73a8978d1eb83c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir arbeiten im Interesse von Yandex.Cloud. Wenn Sie managed PostgreSQL verwenden und ein Connection Pooler eingerichtet haben, k\u00f6nnen Sie eine logische Replikation extern einrichten, d. h. Sie k\u00f6nnen uns verlassen, wenn Sie m\u00f6chten, durch logische Replikation. Der Bouncer wird die logische Replikation extern nicht weitergeben. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/c53defc92ebd8f3bec57ce64d97b9f72.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dies ist ein Beispiel f\u00fcr die Einrichtung der logischen Replikation. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/a37d9d1abf288d17fa646b642e8b62ab.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Au\u00dferdem haben wir Unterst\u00fctzung f\u00fcr die physische Replikation nach au\u00dfen. In der Cloud ist es selbstverst\u00e4ndlich nicht m\u00f6glich, da Sie sonst dem Cluster zu viele Informationen \u00fcber sich selbst geben w\u00fcrden. Aber in Ihren Installationen ist es m\u00f6glich, physische Replikation \u00fcber den Connection Pooler in Odyssey zu nutzen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/572934ce5b08115e57ab4b55d2153c6d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Odyssey hat ein voll kompatibles Monitoring mit PgBouncer. Wir haben eine \u00e4hnliche Konsole, die fast alle selben Befehle ausf\u00fchrt. Wenn etwas fehlt, senden Sie einen Pull Request oder zumindest ein Issue auf GitHub, und wir werden die ben\u00f6tigten Befehle erg\u00e4nzen. Aber die Hauptfunktionen der PgBouncer-Konsole sind bereits vorhanden. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/451dd798fb3523a7a174ebfe00a14bc5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und nat\u00fcrlich haben wir Error-Forwarding. Wir geben den Fehler zur\u00fcck, den die Datenbank gemeldet hat. Sie erhalten Informationen, warum Sie nicht in die Datenbank gelangen, und nicht einfach nur, dass Sie es nicht schaffen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/14b4cb0efa33a2658dfc528349a5382f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Diese Funktion kann deaktiviert werden, falls Sie 100%-ige Kompatibilit\u00e4t mit PgBouncer ben\u00f6tigen. Wir k\u00f6nnen uns so verhalten wie der Bouncer, nur f\u00fcr den Fall. <\/p>\n<p><\/p>\n<p><strong>Entwicklung<\/strong><\/p>\n<p><\/p>\n<p>Einige Worte \u00fcber den Quellcode von Odyssey. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/6055d5ec9676c331a83592916a6a292f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex\/odyssey\/pull\/66\">https:\/\/github.com\/yandex\/odyssey\/pull\/66<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Zum Beispiel gibt es die Befehle \u201ePause \/ Fortsetzen\u201c. Diese werden normalerweise verwendet, um die Datenbank zu aktualisieren. Wenn Sie Postgres aktualisieren m\u00fcssen, k\u00f6nnen Sie es im Connection Pooler pausieren, ein pg_upgrade durchf\u00fchren und danach wieder fortsetzen. Aus Sicht des Clients wird es so aussehen, als ob die Datenbank einfach nur langsam war. Diese Funktionalit\u00e4t wurde uns von Personen aus der Community bereitgestellt. Sie ist noch nicht zusammengef\u00fchrt, wird aber bald verf\u00fcgbar sein. (Bereits zusammengef\u00fchrt)<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/d2f7c57e0ae3e466ec2a701bbdb8eb3f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex\/odyssey\/pull\/73\">https:\/\/github.com\/yandex\/odyssey\/pull\/73<\/a><\/noindex> \u2014 bereits zusammengef\u00fchrt<\/p>\n<p><\/p>\n<p>Dar\u00fcber hinaus ist eines der neuen Features in PgBouncer die Unterst\u00fctzung der SCRAM-Authentifizierung, die uns ebenfalls von einer Person gebracht wurde, die nicht bei Yandex.Cloud arbeitet. Beides ist eine komplexe und wichtige Funktionalit\u00e4t. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/f39346a543c88d17728233d05c2dff19.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Deshalb m\u00f6chte ich Ihnen erz\u00e4hlen, woraus Odyssey besteht, vielleicht m\u00f6chten Sie auch ein wenig Code schreiben. <\/p>\n<p><\/p>\n<p>Sie haben die Basis von Odyssey, die auf zwei Hauptbibliotheken basiert. Die Kiwi-Bibliothek ist eine Implementierung des Postgres-Nachrichtenprotokolls. Das hei\u00dft, das native Proto 3 bei Postgres sind die Standardnachrichten, mit denen Frontends und Backends kommunizieren k\u00f6nnen. Diese sind in der Kiwi-Bibliothek implementiert.<\/p>\n<p><\/p>\n<p>Die Machinarium-Bibliothek ist eine Bibliothek zur Implementierung von Threads. Ein kleiner Teil von Machinarium ist in Assembler geschrieben. Aber keine Sorge, es sind nur 15 Zeilen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/cd18f250af50eabd53536b2c0d7f12b5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Die Architektur von Odyssey. Es gibt die Hauptmaschine, in der Coroutines ausgef\u00fchrt werden. In dieser Maschine erfolgt die Annahme eingehender TCP-Verbindungen und die Verteilung auf Worker. <\/p>\n<p><\/p>\n<p>Innerhalb eines Workers kann ein Handler f\u00fcr mehrere Clients arbeiten. Zudem laufen im Hauptthread die Konsole und die Verarbeitung von Cron-Jobs zur Entfernung von Verbindungen, die im Pool nicht mehr ben\u00f6tigt werden.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/7072fb20f406f2ee5788542860ccdf50.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zum Testen von Odyssey wird die standardm\u00e4\u00dfige Testsuite von Postgres verwendet. Wir f\u00fchren einfach den install-check \u00fcber Bouncer und \u00fcber Odyssey aus und erhalten ein Null-Div. Einige Tests, die mit der Formatierung von Daten zu tun haben, bestehen nicht ganz gleich in Bouncer und Odyssey.<\/p>\n<p><\/p>\n<p>Dar\u00fcber hinaus gibt es zahlreiche Treiber, die ihre eigenen Tests haben. Deren Tests verwenden wir, um Odyssey zu testen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/fb01cc9a0e9724ddcd3cc3d088afb182.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Au\u00dferdem m\u00fcssen wir aufgrund unserer gestaffelten Konfiguration verschiedene Kombinationen testen: Postgres + Odyssey, PgBouncer + Odyssey, Odyssey + Odyssey, um sicherzustellen, dass, wenn Odyssey in einem der Teile der Kaskade ist, es weiterhin so funktioniert, wie wir es erwarten. <\/p>\n<p><\/p>\n<p><strong>Grapple<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/25855b691180bca083025b9e8b611c09.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir verwenden Odyssey in der Produktion. Es w\u00e4re unfair zu sagen, dass alles einfach funktioniert. Ja, so ist es, aber nicht immer. Zum Beispiel hat es in der Produktion anfangs einfach funktioniert, dann kamen unsere Freunde von PostgreSQL Professional und sagten, dass wir ein Memory Leak haben. Sie hatten recht, wir haben es behoben. Aber das war einfach. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/e638d88397b32b1ca0b74c9c1b905f81.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dann stellten wir fest, dass im Connection Pooler eingehende TLS-Verbindungen und ausgehende TLS-Verbindungen vorhanden sind. Und f\u00fcr die Verbindungen sind Client-Zertifikate und Server-Zertifikate erforderlich.<\/p>\n<p><\/p>\n<p>Die Server-Zertifikate von Bouncer und Odyssey lesen ihr pcache erneut ein, aber die Client-Zertifikate m\u00fcssen nicht erneut aus dem pcache gelesen werden, weil unser skalierbares Odyssey schlie\u00dflich auf die Systemleistung beim Lesen dieses Zertifikats st\u00f6\u00dft. Das war eine \u00dcberraschung f\u00fcr uns, denn das Problem trat nicht sofort auf. Zuerst skalierte es linear, und nach 20.000 gleichzeitigen eingehenden Verbindungen zeigte sich dieses Problem.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/6cff094cd59a990e448b82fa0b1572b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pluggable Authentication Method ist die M\u00f6glichkeit, sich mit integrierten Linux-Mitteln zu authentifizieren. In PgBouncer wird es so implementiert, dass es einen separaten Thread gibt, der auf die Antwort von PAM wartet, und einen Haupt-Thread von PgBouncer, der die aktuelle Verbindung bedient und sie bitten kann, in dem PAM-Thread zu leben. <\/p>\n<p><\/p>\n<p>Wir haben das aus einem einfachen Grund nicht umgesetzt. Wir haben viele Threads. Warum brauchen wir das?<\/p>\n<p><\/p>\n<p>Letztendlich kann das Probleme verursachen, denn wenn Sie PAM-Authentifizierung und keine PAM-Authentifizierung haben, kann eine gro\u00dfe Welle von PAM-Authentifizierung die Nicht-PAM-Authentifizierung erheblich verz\u00f6gern. Das ist eine der Dinge, die wir nicht behoben haben. Aber wenn Sie das beheben m\u00f6chten, k\u00f6nnen Sie sich damit besch\u00e4ftigen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/c7bd9e9980ff7298b30a59c130f03dbb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ein weiteres Problem war, dass wir einen Thread haben, der alle eingehenden Verbindungen akzeptiert. Und dann werden sie an den Worker-Pool \u00fcbergeben, wo der TLS-Handschlag stattfinden wird.<\/p>\n<p><\/p>\n<p>Wenn Sie also eine koh\u00e4rente Welle von 20.000 Netzwerkverbindungen haben, werden sie alle akzeptiert. Und auf der Client-Seite beginnt libpq mit dem Timeout-Count. Standardm\u00e4\u00dfig betr\u00e4gt das anscheinend 3 Sekunden. <\/p>\n<p><\/p>\n<p>Wenn sie nicht alle gleichzeitig auf die Datenbank zugreifen k\u00f6nnen, k\u00f6nnen sie nicht auf die Datenbank zugreifen, weil das alles nicht mit einem exponentiellen Retry abgedeckt sein kann. <\/p>\n<p><\/p>\n<p>Wir haben beschlossen, hier das Schema von PgBouncer zu kopieren, um eine Begrenzung der Anzahl von TCP-Verbindungen zu haben, die wir akzeptieren. <\/p>\n<p><\/p>\n<p>Wenn wir sehen, dass wir eine Verbindung akzeptieren, diese aber letztendlich nicht den Handshake schaffen, setzen wir sie in eine Warteschlange, damit sie die Ressourcen der Zentraleinheit nicht verbrauchen. Dies f\u00fchrt dazu, dass der gleichzeitige Handshake nicht f\u00fcr alle eingehenden Verbindungen durchgef\u00fchrt werden kann. Aber zumindest kann jemand auf die Datenbank zugreifen, selbst wenn die Last stark ist.<\/p>\n<p><\/p>\n<p><strong>Roadmap<\/strong><\/p>\n<p><\/p>\n<p>Was w\u00fcrden wir in Zukunft in Odyssey gerne sehen? Was sind wir bereit, selbst zu entwickeln und was erwarten wir von der Community?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/4719437d80b33efc3da6572af9a4dedb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Stand August 2019.<\/strong><\/p>\n<p><\/p>\n<p>So sah die Roadmap von Odyssey im August aus:<\/p>\n<p><\/p>\n<ul>\n<li>Wir wollten SCRAM- und PAM-Authentifizierung.<\/li>\n<li>Wir wollten Forward-Leseanfragen an Standby. <\/li>\n<li>Wir h\u00e4tten gerne einen Online-Neustart. <\/li>\n<li>Und die M\u00f6glichkeit, auf dem Server eine Pause einzulegen. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/455c92f92df826257c2c57dc2b034e22.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Die H\u00e4lfte dieser Roadmap wurde erf\u00fcllt, und zwar nicht von uns. Und das ist gut. Lassen Sie uns also das besprechen, was noch \u00fcbrig ist, und noch etwas hinzuf\u00fcgen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/4a1daafbfe8d65ba0dd3e1ebdae8dd94.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex\/odyssey\/issues\/12\">Was die Weitergabe von schreibgesch\u00fctzten Abfragen an Standby angeht<\/a><\/noindex>? \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0440\u0435\u043f\u043b\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0435\u0437 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0433\u0440\u0435\u0442\u044c \u0432\u043e\u0437\u0434\u0443\u0445. \u041e\u043d\u0438 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f failover \u0438 switchover. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0438\u0445 \u0437\u0430\u043d\u044f\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u043e\u0439. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0435 \u0436\u0435 \u0441\u0430\u043c\u044b\u0435 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b, \u0442\u0443 \u0436\u0435 \u0441\u0430\u043c\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u043d\u0430\u0447\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/0873cffd4f1ae15d9ffa6d080671051b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Im Grunde gibt es in Postgres seit Version 10 die M\u00f6glichkeit, bei der Verbindung auch session_attrs anzugeben. Sie k\u00f6nnen in der Verbindung alle Datenbank-Hosts auflisten und angeben, warum Sie zur Datenbank gehen: um zu schreiben oder nur zu lesen. Der Treiber w\u00e4hlt selbst den ersten Host in der Liste aus, der ihm am besten gef\u00e4llt und die Anforderungen von session_attrs erf\u00fcllt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/0693d1327fe5826502a01c21d05d5b4c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Das Problem dieses Ansatzes ist jedoch, dass er das Replikationsdelay nicht \u00fcberwacht. Sie k\u00f6nnten eine Replik haben, die an einem f\u00fcr Ihren Dienst inakzeptablen Punkt zur\u00fcckliegt. Um eine vollst\u00e4ndige Verarbeitung von Leseanfragen auf der Replik zu erm\u00f6glichen, m\u00fcssen wir im Grunde genommen sicherstellen, dass Odyssey nicht arbeitet, wenn das Lesen nicht m\u00f6glich ist. <\/p>\n<p><\/p>\n<p>Odyssey sollte gelegentlich in die Datenbank gehen und das Replikationsabstand vom Prim\u00e4rserver abfragen. Und wenn dieses einen Grenzwert erreicht hat, sollten keine neuen Abfragen an die Datenbank zugelassen werden, und dem Client sollte gesagt werden, dass er die Verbindungen neu initiieren und m\u00f6glicherweise einen anderen Host f\u00fcr die Ausf\u00fchrung der Abfragen w\u00e4hlen muss. Dies erm\u00f6glicht es der Datenbank, das Replikationsdelay schneller wiederherzustellen und erneut auf Anfragen zu antworten. <\/p>\n<p><\/p>\n<p>Es ist schwierig, einen Zeitrahmen f\u00fcr die Umsetzung zu nennen, da es Open Source ist. Aber ich hoffe, dass es nicht 2,5 Jahre dauern wird wie bei den Kollegen von PgBouncer. Diese Funktion w\u00fcrden wir gerne in Odyssey sehen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/4ec3cd2ff7b2298927cccfe8e0ba890a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex\/odyssey\/issues\/16\">In der Community haben die Leute nach der Unterst\u00fctzung von Prepared Statements gefragt.<\/a><\/noindex>Jetzt k\u00f6nnen Sie ein Prepared Statement auf zwei Arten erstellen. Erstens k\u00f6nnen Sie den SQL-Befehl, n\u00e4mlich \u201eprepared\u201c, ausf\u00fchren. Um diesen SQL-Befehl zu verstehen, m\u00fcssen wir lernen, SQL auf der Bouncer-Seite zu verstehen. Es w\u00e4re \u00fcbertrieben, denn wir ben\u00f6tigen einen vollst\u00e4ndigen Parser. Wir k\u00f6nnen nicht jeden SQL-Befehl parsen. <\/p>\n<p><\/p>\n<p>Aber es gibt ein Prepared Statement auf der Ebene des Nachrichtenprotokolls in proto3. Und das ist der Punkt, an dem die Informationen dar\u00fcber, dass ein Prepared Statement erstellt wird, in strukturierter Form eintreffen. Wir k\u00f6nnten das Verst\u00e4ndnis unterst\u00fctzen, dass ein Client auf einer bestimmten Serververbindung gebeten hat, Prepared Statements zu erstellen. Und selbst wenn die Transaktion beendet ist, m\u00fcssen wir die Konsistenz zwischen Server und Client weiterhin aufrechterhalten. <\/p>\n<p><\/p>\n<p>Aber hier entsteht ein Inkonsistenz im Dialog, denn jemand sagt, dass wir verstehen m\u00fcssen, welche spezifischen Prepared Statements der Client erstellt hat und die Serververbindung zwischen allen Clients, die diese Serververbindung erstellt haben, zu trennen, d.h. die, die ein solches Prepared Statement geschaffen haben. <\/p>\n<p><\/p>\n<p>Andres Freund sagte, dass, wenn ein Client zu Ihnen kommt, der bereits in einer anderen Serververbindung ein solches Prepared Statement erstellt hat, Sie es f\u00fcr ihn erstellen sollten. Aber es scheint etwas problematisch zu sein, Anfragen an die Datenbank im Namen des Clients auszuf\u00fchren; jedoch w\u00e4re es aus der Sicht eines Entwicklers, der ein Protokoll f\u00fcr die Interaktion mit der Datenbank schreibt, praktisch, wenn ihm einfach eine Netzwerkverbindung zur Verf\u00fcgung gestellt w\u00fcrde, in der eine solche vorbereitete Anfrage vorhanden ist. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/cd56b3ad015195d86a64e52be365b16a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und eine weitere Funktion, die wir implementieren m\u00fcssen. Wir haben jetzt ein Monitoring, das mit PgBouncer kompatibel ist. Wir k\u00f6nnen die durchschnittliche Ausf\u00fchrungszeit einer Anfrage zur\u00fcckgeben. Doch die durchschnittliche Zeit ist wie die durchschnittliche Temperatur im Krankenhaus: jemand ist kalt, jemand ist warm \u2013 durchschnittlich sind alle gesund. Das ist nicht wahr. <\/p>\n<p><\/p>\n<p>Wir m\u00fcssen die Unterst\u00fctzung f\u00fcr Perzentile implementieren, die anzeigen, dass es langsame Anfragen gibt, die Ressourcen verbrauchen, und das Monitoring akzeptabler machen w\u00fcrden. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/6f285f3eb0d79e7f25d42f0e792b85b1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Das Wichtigste ist, dass wir Version 1.0 wollen (Version 1.1 ist bereits ver\u00f6ffentlicht). Das Problem ist, dass Odyssey sich jetzt in der Version 1.0rc befindet, d.h. als Release Candidate. Und all die Stolpersteine, die ich aufgez\u00e4hlt habe, wurden genau mit dieser Version behebt, abgesehen von dem Memory Leak. <\/p>\n<p><\/p>\n<p>Was bedeutet Version 1.0 f\u00fcr uns? Wir bringen Odyssey in unsere Datenbanken. Es funktioniert bereits jetzt in unseren Datenbanken, aber wenn es die Marke von 1.000.000 Anfragen pro Sekunde erreicht, k\u00f6nnen wir sagen, dass dies die Release-Version ist und dass dies die Version ist, die man 1.0 nennen kann. <\/p>\n<p><\/p>\n<p>In der Community haben mehrere Personen darum gebeten, dass in Version 1.0 auch eine Pause und SCRAM enthalten sind. Aber das w\u00fcrde bedeuten, dass wir die n\u00e4chste Version bereits in die Produktion bringen m\u00fcssten, da weder SCRAM noch die Pause bisher zusammengef\u00fchrt wurden. Aber h\u00f6chstwahrscheinlich wird dieses Thema relativ schnell gel\u00f6st werden. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\ud83e\udd47Windows 10 + Linux. Einrichtung der GUI KDE Plasma f\u00fcr Ubuntu 20.04 in WSL2. Schritt-f\u00fcr-Schritt-Anleitung | ProHoster\" src=\"\/wp-content\/uploads\/2020\/10\/2f50de9f51f653a7396965239bd545e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ich warte auf eure Pull Requests. Und ich w\u00fcrde auch gerne h\u00f6ren, welche Probleme ihr mit Bouncer habt. Lasst uns dar\u00fcber diskutieren. Vielleicht k\u00f6nnen wir einige Funktionen umsetzen, die ihr ben\u00f6tigt. <\/p>\n<p><\/p>\n<p>An dieser Stelle ist mein Teil beendet, ich w\u00fcrde gerne euch zuh\u00f6ren. Vielen Dank!<\/p>\n<p><\/p>\n<p>Fragen<\/p>\n<p><\/p>\n<p><em>Wenn ich mein application_name festlege, wird es korrekt weitergegeben, auch im Transaction Pooling in Odyssey?<\/em><\/p>\n<p><\/p>\n<p>In Odyssey oder in Bouncer?<\/p>\n<p><\/p>\n<p><em>In Odyssey. In Bouncer wird es weitergegeben.<\/em> <\/p>\n<p><\/p>\n<p>Wir werden ein Set machen. <\/p>\n<p><\/p>\n<p><em>Und wenn meine echte Verbindung springt und sich mit anderen Verbindungen verbindet, wird sie dann weitergegeben?<\/em><\/p>\n<p><\/p>\n<p>Wir werden ein Set aller Parameter machen, die in der Liste aufgef\u00fchrt sind. Ich kann nicht sagen, ob application_name in dieser Liste enthalten ist. Ich habe es dort zu sehen geglaubt. Wir werden alle gleichen Parameter festlegen. Mit einem einzigen Request wird dort alles gesetzt, was beim Start vom Client festgelegt wurde. <\/p>\n<p><\/p>\n<p><em>Danke, Andrey, f\u00fcr den Bericht! Guter Bericht! Ich freue mich, dass sich Odyssey mit jeder Minute schneller entwickelt. Ich w\u00fcnsche mir, dass es so weitergeht. Wir haben uns bereits an euch gewandt mit der Bitte um eine Multi-Datenquelle-Verbindung, damit Odyssey gleichzeitig mit verschiedenen Datenbanken verbunden werden kann, also Master-Slave, und dann automatisch nach einem Failover mit dem neuen Master verbunden wird.<\/em> <\/p>\n<p><\/p>\n<p>Ja, ich erinnere mich, dass ich diese Diskussion hatte. Derzeit gibt es mehrere Storages. Aber es gibt keinen Wechsel zwischen ihnen. Wir m\u00fcssen auf unserer Seite den Server abfragen, ob er noch lebt und verstehen, dass ein Failover stattgefunden hat, wer pg_recovery aufruft. Ich habe eine Standardmethode, um zu verstehen, dass wir nicht auf dem Master sind. Und wir m\u00fcssen es aus Fehlern heraus irgendwie erkennen, oder? Das hei\u00dft, die Idee ist interessant, sie wird diskutiert. Schreibt mehr Kommentare. Wenn ihr Arbeitskr\u00e4fte habt, die C kennen, w\u00e4re das gro\u00dfartig. <\/p>\n<p><\/p>\n<p>Die Frage der Skalierung von Replikaten interessiert uns ebenfalls, da wir die Einf\u00fchrung replizierter Cluster f\u00fcr Entwickler so einfach wie m\u00f6glich gestalten m\u00f6chten. Hier w\u00e4ren jedoch zus\u00e4tzliche Kommentare hilfreich, d. h. wie genau man es umsetzen kann und wie man es optimal macht. <\/p>\n<p><\/p>\n<p><em>Die Frage betrifft ebenfalls Replikate. Es ist so, dass Sie einen Master und mehrere Replikate haben. Und es ist klar, dass auf die Replikate seltener zugegriffen wird als auf den Master, da es Unterschiede geben kann. Sie haben gesagt, dass Unterschiede in den Daten so gro\u00df sein k\u00f6nnen, dass sie Ihr Gesch\u00e4ft nicht zufriedenstellen und Sie nicht darauf zugreifen werden, bis sie synchronisiert sind. Wenn Sie lange nicht darauf zugegriffen haben und dann wieder beginnen, werden die ben\u00f6tigten Daten sofort nicht verf\u00fcgbar sein. Das hei\u00dft, wenn wir st\u00e4ndig auf den Master zugreifen, ist der Cache dort<\/em> <\/p>\n<p><\/p>\n<p>Ja, das stimmt. Im pcache werden keine Datens\u00e4tze vorhanden sein, die Sie m\u00f6chten, im real cache werden keine Informationen zu den Tabellen vorhanden sein, die Sie ben\u00f6tigen, und in den Pl\u00e4nen werden keine analysierten Abfragen vorhanden sein, \u00fcberhaupt nichts wird vorhanden sein. <\/p>\n<p><\/p>\n<p><em>Und wenn Sie einen Cluster haben und dort ein neues Replikat hinzuf\u00fcgen, ist es w\u00e4hrend des Starts nicht gut, d. h. es baut seinen Cache langsam auf.<\/em> <\/p>\n<p><\/p>\n<p>Ich habe die Idee verstanden. Der richtige Ansatz w\u00e4re, zun\u00e4chst einen kleinen Prozentsatz der Anfragen auf das Replikat zu starten, um den Cache aufzuw\u00e4rmen. Vereinfacht gesagt, haben wir die Bedingung, dass wir nicht mehr als 10 Sekunden hinter dem Master zur\u00fcckbleiben d\u00fcrfen. Und diese Bedingung sollten wir nicht auf einmal, sondern schrittweise f\u00fcr einige Kunden aktivieren. <\/p>\n<p><\/p>\n<p><em>Ja, das Gewicht erh\u00f6hen.<\/em><\/p>\n<p><\/p>\n<p>Das ist eine gute Idee. Aber zuerst m\u00fcssen wir diese Abschaltung implementieren. Zuerst m\u00fcssen wir uns abschalten, dann \u00fcberlegen wir, wie wir uns wieder einschalten k\u00f6nnen. Das ist eine gro\u00dfartige Funktion, um schrittweise wieder aktiv zu werden.<\/p>\n<p><\/p>\n<p><em>In Nginx gibt es eine solche Option <code>slowly start<\/code> im Cluster f\u00fcr den Server. Und es erh\u00f6ht allm\u00e4hlich die Last.<\/em> <\/p>\n<p><\/p>\n<p>Ja, gro\u00dfartige Idee, wir werden es ausprobieren, wenn wir dazu kommen.<\/p>\n<p>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/522734\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u0434\u043e\u043a\u043b\u0430\u0434\u0435 \u0410\u043d\u0434\u0440\u0435\u0439 \u0411\u043e\u0440\u043e\u0434\u0438\u043d \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u0442, \u043a\u0430\u043a \u043e\u043d\u0438 \u0443\u0447\u043b\u0438 \u043e\u043f\u044b\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f PgBouncer \u043f\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0443\u043b\u0435\u0440\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 Odyssey, \u043a\u0430\u043a \u0432\u044b\u043a\u0430\u0442\u044b\u0432\u0430\u043b\u0438 \u0435\u0433\u043e \u0432 production. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043e\u0431\u0441\u0443\u0434\u0438\u043c \u043a\u0430\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0443\u043b\u0435\u0440\u0430 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0432\u0438\u0434\u0435\u0442\u044c \u0432 \u043d\u043e\u0432\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445: \u043d\u0430\u043c \u0432\u0430\u0436\u043d\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438, \u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u041e\u0434\u0438\u0441\u0441\u0435\u044f. \u0412\u0438\u0434\u0435\u043e: \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u043d\u0434\u0440\u0435\u0439. \u0412 \u042f\u043d\u0434\u0435\u043a\u0441\u0435 \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":96516,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-96515","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=\"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\/odyssey-roadmap-chto-eshhyo-my-hotim-ot-pulera-soedinenij-andrej-borodin-2019\" \/>\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\udd47Odyssey roadmap: \u0447\u0442\u043e \u0435\u0449\u0451 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043e\u0442 \u043f\u0443\u043b\u0435\u0440\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439. \u0410\u043d\u0434\u0440\u0435\u0439 \u0411\u043e\u0440\u043e\u0434\u0438\u043d (2019) | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/odyssey-roadmap-chto-eshhyo-my-hotim-ot-pulera-soedinenij-andrej-borodin-2019\" \/>\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-10-12T17:43:02+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-10-12T17:43:02+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\udd47Odyssey roadmap: was wir sonst noch vom Connection Pooler wollen. Andrey Borodin (2019) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/odyssey-roadmap-chto-eshhyo-my-hotim-ot-pulera-soedinenij-andrej-borodin-2019","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\udd47Odyssey roadmap: \u0447\u0442\u043e \u0435\u0449\u0451 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043e\u0442 \u043f\u0443\u043b\u0435\u0440\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439. \u0410\u043d\u0434\u0440\u0435\u0439 \u0411\u043e\u0440\u043e\u0434\u0438\u043d (2019) | ProHoster","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/odyssey-roadmap-chto-eshhyo-my-hotim-ot-pulera-soedinenij-andrej-borodin-2019","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-10-12T17:43:02+00:00","article:modified_time":"2020-10-12T17:43:02+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"96515","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 10:41:30","updated":"2022-10-01 00:02:14","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\/96515","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=96515"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/96515\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/96516"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=96515"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=96515"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=96515"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}