{"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":"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6c445191705a4c96939cd094bc457a53.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Im Bericht wird Andrei Borodin erkl\u00e4ren, wie sie die Erfahrungen mit der Skalierung von PgBouncer bei der Entwicklung eines Connection Poolers ber\u00fccksichtigt haben. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex\/odyssey\">Odyssee<\/a><\/noindex>, wie sie es in die Produktion eingef\u00fchrt haben. Au\u00dferdem werden wir diskutieren, welche Funktionen wir uns in neuen Versionen des Poolers w\u00fcnschen w\u00fcrden: es ist uns wichtig, nicht nur unsere Bed\u00fcrfnisse zu erf\u00fcllen, sondern auch die Nutzergemeinschaft 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=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" 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 Andrei. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" 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. Heute haben wir das Thema \u00fcber Connection Pooler. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" 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 wissen. Ich m\u00f6chte unbedingt einen guten technischen Begriff finden, der sich in der technischen Literatur etablieren sollte. <\/p>\n<p><\/p>\n<p>Das Thema ist ziemlich komplex, da in vielen Datenbanken ein Connection Pooler integriert ist, \u00fcber den man nicht einmal Bescheid wissen muss. Sicherlich gibt es an einigen Stellen Konfigurationen, aber bei Postgres funktioniert das nicht so einfach. Parallel dazu h\u00e4lt Nikolai Samokhvalov auf der HighLoad++ 2019 eine Pr\u00e4sentation \u00fcber die Optimierung von Anfragen in Postgres. Ich habe den Eindruck, dass hier Personen sind, die ihre Anfragen bereits perfekt konfiguriert haben und die mit eher seltenen systemtechnischen Problemen zu k\u00e4mpfen haben, die mit Netzwerken und Ressourcennutzung verbunden sind. An manchen Stellen k\u00f6nnte das recht schwierig gewesen sein, da die Probleme nicht immer offensichtlich sind.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" 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. Im Yandex.Cloud befinden sich viele Yandex-Dienste. Wir verf\u00fcgen \u00fcber mehrere Petabyte an Daten, die nicht weniger als eine Million Anfragen pro Sekunde in Postgres generieren. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/288bfa37b9dcd60acd22ba48f0ef8a39.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir bieten allen Diensten einen ausreichend typischen Cluster an \u2013 dies umfasst die Haupt-Primary-Node und zwei herk\u00f6mmliche Replikate (eine synchrone und eine asynchrone), Backup und die Skalierung von Leseanfragen auf der Replik. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c249ca55bb387e25a5560324024cc523.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jeder Knoten im Cluster ist ein Postgres, auf dem neben Postgres und Systemmonitoring auch ein Connection Pooler installiert ist. Der Connection Pooler wird f\u00fcr das Fencing verwendet und erf\u00fcllt seine Hauptfunktion. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0e29be55cc048007db21c80bbb08a9d4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Was ist der Hauptzweck eines Connection Poolers? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e2fbbd440c2781573cb35deeef358f20.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In Postgres wird ein prozessorientiertes Modell f\u00fcr den Datenbankbetrieb verwendet. Das bedeutet, dass eine Verbindung einem Prozess entspricht, einem Backend von Postgres. In diesem Backend gibt es viele verschiedene Caches, die es kostspielig machen, sie f\u00fcr unterschiedliche Verbindungen zu variieren. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" 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 mit dem Namen procArray. Es enth\u00e4lt grundlegende Informationen \u00fcber die Netzwerkverbindungen. Fast alle Algorithmen zur Verarbeitung des procArray haben eine lineare Komplexit\u00e4t und durchlaufen das gesamte Array der Netzwerkverbindungen. Dies ist ein recht schneller Zyklus, aber bei vielen eingehenden Netzwerkverbindungen kann es etwas kostspieliger werden. Wenn alles ein wenig teurer wird, kann am Ende eine sehr hohe Summe f\u00fcr eine gro\u00dfe Anzahl von Netzwerkverbindungen anfallen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" 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 Anwendungsebene. <\/li>\n<li>Auf der Datenbankebene. <\/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. Unsere Freunde bei PostgreSQL Professional k\u00fcmmern sich haupts\u00e4chlich darum. Wann er verf\u00fcgbar sein wird, l\u00e4sst sich schwer vorhersagen. Tats\u00e4chlich stehen dem Architekten zwei L\u00f6sungen zur Auswahl: ein Anwendungspool und ein Proxy-Pool. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/702527a09e9fc86dd39b7fd69dcf1fc9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Der Anwendungspool ist der einfachste Weg. Fast alle Client-Treiber bieten eine M\u00f6glichkeit, Millionen Ihrer Verbindungen im Code als einige Dutzend Verbindungen zur Datenbank darzustellen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7b66b9e20d22f472ca5ac39f6b9e0ba4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hierbei tritt das Problem auf, dass Sie zu einem bestimmten Zeitpunkt Backend skalieren m\u00f6chten und es auf vielen virtuellen Maschinen bereitstellen wollen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f216fd7a8c01c2b07891e2242c48b06a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sp\u00e4ter erkennen Sie, dass Sie auch mehrere Verf\u00fcgbarkeitszonen und verschiedene Rechenzentren haben. Der Ansatz des Client-Side-Poolings f\u00fchrt zu hohen Zahlen \u2013 etwa 10.000 Verbindungen. Das ist die Obergrenze, bei der es einigerma\u00dfen funktioniert. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e5bc5f284fd8ff568bbe16c3895b7ac6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wenn wir \u00fcber Proxy-Pooler sprechen, gibt es zwei Pooler, die eine Menge Funktionen bieten. Sie sind nicht nur Pooler, sondern auch mit cooler Funktionalit\u00e4t ausgestattet. 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>Leider ist diese zus\u00e4tzliche Funktionalit\u00e4t nicht f\u00fcr alle erforderlich. Sie f\u00fchrt dazu, dass Pooler nur sogenanntes Session-Pooling unterst\u00fctzen, d. h. ein eingehender Client, ein ausgehender Client zur Datenbank. <\/p>\n<p><\/p>\n<p>F\u00fcr unsere Zwecke ist das nicht optimal, weshalb wir PgBouncer einsetzen, das Transaction-Pooling implementiert, d. h. serverseitige Verbindungen werden lediglich w\u00e4hrend der Transaktionszeit den Clientverbindungen zugeordnet. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e5fedbe14656d2ac2cde8d1878a950e2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Das ist in unserer Last tats\u00e4chlich der Fall. <strong>Es gibt jedoch einige Probleme.<\/strong>.<img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" 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 den Loopback, was die R\u00fcckverfolgung der Sitzung erschwert. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" 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. Das ist ein Weg, um auf der Seite des Bouncers die IP-Adresse dem application_name hinzuzuf\u00fcgen. Aber application_name wird \u00fcber eine zus\u00e4tzliche Verbindung festgelegt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/b4cec483aa776f48db7ad3966c3b78e4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In diesem Diagramm zeigt die gelbe Linie die tats\u00e4chlichen Anfragen und die blaue Linie die Anfragen, die in die Datenbank gelangen. Der Unterschied ist tats\u00e4chlich die Festlegung des application_name, der nur f\u00fcr die R\u00fcckverfolgung ben\u00f6tigt wird, jedoch keineswegs kostenlos ist. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c02ea73a6f1a2a4cd6af6c621f321ab4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Au\u00dferdem kann im Bouncer kein einzelner Pool eingeschr\u00e4nkt werden, das hei\u00dft, 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=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3431a463e04106066e2799aead66f571.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Was bedeutet das? Sie haben einen stark ausgelasteten Service, der in C++ geschrieben ist, und daneben l\u00e4uft ein kleiner Service in Node, der der Datenbank nichts Schlimmes 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=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/d7fa321714dc017b017945dffcf79bc6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nat\u00fcrlich haben wir einen kleinen Patch f\u00fcr Bouncer geschrieben, der diese Einstellung hinzugef\u00fcgt hat, d.h. die Begrenzung der Clients auf den Pool. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/d58884fc5ac0f90ff8442f126972157a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Man k\u00f6nnte dies auch auf der Seite von Postgres tun, also die Rollen in der Datenbank durch die Anzahl der Verbindungen einzuschr\u00e4nken.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8d6ff70db72964ed4eae5eaa47309931.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aber dabei verliert man die M\u00f6glichkeit zu verstehen, warum keine Verbindungen zum Server bestehen. PgBouncer gibt keinen Verbindungspfadfehler weiter, sondern liefert immer dieselbe Information zur\u00fcck. Und man kann nicht herausfinden: Vielleicht hat sich das Passwort ge\u00e4ndert, vielleicht ist die Datenbank einfach abgest\u00fcrzt, vielleicht stimmt etwas nicht. Aber es gibt keine Diagnosen. Wenn die Sitzung nicht hergestellt werden kann, erfahren Sie nicht, warum das nicht funktioniert. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" 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 Graphen der Anwendung an und sehen, dass die Anwendung nicht funktioniert.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e67c6680bb9a7f41242af9f9e4920916.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sie sehen an der Spitze, dass Bouncer einen einzelnen Thread verwendet. Das ist ein Wendepunkt f\u00fcr den Service. Sie realisieren, dass Sie sich auf die Skalierung Ihrer Datenbank in anderthalb Jahren vorbereitet haben, aber jetzt m\u00fcssen Sie den Pooler skalieren. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" 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=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" 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 ein wenig gepatcht. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/97755489a25ebfe38efd56ff897bd8fa.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und so eingerichtet, dass mehrere Bouncers mit Wiederverwendung von TCP-Ports aktiviert werden k\u00f6nnen. Das Betriebssystem verteilt eingehende TCP-Verbindungen zwischen ihnen automatisch im Round-Robin-Verfahren.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/ac30d3f067de2a8cd66ad2325c3a3b58.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>F\u00fcr die Kunden ist das transparent, das hei\u00dft, alles sieht so aus, als h\u00e4tten Sie einen einzigen Bouncer, aber es gibt eine Fragmentierung der idle-Verbindungen zwischen den aktiven Bouncers. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/53825f075db00b026c12013a610be456.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und zu einem bestimmten Zeitpunkt werden Sie feststellen, dass diese 3 Bouncers jeweils 100 % ihrer Kerne beanspruchen. Sie ben\u00f6tigen eine betr\u00e4chtliche Menge an Bouncers. Warum? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" 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 verf\u00fcgen \u00fcber eine verschl\u00fcsselte Verbindung. Und wenn Sie Postgres mit und ohne TLS benchmarken, werden Sie feststellen, dass die Anzahl der etablierten Verbindungen fast um zwei Gr\u00f6\u00dfenordnungen sinkt, wenn die Verschl\u00fcsselung aktiviert ist, da der TLS-Handshake CPU-Ressourcen verbraucht. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6101121ebe136af16e5eb1a484c65d66.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Im Dashboard sehen Sie eine Vielzahl von kryptografischen Funktionen, die bei einer Welle eingehender Verbindungen ausgef\u00fchrt werden. Da unser prim\u00e4rer Server zwischen Verf\u00fcgbarkeitszonen wechseln kann, ist eine Welle eingehender Verbindungen eine \u00fcbliche Situation. Das bedeutet, dass aus irgendeinem Grund der alte prim\u00e4re Server nicht verf\u00fcgbar war und die gesamte Last an ein anderes Rechenzentrum umgeleitet wurde. Alle werden gleichzeitig mit TLS winken. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" 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-Handshake-Requests k\u00f6nnte jedoch nicht mehr mit dem Bouncer interagieren, sondern ihn stattdessen unter Druck setzen. Aufgrund von Timeouts k\u00f6nnte die Welle eingehender Verbindungen anhalten. Wenn Sie einen Retry zur Datenbank ohne exponentiellen Backoff haben, kommen sie immer wieder in einer koh\u00e4renten Welle. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f42d0b210174d4d172254603ae6b834a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hier ist ein Beispiel mit 16 PgBouncern, die 16 Kerne zu 100 % auslasten.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8d048d3774c09e5b6a3fb3c7bff62084.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir haben uns f\u00fcr einen kaskadierenden PgBouncer entschieden. Dies ist die optimale Konfiguration f\u00fcr unsere Last mit Bouncer. Externe Bouncer sind f\u00fcr den TCP-Handshake zust\u00e4ndig, w\u00e4hrend interne Bouncer f\u00fcr das tats\u00e4chliche Pooling verwendet werden, um externe Verbindungen nicht zu stark zu fragmentieren.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" 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 reibungsloser Neustart m\u00f6glich. Man kann alle 18 Bouncers nacheinander neustarten. Allerdings ist es recht kompliziert, eine solche Konfiguration zu unterst\u00fctzen. Systemadministratoren, DevOps und Personen, die tats\u00e4chlich f\u00fcr diesen Server verantwortlich sind, werden mit einem solchen Setup nicht sehr zufrieden sein. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" 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 Weiterentwicklungen in Open Source vorantreiben, aber der Bouncer wird nicht besonders gut unterst\u00fctzt. Zum Beispiel wurde vor einem Monat die M\u00f6glichkeit, mehrere PgBouncers auf einem Port auszuf\u00fchren, implementiert. Der Pull-Request f\u00fcr diese Funktion wurde jedoch vor mehreren Jahren eingereicht. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" 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>Ein weiteres Beispiel: In Postgres k\u00f6nnen Sie eine laufende Abfrage abbrechen, indem Sie einen Secret \u00fcber eine andere Verbindung ohne zus\u00e4tzliche Authentifizierung senden. Einige Clients senden jedoch einfach einen TCP-Reset, also rei\u00dfen sie die Netzwerkverbindung ab. Was macht der Bouncer dabei? Er macht nichts. Er f\u00fchrt die Abfrage weiter aus. Wenn Sie eine gro\u00dfe Anzahl von Verbindungen haben, die kleine Abfragen ausf\u00fchren, die die Datenbank belasten, ist es nicht genug, nur die Verbindung vom Bouncer zu trennen; Sie m\u00fcssen auch die Abfragen beenden, die in der Datenbank laufen. <\/p>\n<p><\/p>\n<p>Das wurde gepatcht, und dieses Problem wurde immer noch nicht in das Upstream des Bouncers integriert. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a9695b6d9e640a5543dc73429eb0050b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Damit sind wir zu dem Punkt gekommen, dass wir unseren eigenen Connection-Pooler ben\u00f6tigen, der sich weiterentwickelt, gepatcht werden kann und schnell auf Probleme reagiert. Nat\u00fcrlich muss er auch mehrstufig sein. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e755cd9b06a004f0eced1dc12fd3a6fb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Die Mehrstufigkeit haben wir als prim\u00e4re Aufgabe definiert. Wir m\u00fcssen in der Lage sein, eine hohe Welle eingehender TLS-Verbindungen zuverl\u00e4ssig zu bew\u00e4ltigen. <\/p>\n<p><\/p>\n<p>Daf\u00fcr mussten wir eine eigene Bibliothek entwickeln, die Machinarium hei\u00dft und zur Beschreibung von Maschinenzust\u00e4nden bei Netzwerkverbindungen als sequenziellen Code dient. Wenn Sie sich den Quellcode von libpq ansehen, werden Sie ziemlich komplexe Aufrufe entdecken, die Ihnen ein Ergebnis zur\u00fcckgeben und sagen: \u201eRuf mich sp\u00e4ter wieder an. Ich habe aktuell IO, aber wenn das IO abgeschlossen ist, wird es eine CPU-Belastung geben\u201c. Und das ist ein mehrstufiges Schema. Netzwerkinteraktionen werden normalerweise durch Zustandsmaschinen beschrieben. Mit vielen Regeln wie \u201eWenn ich zuvor einen Header mit der Gr\u00f6\u00dfe N erhalten habe, dann erwarte ich jetzt N Bytes\u201c, \u201eWenn ich ein SYNC-Paket gesendet habe, erwarte ich jetzt ein Paket mit Metadaten zum Ergebnis\u201c. Es entsteht ein ziemlich schwieriger, kontraintuitiver Code, als ob ein Labyrinth in eine lineare Entfaltung umgewandelt wurde. Wir haben es so eingerichtet, dass der Programmierer anstelle einer Zustandsmaschine den Hauptpfad der Interaktion in Form von normalem imperativem Code beschreibt. In diesem imperativen Code m\u00fcssen einfach Stellen eingef\u00fcgt werden, an denen die Ausf\u00fchrungsreihenfolge unterbrochen werden muss, um auf Daten vom Netzwerk zu warten, indem der Ausf\u00fchrungskontext an eine andere Koroutine (Green Thread) \u00fcbergeben wird. Dieser Ansatz \u00e4hnelt dem, dass wir den wahrscheinlichsten Pfad im Labyrinth nacheinander aufzeichnen und dann Verzweigungen hinzuf\u00fcgen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a6bfb4b11961c7db3a7c7184674e3bc2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Letztendlich haben wir einen Stream, der TCP akzeptiert und \u00fcber Round-Robin mehrere Workers mit TCP-Verbindungen versorgt. <\/p>\n<p><\/p>\n<p>Dabei arbeitet jede Client-Verbindung immer auf einem Prozessor, was sie cache-freundlich macht. <\/p>\n<p><\/p>\n<p>Zus\u00e4tzlich haben wir die Zusammenstellung kleiner Pakete zu einem gro\u00dfen Paket optimiert, um den System-TCP-Stack zu entlasten.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" 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, indem Odyssey bei entsprechender Konfiguration CANCEL und ROLLBACK senden kann, wenn die Netzwerkverbindung unterbrochen wird, d.h. wenn auf die Anfrage niemand wartet. Odyssey informiert die Datenbank, dass sie die Anfrage nicht weiterverfolgen soll, um wertvolle Ressourcen zu sparen.<\/p>\n<p><\/p>\n<p>Wann immer m\u00f6glich, behalten wir die Verbindungen zum gleichen Client bei. Das verhindert, dass application_name_add_host neu eingerichtet wird. Wenn es m\u00f6glich ist, ben\u00f6tigen wir keine zus\u00e4tzliche Neukonfiguration von Parametern, die f\u00fcr die Diagnostik erforderlich sind. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/afb2fb7fb16d65c9ea73a8978d1eb83c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir arbeiten im Sinne von Yandex.Cloud. Wenn Sie managed PostgreSQL verwenden und einen Connection Pooler eingerichtet haben, k\u00f6nnen Sie eine logische Replikation nach au\u00dfen erstellen, d. h. Sie k\u00f6nnen uns verlassen, wenn Sie m\u00f6chten, mithilfe der logischen Replikation. Der Bouncer gibt den Datenstrom der logischen Replikation nach au\u00dfen nicht weiter. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" 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 Konfiguration der logischen Replikation. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a37d9d1abf288d17fa646b642e8b62ab.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Au\u00dferdem unterst\u00fctzen wir die physische Replikation nach au\u00dfen. In der Cloud ist dies nat\u00fcrlich nicht m\u00f6glich, da dann Ihr Cluster zu viele Informationen \u00fcber sich selbst preisgibt. In Ihren Installationen ist jedoch, falls Sie physische Replikation \u00fcber den Connection Pooler in Odyssey ben\u00f6tigen, dies m\u00f6glich. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/572934ce5b08115e57ab4b55d2153c6d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Odyssey bietet eine vollst\u00e4ndig kompatible \u00dcberwachung mit PgBouncer. Wir haben eine \u00e4hnliche Konsole, die fast alle gleichen Befehle ausf\u00fchrt. Wenn etwas fehlt, senden Sie uns einen Pull-Request oder zumindest ein Issue auf GitHub, und wir werden die ben\u00f6tigten Befehle fertigstellen. Aber die grundlegende Funktionalit\u00e4t der PgBouncer-Konsole ist bereits vorhanden. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" 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 auch ein Error Forwarding. Wir geben den Fehler zur\u00fcck, den die Datenbank gemeldet hat. Sie erhalten Informationen dar\u00fcber, warum Sie nicht auf die Datenbank zugreifen k\u00f6nnen, und nicht nur, dass Sie nicht darauf zugreifen k\u00f6nnen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/14b4cb0efa33a2658dfc528349a5382f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Diese Funktion wird deaktiviert, falls Sie 100 % Kompatibilit\u00e4t mit PgBouncer ben\u00f6tigen. Wir k\u00f6nnen uns \u00e4hnlich wie Bouncer verhalten, 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=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" 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>Es gibt zum Beispiel die Befehle \"Pause \/ Fortsetzen\". Diese werden normalerweise verwendet, um die Datenbank zu aktualisieren. Wenn Sie Postgres aktualisieren m\u00fcssen, k\u00f6nnen Sie es im Connection Pooler anhalten, ein pg_upgrade durchf\u00fchren und anschlie\u00dfend wieder fortsetzen. Aus Sicht des Clients wird es so aussehen, als ob die Datenbank einfach kurz angehalten wurde. Diese Funktionalit\u00e4t wurde uns von Mitgliedern der Community bereitgestellt. Sie ist noch nicht zusammengef\u00fchrt, aber bald wird alles bereit sein. (Bereits zusammengef\u00fchrt)<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" 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 jemandem gebracht wurde, der nicht bei Yandex.Cloud arbeitet. Beides ist komplexe und wichtige Funktionalit\u00e4ten. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f39346a543c88d17728233d05c2dff19.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Deshalb m\u00f6chte ich erz\u00e4hlen, woraus Odyssey besteht, falls Sie auch gerade ein wenig Code schreiben m\u00f6chten. <\/p>\n<p><\/p>\n<p>Sie haben eine urspr\u00fcngliche Odyssey-Datenbank, die auf zwei Hauptbibliotheken basiert. Die Kiwi-Bibliothek ist eine Implementierung des Postgres-Nachrichtenprotokolls. Das bedeutet, dass das native Proto 3 in Postgres die Standardnachrichten sind, \u00fcber die Front-Ends und Back-Ends miteinander kommunizieren k\u00f6nnen. Diese sind in der Kiwi-Bibliothek implementiert.<\/p>\n<p><\/p>\n<p>Die Machinarium-Bibliothek ist eine Implementierung von Streaming. Ein kleiner Teil dieses Machinarium ist in Assembler geschrieben. Aber keine Sorge, es sind nur 15 Zeilen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/cd18f250af50eabd53536b2c0d7f12b5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Architektur von Odyssey. Es gibt eine Hauptmaschine, in der Coroutines ausgef\u00fchrt werden. In dieser Maschine werden eingehende TCP-Verbindungen akzeptiert und an die Worker verteilt. <\/p>\n<p><\/p>\n<p>Innerhalb eines Workers kann ein Handler mehrere Clients bearbeiten. Au\u00dferdem laufen im Hauptthread die Konsole und die Verarbeitung von Cronaufgaben zur Entfernung von Verbindungen, die im Pool nicht mehr ben\u00f6tigt werden.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7072fb20f406f2ee5788542860ccdf50.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>F\u00fcr die Tests von Odyssey wird das Standard-Testset von Postgres verwendet. Wir f\u00fchren einfach install-check \u00fcber den Bouncer und Odyssey aus und erhalten ein Null-Div. Einige Tests, die mit der Datumsformatierung verbunden sind, schlagen sowohl beim Bouncer als auch bei Odyssey v\u00f6llig gleichm\u00e4\u00dfig fehl.<\/p>\n<p><\/p>\n<p>Dar\u00fcber hinaus gibt es zahlreiche Treiber, die entsprechend getestet werden. Diese Tests nutzen wir, um Odyssey zu pr\u00fcfen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/fb01cc9a0e9724ddcd3cc3d088afb182.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zudem m\u00fcssen wir aufgrund unserer Kaskaden-Konfiguration verschiedene Kombinationen testen: Postgres + Odyssey, PgBouncer + Odyssey, Odyssey + Odyssey, um sicherzustellen, dass Odyssey auch in einem der Teile der Kaskade weiterhin wie erwartet funktioniert. <\/p>\n<p><\/p>\n<p><strong>R\u00e4tsel<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/25855b691180bca083025b9e8b611c09.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir setzen Odyssey in der Produktion ein. Es w\u00e4re nicht fair zu sagen, dass alles reibungslos funktioniert. Ja, es funktioniert, aber nicht immer. Zum Beispiel lief in der Produktion alles gut, bis unsere Freunde von PostgreSQL Professional sagten, dass wir einen Memory Leak haben. Diese waren tats\u00e4chlich vorhanden, wir haben sie behoben. Aber es war einfach. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e638d88397b32b1ca0b74c9c1b905f81.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dann haben wir festgestellt, dass im Connection Pooler eingehende TLS-Verbindungen und ausgehende TLS-Verbindungen vorhanden sind. Und f\u00fcr die Verbindungen werden sowohl Client- als auch Serverzertifikate ben\u00f6tigt.<\/p>\n<p><\/p>\n<p>Die Bouncer- und Odyssey-Server-Zertifikate lesen ihren pcache neu, aber es ist nicht notwendig, die Client-Zertifikate aus dem pcache zu lesen, da unser skalierbarer Odyssey letztendlich an der Systemleistung der Zertifikatslesung scheitert. Das war f\u00fcr uns \u00fcberraschend, denn das Problem trat nicht sofort auf. Zun\u00e4chst skalierte es linear, aber nach 20.000 gleichzeitigen eingehenden Verbindungen trat die Problematik auf.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6cff094cd59a990e448b82fa0b1572b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Das Pluggable Authentication Method erm\u00f6glicht die Authentifizierung \u00fcber integrierte Linux-Methoden. In PgBouncer wird dies so umgesetzt, dass es einen separaten Thread zur Beantwortung von PAM-Anfragen gibt und einen Hauptthread, der die aktuelle Verbindung bedient und um eine vor\u00fcbergehende Aussetzung in den PAM-Thread bitten kann. <\/p>\n<p><\/p>\n<p>Wir haben das nicht umgesetzt aus einem einfachen Grund. Wir haben viele Threads. Warum sollten wir das ben\u00f6tigen?<\/p>\n<p><\/p>\n<p>Das kann letztendlich Probleme verursachen, denn wenn Sie eine PAM-Authentifizierung und keine PAM-Authentifizierung haben, kann eine gro\u00dfe Welle von PAM-Authentifizierungen die nicht PAM-Authentifizierung erheblich verz\u00f6gern. Das ist eines jener 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=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" 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. Diese werden dann an einen Worker-Pool weitergeleitet, wo der TLS-Handshake erfolgt.<\/p>\n<p><\/p>\n<p>Das bedeutet, wenn Sie eine koh\u00e4rente Welle von 20.000 Netzwerkverbindungen haben, werden sie alle akzeptiert. Auf der Client-Seite beginnt libpq dann mit dem Timeout-Countdown. Standardm\u00e4\u00dfig ist dies anscheinend auf 3 Sekunden eingestellt. <\/p>\n<p><\/p>\n<p>Wenn sie nicht gleichzeitig auf die Datenbank zugreifen k\u00f6nnen, bedeutet das, dass sie nicht auf die Datenbank zugreifen k\u00f6nnen, da alles nicht durch exponentielles Retry abgedeckt ist. <\/p>\n<p><\/p>\n<p>Wir haben die Strategie von PgBouncer \u00fcbernommen und implementiert, dass wir die Anzahl der TCP-Verbindungen, die wir akzeptieren, drosseln. <\/p>\n<p><\/p>\n<p>Wenn wir sehen, dass wir Verbindungen akzeptieren, diese aber letztendlich nicht den Handshake schaffen, setzen wir sie in eine Warteschlange, um Ressourcen des Hauptprozessors zu schonen. Das f\u00fchrt dazu, dass der gleichzeitige Handshake nicht f\u00fcr alle eingehenden Verbindungen durchgef\u00fchrt werden kann. Aber zumindest wird jemand auf die Datenbank zugreifen, auch wenn die Last hoch 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? Dass wir selbst entwickeln k\u00f6nnen und was wir von der Gemeinschaft erwarten?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" 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 der Odyssey-Fahrplan im August aus:<\/p>\n<p><\/p>\n<ul>\n<li>Wir wollten SCRAM- und PAM-Authentifizierung.<\/li>\n<li>Wir wollten, dass Leseanfragen an den Standby weitergeleitet werden. <\/li>\n<li>Wir h\u00e4tten gerne ein Online-Neustart. <\/li>\n<li>Und die M\u00f6glichkeit, den Server zu pausieren. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/455c92f92df826257c2c57dc2b034e22.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Die H\u00e4lfte dieses Fahrplans ist erledigt, und zwar nicht von uns. Das ist gut. Lassen Sie uns also \u00fcber das sprechen, was noch \u00fcbrig ist, und etwas hinzuf\u00fcgen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" 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 Weiterleitung von schreibgesch\u00fctzten Anfragen an den Standby betrifft.<\/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=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0873cffd4f1ae15d9ffa6d080671051b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Grunds\u00e4tzlich 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 die Datenbank ansprechen: um zu schreiben oder nur zu lesen. Der Treiber w\u00e4hlt selbst den ersten Host in der Liste aus, der am besten passt und die Anforderungen an die session_attrs erf\u00fcllt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" 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 den Lag der Replikation nicht kontrolliert. Es kann eine Replikation geben, die sich in einem f\u00fcr Ihren Dienst inakzeptablen Zeitrahmen verz\u00f6gert. Um eine vollst\u00e4ndige Ausf\u00fchrung von Leseanfragen auf der Replikation zu erm\u00f6glichen, m\u00fcssen wir in Odyssey die M\u00f6glichkeit unterst\u00fctzen, nicht zu funktionieren, wenn das Lesen nicht m\u00f6glich ist. <\/p>\n<p><\/p>\n<p>Odyssey muss gelegentlich die Datenbank abfragen, um den Replikationsabstand vom Primary zu ermitteln. Wenn dieser das Grenzwert erreicht hat, d\u00fcrfen keine neuen Anfragen an die Datenbank gestellt werden. Der Kunde sollte dar\u00fcber informiert werden, dass er die Verbindungen neu initiieren und m\u00f6glicherweise einen anderen Host f\u00fcr die Anfragen ausw\u00e4hlen muss. Dies erm\u00f6glicht es der Datenbank, den Replikationslag schneller zu beheben und wieder f\u00fcr Anfragen bereit zu sein. <\/p>\n<p><\/p>\n<p>Es ist schwierig, einen genauen Zeitrahmen anzugeben, da dies Open Source ist. Ich hoffe jedoch, dass es nicht wie bei den Kollegen von PgBouncer 2,5 Jahre dauert. Diese Funktion w\u00fcrde ich mir in Odyssey w\u00fcnschen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" 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>Derzeit k\u00f6nnen Sie Prepared Statements auf zwei Arten erstellen. Erstens k\u00f6nnen Sie den SQL-Befehl \"prepared\" ausf\u00fchren. Um diesen SQL-Befehl zu verstehen, m\u00fcssen wir SQL auf der Seite von Bouncer verstehen lernen. Das w\u00e4re \u00fcbertrieben, denn wir ben\u00f6tigen einen vollst\u00e4ndigen Parser. Wir k\u00f6nnen nicht jede SQL-Anweisung parsen. <\/p>\n<p><\/p>\n<p>Es gibt jedoch ein Prepared Statement auf der Ebene des Nachrichtenprotokolls in proto3. Und das ist der Punkt, an dem die Information \u00fcber die Erstellung des Prepared Statements in strukturierter Form ankommt. Wir k\u00f6nnten das Verst\u00e4ndnis unterst\u00fctzen, dass ein Client \u00fcber eine serverseitige Verbindung um die Erstellung von Prepared Statements gebeten hat. Selbst wenn die Transaktion abgeschlossen ist, m\u00fcssen wir die Konsistenz zwischen Server und Client aufrechterhalten. <\/p>\n<p><\/p>\n<p>Hier entsteht jedoch ein Missverst\u00e4ndnis im Dialog, da jemand dar\u00fcber spricht, dass es wichtig ist zu verstehen, welches spezifische Prepared Statement der Client erstellt hat und die serverseitige Verbindung zwischen allen Clients zu teilen, die diese serverseitige Verbindung hergestellt haben, also die, die ein solches Prepared Statement erstellt haben. <\/p>\n<p><\/p>\n<p>Andres Freund sagte, dass, wenn ein Kunde zu Ihnen kommt, der bereits in einer anderen serverseitigen Verbindung ein solches Prepared Statement erstellt hat, Sie es f\u00fcr ihn erstellen sollten. Aber es scheint ein wenig falsch zu sein, Datenbankanfragen anstelle des Clients auszuf\u00fchren. Aus der Sicht eines Entwicklers, der ein Protokoll f\u00fcr die Interaktion mit der Datenbank schreibt, w\u00e4re es jedoch bequem, wenn ihm einfach eine Netzwerkverbindung gegeben w\u00fcrde, die ein solches vorbereitetes Statement enth\u00e4lt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/cd56b3ad015195d86a64e52be365b16a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und noch eine Funktion, die wir umsetzen m\u00fcssen. Momentan haben wir Monitoring, das mit PgBouncer kompatibel ist. Wir k\u00f6nnen die durchschnittliche Ausf\u00fchrungszeit einer Anfrage zur\u00fcckgeben. Aber die durchschnittliche Zeit ist wie die Durchschnittstemperatur im Krankenhaus: Einige sind kalt, einige sind warm \u2013 im Durchschnitt sind alle gesund. Das ist nicht wahr. <\/p>\n<p><\/p>\n<p>Wir m\u00fcssen die Unterst\u00fctzung f\u00fcr Perzentile implementieren, die darauf hinweisen, dass es langsame Anfragen gibt, die Ressourcen verbrauchen, und die das Monitoring akzeptabler machen w\u00fcrden. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" 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 haben wollen (Version 1.1 ist bereits ver\u00f6ffentlicht). Der Punkt ist, dass Odyssey derzeit in der Version 1.0rc ist, also als Release-Candidate. Und all die Probleme, die ich aufgez\u00e4hlt habe, wurden genau mit dieser Version behoben, abgesehen von der Speicherleckage. <\/p>\n<p><\/p>\n<p>Was bedeutet Version 1.0 f\u00fcr uns? Wir setzen Odyssey auf unseren Datenbanken ein. Es funktioniert bereits auf unseren Datenbanken, aber wenn es den Punkt von 1.000.000 Anfragen pro Sekunde erreicht, k\u00f6nnen wir sagen, dass es sich um die Release-Version handelt und dass dies die Version ist, die wir 1.0 nennen k\u00f6nnen. <\/p>\n<p><\/p>\n<p>In der Community haben einige Personen um die Integration einer Pause und von SCRAM in Version 1.0 gebeten. Das w\u00fcrde jedoch bedeuten, dass wir bereits die n\u00e4chste Version in die Produktion bringen m\u00fcssten, da weder SCRAM noch die Pause bis jetzt zusammengef\u00fchrt wurden. Dieses Thema wird jedoch wahrscheinlich zeitnah gekl\u00e4rt werden. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey-Roadmap: Was wir uns noch vom Verbindungspuller w\u00fcnschen. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2f50de9f51f653a7396965239bd545e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ich erwarte eure Pull Requests. Zudem w\u00fcrde ich gerne erfahren, welche Probleme ihr mit Bouncer habt. Lasst uns dar\u00fcber sprechen. Vielleicht k\u00f6nnen wir einige Funktionen implementieren, die f\u00fcr euch wichtig sind. <\/p>\n<p><\/p>\n<p>An dieser Stelle bin ich fertig, und ich w\u00fcrde gerne von euch h\u00f6ren. Vielen Dank!<\/p>\n<p><\/p>\n<p>Fragen<\/p>\n<p><\/p>\n<p><em>Wenn ich meinen application_name festlege, wird er dann korrekt \u00fcbergeben, 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 er \u00fcbergeben.<\/em> <\/p>\n<p><\/p>\n<p>Wir werden das Set machen. <\/p>\n<p><\/p>\n<p><em>Und wenn meine echte Verbindung zu anderen Verbindungen wechselt, wird sie dann \u00fcbertragen?<\/em><\/p>\n<p><\/p>\n<p>Wir werden alle Parameter, die in der Liste aufgef\u00fchrt sind, setzen. Ich kann nicht sagen, ob application_name in dieser Liste enthalten ist. Ich habe ihn dort gesehen. Wir werden all die gleichen Parameter festlegen. Mit einer Anfrage wird alles gesetzt, was der Kunde beim Start festgelegt hat. <\/p>\n<p><\/p>\n<p><em>Vielen Dank, Andrei, f\u00fcr den Vortrag! Ein guter Vortrag! Ich freue mich, dass Odyssey sich mit jeder Minute schneller weiterentwickelt. Ich w\u00fcnsche weiterhin viel Erfolg. Wir haben uns bereits bei Ihnen nach einer Multi-Data-Source-Verbindung erkundigt, damit Odyssey gleichzeitig mit verschiedenen Datenbanken verbunden werden kann, d. h. Master-Slave, und danach automatisch nach einem Failover mit einem neuen Master verbunden werden kann.<\/em> <\/p>\n<p><\/p>\n<p>Ja, ich erinnere mich an diese Diskussion. Momentan gibt es mehrere Speicherl\u00f6sungen. Aber einen Wechsel zwischen ihnen gibt es nicht. Wir m\u00fcssen auf unserer Seite den Server abfragen, ob er noch aktiv ist und feststellen, dass ein Failover stattgefunden hat. Wer wird pg_recovery aufrufen? Ich habe eine Standardmethode, um zu erkennen, dass wir nicht mit dem Master verbunden sind. Wir sollten auch aus Fehlern lernen oder? Die Idee ist interessant und wird besprochen. Geben Sie mehr Kommentare. Wenn Sie Leute haben, die sich mit C auskennen, w\u00e4re das gro\u00dfartig. <\/p>\n<p><\/p>\n<p>Das Thema Skalierung von Replikaten interessiert uns ebenfalls, da wir die \u00dcbernahme von replizierten Clustern f\u00fcr Anwendungsentwickler so einfach wie m\u00f6glich gestalten m\u00f6chten. Hier h\u00e4tten wir gerne weitere Kommentare, d. h. wie genau man das am besten umsetzt. <\/p>\n<p><\/p>\n<p><em>Die Frage betrifft auch die Replikate. Es ergibt sich, 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 diese Unterschiede in den Daten so gravierend sein k\u00f6nnen, dass sie Ihr Gesch\u00e4ft nicht unterst\u00fctzen, und Sie werden nicht darauf zugreifen, bis die Replikation vollst\u00e4ndig ist. Wenn Sie jedoch lange nicht auf die Replikate zugegriffen haben und dann wieder anfangen, werden die ben\u00f6tigten Daten m\u00f6glicherweise nicht sofort verf\u00fcgbar sein. Das hei\u00dft, wenn wir st\u00e4ndig auf den Master zugreifen, ist der Cache dort aufgew\u00e4rmt, w\u00e4hrend der Cache in den Replikaten etwas hinterherhinkt.<\/em> <\/p>\n<p><\/p>\n<p>Ja, das stimmt. In pcache werden keine Datenbl\u00f6cke vorhanden sein, die Sie ben\u00f6tigen, im real cache wird es keine Informationen \u00fcber die Tabellen geben, die Sie suchen, und in den Pl\u00e4nen werden keine geparsten Abfragen vorhanden sein, es wird \u00fcberhaupt nichts geben. <\/p>\n<p><\/p>\n<p><em>Und wenn Sie einen Cluster haben und ein neues Replikat hinzuf\u00fcgen, dann ist alles schlecht, solange es gestartet wird, das hei\u00dft, es baut seinen Cache auf.<\/em> <\/p>\n<p><\/p>\n<p>Ich verstehe die Idee. Der richtige Ansatz w\u00e4re, zun\u00e4chst einen kleinen Prozentsatz der Anfragen an ein Replica zu senden, um den Cache aufzuw\u00e4rmen. Grob gesagt, haben wir die Bedingung, dass wir nicht mehr als 10 Sekunden hinter dem Master liegen d\u00fcrfen. Und diese Bedingung sollte nicht auf einmal, sondern schrittweise f\u00fcr einige Kunden aktiviert werden. <\/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 muss diese Deaktivierung implementiert werden. Zuerst m\u00fcssen wir uns abschalten, und dann \u00fcberlegen wir, wie wir wieder aktiv werden. Eine gro\u00dfartige Funktion, um sanft zu starten.<\/p>\n<p><\/p>\n<p><em>In Nginx gibt es eine solche Option <code>sanfter Start<\/code> im Cluster f\u00fcr den Server. Und er 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 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\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\" \/>\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) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\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:description\" content=\"\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\" \/>\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 uns sonst noch vom Connection-Pool w\u00fcnschen. Andrej Borodin (2019) | ProHoster","description":"In dem Bericht wird Andrei Borodin erl\u00e4utern, wie sie die Erfahrungen aus der Skalierung von PgBouncer beim Design des Connection Poolers Odyssey ber\u00fccksichtigt haben und wie sie ihn in die Produktion gebracht haben. Dar\u00fcber hinaus werden wir diskutieren, welche Funktionen wir uns in neuen Versionen des Poolers w\u00fcnschen w\u00fcrden: Es ist uns wichtig, nicht nur unsere Bed\u00fcrfnisse zu decken, sondern auch die Community der Odyssey-Nutzer weiterzuentwickeln. Video: Hallo zusammen! Mein Name ist Andrei. Bei Yandex besch\u00e4ftige ich mich mit","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:description":"\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","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"},"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}]}}