{"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\/sv\/blog\/administrirovanie\/odyssey-roadmap-chto-eshhyo-my-hotim-ot-pulera-soedinenij-andrej-borodin-2019","title":{"rendered":"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6c445191705a4c96939cd094bc457a53.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I rapporten ber\u00e4ttar Andrei Borodin hur de tog h\u00e4nsyn till erfarenheterna av att skala PgBouncer vid utformningen av en anslutningspoolare <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex\/odyssey\">Odyssey<\/a><\/noindex>, hur de rullade ut det i produktion. Dessutom kommer vi att diskutera vilka funktioner i poolaren vi skulle vilja se i nya versioner: det \u00e4r viktigt f\u00f6r oss att inte bara t\u00e4cka v\u00e5ra egna behov, utan ocks\u00e5 att utveckla anv\u00e4ndarsamh\u00e4llet <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex\/odyssey\">Odyssey<\/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=\"Spela video\" 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: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/dd2ea50b72e3d9c4e795aecbf9afdd25.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hej alla! Jag heter Andrei. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0a2f1880005bec1f61b72fb23b555adc.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>P\u00e5 Yandex arbetar jag med utveckling av open source-databaser. Och idag har vi \u00e4mnet ang\u00e5ende connection pooler. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c18e7c937423d2514faa12e820e78e70.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Om du vet hur man ben\u00e4mner connection pooler p\u00e5 svenska, s\u00e5 s\u00e4g g\u00e4rna till mig. Jag vill verkligen hitta en bra teknisk term som borde etableras i den tekniska litteraturen. <\/p>\n<p><\/p>\n<p>\u00c4mnet \u00e4r ganska komplext, eftersom m\u00e5nga databaser har inbyggda connection poolers och man ens inte beh\u00f6ver k\u00e4nna till dem. Det finns s\u00e5klart konfigurationer som \u00e4r gemensamma, men det fungerar inte p\u00e5 samma s\u00e4tt i Postgres. Samtidigt (p\u00e5 HighLoad++ 2019) h\u00e5lls en presentation av Nikolay Samokhvalov om att optimera fr\u00e5gor i Postgres. Jag f\u00f6rst\u00e5r att h\u00e4r har kommit personer som redan har optimerat sina fr\u00e5gor perfekt, och dessa personer st\u00e4lls inf\u00f6r mer s\u00e4llsynta systemproblem kopplade till n\u00e4tverk och resursutnyttjande. Ibland kan det vara ganska sv\u00e5rt eftersom problemen \u00e4r otydliga.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/89c660dd530575e2938e6bf312b83e95.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>P\u00e5 Yandex finns Postgres. I Yandex.Cloud lever m\u00e5nga av Yandex tj\u00e4nster. Vi har flera petabyte data som genererar minst en miljon fr\u00e5gor per sekund i Postgres. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/288bfa37b9dcd60acd22ba48f0ef8a39.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och vi tillhandah\u00e5ller en ganska typisk kluster f\u00f6r alla tj\u00e4nster \u2013 det \u00e4r den prim\u00e4ra noden, vanliga tv\u00e5 repliker (synkron och asynkron), backup, och skalning av l\u00e4sfr\u00e5gor p\u00e5 repliken. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c249ca55bb387e25a5560324024cc523.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Varje nod i klustret \u00e4r en Postgres som f\u00f6rutom Postgres och system\u00f6vervakning ocks\u00e5 har en connection pooler installerad. Connection poolern anv\u00e4nds f\u00f6r fencing och i sitt grundl\u00e4ggande syfte. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0e29be55cc048007db21c80bbb08a9d4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vad \u00e4r det grundl\u00e4ggande syftet med connection poolern? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e2fbbd440c2781573cb35deeef358f20.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I Postgres anv\u00e4nds en processmodell f\u00f6r att arbeta med databasen. Det betyder att en anslutning \u00e4r en process, en Postgres-backend. Och i denna backend finns det m\u00e5nga olika cachar som \u00e4r ganska dyra att skapa olika f\u00f6r olika anslutningar. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/587498063b1af8fac4a845961c654bc2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dessutom finns det en array i Postgres-koden som kallas procArray. Den inneh\u00e5ller grundl\u00e4ggande data om n\u00e4tverksanslutningar. N\u00e4stan alla algoritmer f\u00f6r att bearbeta procArray har linj\u00e4r komplexitet, de g\u00e5r igenom hela arrayen av n\u00e4tverksanslutningar. Det \u00e4r en ganska snabb loop, men med ett stort antal inkommande n\u00e4tverksanslutningar blir det lite dyrare. Och n\u00e4r allt blir lite dyrare kan man till slut betala ett mycket h\u00f6gt pris f\u00f6r ett stort antal n\u00e4tverksanslutningar. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/b534a38d0bfae7a65fc4258155a50280.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det finns tre m\u00f6jliga tillv\u00e4gag\u00e5ngss\u00e4tt:<\/p>\n<p><\/p>\n<ul>\n<li>P\u00e5 applikationssidan. <\/li>\n<li>P\u00e5 databasens sida. <\/li>\n<li>Och emellan, det vill s\u00e4ga alla m\u00f6jliga kombinationer. <\/li>\n<\/ul>\n<p><\/p>\n<p>Tyv\u00e4rr \u00e4r den inbyggda poolern just nu under utveckling. V\u00e4nner p\u00e5 f\u00f6retaget PostgreSQL Professional arbetar fr\u00e4mst med detta. N\u00e4r den \u00e4r klar \u00e4r sv\u00e5rt att f\u00f6ruts\u00e4ga. Och det finns i sj\u00e4lva verket tv\u00e5 l\u00f6sningar p\u00e5 arkitektens val. Det \u00e4r application-side pool och proxy pool. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/702527a09e9fc86dd39b7fd69dcf1fc9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Application-side pool \u00e4r det enklaste s\u00e4ttet. N\u00e4stan alla klientdrivrutiner ger dig m\u00f6jlighet att representera miljontals av dina anslutningar i koden som ett antal dussintals anslutningar till databasen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7b66b9e20d22f472ca5ac39f6b9e0ba4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Problemet uppst\u00e5r n\u00e4r du p\u00e5 ett visst s\u00e4tt vill skala bak\u00e5ten, du vill distribuera det p\u00e5 m\u00e5nga virtuella maskiner. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f216fd7a8c01c2b07891e2242c48b06a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sedan inser du ocks\u00e5 att du har flera tillg\u00e4nglighetszoner, flera datacenter. Och tillv\u00e4gag\u00e5ngss\u00e4ttet med klientbaserad poolning leder till stora siffror. Stora \u00e4r omkring 10 000 anslutningar. Det \u00e4r gr\u00e4nsen f\u00f6r vad som kan fungera normalt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e5bc5f284fd8ff568bbe16c3895b7ac6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00e4r det kommer till proxy-poolers finns det tv\u00e5 poolers som kan mycket. De \u00e4r inte bara poolers. De \u00e4r poolers + ytterligare fantastisk funktionalitet. Det \u00e4r <noindex><a rel=\"nofollow\" href=\"https:\/\/www.pgpool.net\/\">Pgpool<\/a><\/noindex> och <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/crunchy-proxy\">Crunchy-Proxy<\/a><\/noindex>. <\/p>\n<p><\/p>\n<p>Men tyv\u00e4rr beh\u00f6vs inte denna extra funktionalitet av alla. Och det leder till att poolers bara st\u00f6der sessionspoolning, det vill s\u00e4ga en inkommande klient, en utg\u00e5ende klient till databasen. <\/p>\n<p><\/p>\n<p>F\u00f6r v\u00e5ra uppgifter fungerar det inte s\u00e5 bra, d\u00e4rf\u00f6r anv\u00e4nder vi PgBouncer, som implementerar transaktionspoolning, det vill s\u00e4ga serveranslutningar kopplas till klientanslutningar endast under transaktionen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e5fedbe14656d2ac2cde8d1878a950e2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och vid v\u00e5r belastning \u00e4r det faktiskt sant. <strong>Men det finns n\u00e5gra problem<\/strong>.<img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/61fd36cadcd9948d624dafa711777307.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Problemen b\u00f6rjar n\u00e4r du vill diagnostisera en session, eftersom alla inkommande anslutningar \u00e4r lokala. Alla kom fr\u00e5n loopback och att p\u00e5 n\u00e5got s\u00e4tt sp\u00e5ra sessionen blir sv\u00e5rt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/36108c4956c410a1b1f286a88bc393d6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sj\u00e4lvklart kan du anv\u00e4nda application_name_add_host. Det \u00e4r ett s\u00e4tt f\u00f6r Bouncer att l\u00e4gga till en IP-adress i application_name. Men application_name st\u00e4lls in med en extra anslutning. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/b4cec483aa776f48db7ad3966c3b78e4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I den h\u00e4r grafen \u00e4r den gula linjen verkliga f\u00f6rfr\u00e5gningar, medan den bl\u00e5 linjen \u00e4r f\u00f6rfr\u00e5gningar som kommer in i databasen. Skillnaden h\u00e4r \u00e4r just inst\u00e4llningen av application_name, som beh\u00f6vs endast f\u00f6r sp\u00e5rning, men den \u00e4r absolut inte kostnadsfri. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c02ea73a6f1a2a4cd6af6c621f321ab4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dessutom kan man inte begr\u00e4nsa en pool i Bouncer, dvs. antalet anslutningar till databasen f\u00f6r en viss anv\u00e4ndare, f\u00f6r en viss databas. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3431a463e04106066e2799aead66f571.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vad leder detta till? Du har en belastad tj\u00e4nst skriven i C++ och n\u00e5gonstans i n\u00e4rheten en liten tj\u00e4nst p\u00e5 Node som inte g\u00f6r n\u00e5got farligt mot databasen, men dess drivrutin blir galen. Den \u00f6ppnar 20 000 anslutningar, medan allt annat f\u00e5r v\u00e4nta. Du har till och med en normal kod. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/d7fa321714dc017b017945dffcf79bc6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi har givetvis skrivit en liten patch f\u00f6r Bouncer som lade till denna inst\u00e4llning, dvs. begr\u00e4nsning av klienter till en pool. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/d58884fc5ac0f90ff8442f126972157a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det skulle kunna g\u00f6ras p\u00e5 Postgres-sidan, dvs. att roller i databasen begr\u00e4nsas till ett visst antal anslutningar.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8d6ff70db72964ed4eae5eaa47309931.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Men d\u00e5 f\u00f6rlorar du m\u00f6jligheten att f\u00f6rst\u00e5 varf\u00f6r du inte har n\u00e5gra anslutningar till servern. PgBouncer vidarebefordrar inte anslutningsfel, det returnerar alltid samma information. Och du kan inte f\u00f6rst\u00e5: kanske har ditt l\u00f6senord \u00e4ndrats, kanske har bara databasen fallit, kanske \u00e4r n\u00e5got fel. Men det finns ingen diagnos. Om en session inte kan uppr\u00e4ttas f\u00e5r du inte veta varf\u00f6r det inte g\u00e5r. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/cb3048344a94f2953bf403485d28e69f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vid en viss tidpunkt ser du p\u00e5 applikationens grafer och ser att applikationen inte fungerar.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e67c6680bb9a7f41242af9f9e4920916.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Du tittar p\u00e5 toppen och ser att Bouncer \u00e4r entr\u00e5dad. Det \u00e4r en v\u00e4ndpunkt i tj\u00e4nstens liv. Du inser att du har f\u00f6rberett dig f\u00f6r att skalera databasen om ett och ett halvt \u00e5r, men du beh\u00f6ver skala poolern. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4c140c4ba6db19cb9939c1148638fb73.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi har kommit fram till att vi beh\u00f6ver fler PgBouncer. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey 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>Vi har gjort en liten patch av Bouncer. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/97755489a25ebfe38efd56ff897bd8fa.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och vi har gjort s\u00e5 att flera Bouncers kan startas med \u00e5teranv\u00e4ndning av TCP-porten. Och operativsystemet omf\u00f6rdelar automatiskt inkommande TCP-anslutningar mellan dem med round-robin.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/ac30d3f067de2a8cd66ad2325c3a3b58.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Detta \u00e4r transparent f\u00f6r kunderna, dvs. allt ser ut som om du har en Bouncer, men du har en fragmentering av idle-anslutningar mellan de startade Bouncers. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/53825f075db00b026c12013a610be456.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vid en viss tidpunkt kan du m\u00e4rka att dessa tre Bouncers anv\u00e4nder 100 % av sina k\u00e4rnor. Du beh\u00f6ver ganska m\u00e5nga Bouncers. Varf\u00f6r? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/66c17883a043e157cd7ceab2c2a4e326.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>F\u00f6r att du har TLS. Du har en krypterad anslutning. Om du benchmarkar Postgres med TLS och utan TLS, kommer du att uppt\u00e4cka att antalet etablerade anslutningar minskar n\u00e4stan tv\u00e5 ordningar med kryptering aktiverad, eftersom TLS-handshake anv\u00e4nder CPU-resurser. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6101121ebe136af16e5eb1a484c65d66.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och i toppen kan du se ganska m\u00e5nga kryptografiska funktioner som utf\u00f6rs under en v\u00e5g av inkommande anslutningar. Eftersom v\u00e5r primary kan v\u00e4xla mellan tillg\u00e4nglighetszoner \u00e4r v\u00e5gen av inkommande anslutningar en ganska typisk situation. D.v.s. av n\u00e5gon anledning var den gamla primary otillg\u00e4nglig, och hela lasten skickades till ett annat datacenter. De kommer alla samtidigt f\u00f6r att h\u00e4lsa p\u00e5 med TLS. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c238ac2f511568590dc275e01c192c00.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och ett stort antal TLS-handshake kanske inte h\u00e4lsar p\u00e5 Bouncer l\u00e4ngre, utan ist\u00e4llet kv\u00e4ver honom. P\u00e5 grund av timeout kan v\u00e5gen av inkommande anslutningar bli o\u00e4ndlig. Om du har retry i databasen utan exponential backoff kommer de att komma tillbaka om och om igen p\u00e5 ett koherenta s\u00e4tt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f42d0b210174d4d172254603ae6b834a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>H\u00e4r \u00e4r ett exempel p\u00e5 16 PgBouncer som belastar 16 k\u00e4rnor till 100 %.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8d048d3774c09e5b6a3fb3c7bff62084.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi har kommit till den kaskad PgBouncer. Detta \u00e4r den b\u00e4sta konfigurationen vi kan uppn\u00e5 med v\u00e5r belastning p\u00e5 Bouncer. Yttre Bouncers anv\u00e4nds f\u00f6r TCP-handshake, medan inre Bouncers anv\u00e4nds f\u00f6r verklig pooling, f\u00f6r att inte fragmentera externa anslutningar alltf\u00f6r mycket.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3a4ee4ea46d5fe8479a5a7222ee134da.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I en s\u00e5dan konfiguration \u00e4r en smidig omstart m\u00f6jlig. Du kan omstarta alla dessa 18 Bouncers en och en. Men att underh\u00e5lla en s\u00e5dan konfiguration \u00e4r ganska sv\u00e5rt. Systemadministrat\u00f6rer, DevOps och de som verkligen ansvarar f\u00f6r denna server kommer inte att vara s\u00e4rskilt glada \u00f6ver ett s\u00e5dant uppl\u00e4gg. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5291fe67dbe02036f3ff8e98bdd84d1b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det verkar som om vi skulle kunna f\u00f6ra alla v\u00e5ra f\u00f6rb\u00e4ttringar till open source, men Bouncer f\u00e5r inte s\u00e5 bra st\u00f6d. Till exempel kom m\u00f6jligheten att k\u00f6ra flera PgBouncers p\u00e5 en port in f\u00f6r en m\u00e5nad sedan. Och pull requesten med den funktionen var f\u00f6r flera \u00e5r sedan. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey 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>Ett annat exempel. I Postgres kan du avbryta en p\u00e5g\u00e5ende beg\u00e4ran genom att skicka en hemlighet \u00f6ver en annan anslutning utan extra autentisering. Men vissa klienter skickar helt enkelt en TCP-reset, det vill s\u00e4ga de bryter n\u00e4tverksanslutningen. Vad g\u00f6r Bouncer i detta fall? Ingenting. Den forts\u00e4tter att utf\u00f6ra beg\u00e4ran. Om du har f\u00e5tt en stor m\u00e4ngd anslutningar som med sm\u00e5 beg\u00e4rningar har belastat databasen, r\u00e4cker det inte bara att koppla bort anslutningen fr\u00e5n Bouncer; du beh\u00f6ver \u00e4ven avsluta de beg\u00e4rningar som k\u00f6rs i databasen. <\/p>\n<p><\/p>\n<p>Detta har blivit patchat, men problemet har fortfarande inte mergats in i upstream Bouncer. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a9695b6d9e640a5543dc73429eb0050b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>S\u00e5 vi har kommit fram till att vi beh\u00f6ver v\u00e5r egen connection pooler som kommer att utvecklas, patchas, d\u00e4r vi snabbt kan \u00e5tg\u00e4rda problem och som sj\u00e4lvklart m\u00e5ste vara flertr\u00e5dad. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e755cd9b06a004f0eced1dc12fd3a6fb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Flertr\u00e5dning har vi satt som huvudm\u00e5l. Vi beh\u00f6ver kunna hantera en h\u00f6g v\u00e5g av inkommande TLS-anslutningar effektivt. <\/p>\n<p><\/p>\n<p>F\u00f6r detta var vi tvungna att utveckla ett separat bibliotek som heter Machinarium, vilket \u00e4r avsett f\u00f6r att beskriva maskinstatusar f\u00f6r n\u00e4tverksanslutningar som sekventiell kod. Om du tittar i k\u00e4llkoden f\u00f6r libpq kommer du att se ganska komplexa anrop som kan ge dig resultat och s\u00e4ga: \"Anropa mig lite senare. Just nu har jag IO, men n\u00e4r IO \u00e4r klart s\u00e5 har jag CPU-belastning.\" Och detta \u00e4r ett flerniv\u00e5schema. N\u00e4tverksinteraktioner beskrivs vanligtvis som en tillst\u00e5ndsmaskin. M\u00e5nga regler som \"Om jag tidigare har f\u00e5tt en paketheader av storlek N, s\u00e5 v\u00e4ntar jag nu p\u00e5 N byte\", \"Om jag har skickat ett SYNC-paket, s\u00e5 v\u00e4ntar jag nu p\u00e5 ett paket med resultatmetadata\". Det blir ganska sv\u00e5rfattad och kontraintuitiv kod, som om en labyrint hade omvandlats till en linj\u00e4r utveckling. Vi har gjort s\u00e5 att ist\u00e4llet f\u00f6r en tillst\u00e5ndsmaskin beskriver programmet den huvudsakliga interaktionsv\u00e4gen som vanlig imperativ kod. I denna imperativa kod m\u00e5ste man endast infoga platser d\u00e4r sekvensen beh\u00f6ver avbrytas f\u00f6r att v\u00e4nta p\u00e5 data fr\u00e5n n\u00e4tverket, genom att \u00f6verf\u00f6ra k\u00f6rkontexten till en annan korutin (gr\u00f6n tr\u00e5d). Denna strategi liknar att vi skriver ned den mest f\u00f6rv\u00e4ntade v\u00e4gen i labyrinten och sedan l\u00e4gger till f\u00f6rgreningar. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a6bfb4b11961c7db3a7c7184674e3bc2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I slut\u00e4ndan har vi en tr\u00e5d som g\u00f6r TCP accept och med round-robin \u00f6verf\u00f6r ett antal arbetare TCP-anslutningar. <\/p>\n<p><\/p>\n<p>Dessutom fungerar varje klientanslutning alltid p\u00e5 en processor. Detta g\u00f6r att den blir cache-v\u00e4nlig. <\/p>\n<p><\/p>\n<p>Och dessutom har vi f\u00f6rb\u00e4ttrat sammanslagningen av sm\u00e5 paket till ett stort paket f\u00f6r att avlasta det systemiska TCP-stacket.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7d740c23baecdd2f993c83cd54a0a8e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vidare har vi f\u00f6rb\u00e4ttrat den transaktionella poolningen, s\u00e5 att Odyssey med r\u00e4tt inst\u00e4llning kan skicka CANCEL och ROLLBACK i h\u00e4ndelse av ett n\u00e4tverksavbrott. Det vill s\u00e4ga, om ingen v\u00e4ntar p\u00e5 en f\u00f6rfr\u00e5gan, kommer Odyssey att meddela databasen att den inte ska f\u00f6rs\u00f6ka utf\u00f6ra den beg\u00e4ran som kan sl\u00f6sa v\u00e4rdefulla resurser.<\/p>\n<p><\/p>\n<p>Vi f\u00f6rs\u00f6ker ocks\u00e5 spara anslutningar f\u00f6r samma klient. Detta g\u00f6r att vi inte beh\u00f6ver \u00e5terinstallera application_name_add_host. Om m\u00f6jligt har vi inga extra installationer av de parametrar som beh\u00f6vs f\u00f6r diagnostik. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/afb2fb7fb16d65c9ea73a8978d1eb83c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi arbetar f\u00f6r Yandex.Cloud. Om du anv\u00e4nder managed PostgreSQL och har en installerad connection pooler kan du skapa logisk replikation ut\u00e5t, det vill s\u00e4ga du kan l\u00e4mna oss om du vill, genom logisk replikation. Bouncer kommer inte att skicka ut den logiska replikationsstr\u00f6mmen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c53defc92ebd8f3bec57ce64d97b9f72.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Detta \u00e4r ett exempel p\u00e5 inst\u00e4llning av logisk replikation. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a37d9d1abf288d17fa646b642e8b62ab.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dessutom har vi st\u00f6d f\u00f6r fysisk replikation ut\u00e5t. I Cloud \u00e4r det sj\u00e4lvklart inte m\u00f6jligt, eftersom det skulle ge din kluster f\u00f6r mycket information om sig sj\u00e4lv. Men i era installationer, om ni beh\u00f6ver fysisk replikation genom connection pooler i Odyssey, \u00e4r det m\u00f6jligt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/572934ce5b08115e57ab4b55d2153c6d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I Odyssey har vi fullst\u00e4ndig \u00f6verensst\u00e4mmelse med PgBouncer \u00f6vervakning. Vi har en liknande konsol som utf\u00f6r n\u00e4stan alla samma kommandon. Om n\u00e5got saknas, skicka g\u00e4rna ett pull request eller \u00e5tminstone en issue p\u00e5 GitHub, s\u00e5 kommer vi att l\u00e4gga till de n\u00f6dv\u00e4ndiga kommandona. Men den grundl\u00e4ggande funktionaliteten i PgBouncer-konsolen finns redan hos oss. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/451dd798fb3523a7a174ebfe00a14bc5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och sj\u00e4lvklart har vi error forwarding. Vi kommer att returnera det fel som databasen rapporterade. Du f\u00e5r information om varf\u00f6r du inte n\u00e5r databasen, ist\u00e4llet f\u00f6r bara att du inte n\u00e5r den. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/14b4cb0efa33a2658dfc528349a5382f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Denna funktion kan st\u00e4ngas av om du beh\u00f6ver 100%-ig kompatibilitet med PgBouncer. Vi kan bete oss som Bouncer, bara f\u00f6r s\u00e4kerhets skull. <\/p>\n<p><\/p>\n<p><strong>Utveckling<\/strong><\/p>\n<p><\/p>\n<p>N\u00e5gra ord om k\u00e4llkoden f\u00f6r Odyssey. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey 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>Till exempel finns det kommandon som \"Pause \/Resume\". De anv\u00e4nds vanligtvis f\u00f6r att uppdatera databasen. Om du beh\u00f6ver uppdatera Postgres kan du pausa den i connection poolern, g\u00f6ra pg_upgrade, och sedan \u00e5teruppta den. F\u00f6r klienten kommer det att se ut som att databasen bara var l\u00e5ngsam. Denna funktionalitet har kommit fr\u00e5n communityn. Den \u00e4r \u00e4nnu inte sammanfogad, men snart kommer allt att vara klart. (Redan sammanfogad)<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey 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 redan sammanfogad<\/p>\n<p><\/p>\n<p>Dessutom \u00e4r en av de nya funktionerna i PgBouncer st\u00f6d f\u00f6r SCRAM-autentisering, vilket ocks\u00e5 har kommit fr\u00e5n en person som inte arbetar p\u00e5 Yandex.Cloud. B\u00e5da dessa funktioner \u00e4r komplexa och viktiga. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f39346a543c88d17728233d05c2dff19.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>D\u00e4rf\u00f6r vill jag ber\u00e4tta om vad Odyssey \u00e4r byggt av, kanske du ocks\u00e5 vill skriva lite kod nu. <\/p>\n<p><\/p>\n<p>Du har en grundl\u00e4ggande version av Odyssey som bygger p\u00e5 tv\u00e5 huvudbibliotek. Biblioteket Kiwi \u00e4r en implementation av Postgres meddelandeprotokoll. Det vill s\u00e4ga, den inbyggda proto 3 i Postgres best\u00e5r av standardmeddelanden som front-end och back-end kan utbyta. De \u00e4r implementerade i biblioteket Kiwi.<\/p>\n<p><\/p>\n<p>Biblioteket Machinarium \u00e4r ett bibliotek f\u00f6r implementering av tr\u00e5dar. En liten del av denna Machinarium \u00e4r skriven i assembler. Men oroa dig inte, det handlar bara om 15 rader. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/cd18f250af50eabd53536b2c0d7f12b5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Odyssey-arkitektur. Det finns en huvudmaskin d\u00e4r coroutines k\u00f6rs. I denna maskin hanteras inkommande TCP-anslutningar och distribueras till workers. <\/p>\n<p><\/p>\n<p>Inuti en worker kan en hanterare arbeta med flera klienter. Dessutom k\u00f6rs konsolen och hanteringen av schemalagda uppgifter f\u00f6r att ta bort anslutningar som inte l\u00e4ngre beh\u00f6vs i poolen i huvudtr\u00e5den.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7072fb20f406f2ee5788542860ccdf50.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>F\u00f6r testning av Odyssey anv\u00e4nds en standardupps\u00e4ttning tester fr\u00e5n Postgres. Vi k\u00f6r bara install-check via Bouncer och via Odyssey, och f\u00e5r en nulldiv. Det finns flera tester kopplade till datumformat som inte g\u00e5r igenom p\u00e5 exakt samma s\u00e4tt i Bouncer och i Odyssey.<\/p>\n<p><\/p>\n<p>Dessutom finns det m\u00e5nga drivrutiner som har sina egna tester. Och deras tester anv\u00e4nder vi f\u00f6r att testa Odyssey.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/fb01cc9a0e9724ddcd3cc3d088afb182.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dessutom, p\u00e5 grund av v\u00e5r kaskadkonfiguration, m\u00e5ste vi testa olika kombinationer: Postgres + Odyssey, PgBouncer + Odyssey, Odyssey + Odyssey f\u00f6r att vara s\u00e4kra p\u00e5 att, om Odyssey befinner sig i n\u00e5gon del av kaskaden, det fortfarande fungerar som vi f\u00f6rv\u00e4ntar oss. <\/p>\n<p><\/p>\n<p><strong>R\u00e4fsor<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/25855b691180bca083025b9e8b611c09.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi anv\u00e4nder Odyssey i produktion. Det skulle vara or\u00e4ttvist att s\u00e4ga att allt bara fungerar. Nej, det g\u00f6r det inte alltid. Till exempel, i produktion fungerade allt bra, men sedan kom v\u00e5ra v\u00e4nner fr\u00e5n PostgreSQL Professional och ber\u00e4ttade att vi hade en minnesl\u00e4cka. De hade verkligen r\u00e4tt, och vi \u00e5tg\u00e4rdade det. Men det var en \u00f6verraskning. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e638d88397b32b1ca0b74c9c1b905f81.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sedan uppt\u00e4ckte vi att det finns inkommande och utg\u00e5ende TLS-anslutningar i connection poolern. Och f\u00f6r anslutningarna beh\u00f6vs b\u00e5de klientcertifikat och servercertifikat.<\/p>\n<p><\/p>\n<p>Servercertifikaten f\u00f6r Bouncer och Odyssey l\u00e4ser om sin pcache, men klientcertifikaten beh\u00f6ver inte l\u00e4sas om fr\u00e5n pcache eftersom v\u00e5r skalbara Odyssey till slut krockar med systemets l\u00e4sprestanda f\u00f6r detta certifikat. Detta var en \u00f6verraskning f\u00f6r oss, eftersom det inte blev en begr\u00e4nsning direkt. F\u00f6rst skalar det linj\u00e4rt, men efter 20 000 samtidiga inkommande anslutningar upptr\u00e4dde problemet.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6cff094cd59a990e448b82fa0b1572b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pluggable Authentication Method \u00e4r en m\u00f6jlighet att autentisera med inbyggda linux-verktyg. I PgBouncer \u00e4r det implementerat s\u00e5 att det finns en separat tr\u00e5d f\u00f6r att v\u00e4nta p\u00e5 svar fr\u00e5n PAM, och det finns en huvudtr\u00e5d i PgBouncer som hanterar den aktuella anslutningen och kan be dem v\u00e4nta i PAM-tr\u00e5den. <\/p>\n<p><\/p>\n<p>Vi valde att inte implementera detta av en enkel anledning. Vi har m\u00e5nga tr\u00e5dar. Varf\u00f6r skulle vi beh\u00f6va det?<\/p>\n<p><\/p>\n<p>Slutligen kan detta skapa problem med att om du har PAM-autentisering och icke-PAM-autentisering, kan en stor v\u00e5g av PAM-autentisering avsev\u00e4rt f\u00f6rdr\u00f6ja icke-PAM-autentiseringen. Det h\u00e4r \u00e4r en av de saker vi inte har \u00e5tg\u00e4rdat. Men om du vill \u00e5tg\u00e4rda det kan du ta dig an detta. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c7bd9e9980ff7298b30a59c130f03dbb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ytterligare ett problem var att vi har en tr\u00e5d som accepterar alla inkommande anslutningar. Och d\u00e4refter vidarebefordras de till arbetspoolen, d\u00e4r TLS-handshake kommer att ske.<\/p>\n<p><\/p>\n<p>I slut\u00e4ndan, om du har en koh\u00e4rent v\u00e5g av 20 000 n\u00e4tverksanslutningar, kommer alla att accepteras. Och p\u00e5 klientsidan b\u00f6rjar libpq att r\u00e4kna ned tidsavbrott. Som standard verkar det vara 3 sekunder d\u00e4r. <\/p>\n<p><\/p>\n<p>Om de alla inte kan komma in i databasen samtidigt, kan de inte komma in i databasen, eftersom allt detta kan t\u00e4ckas av en icke-exponentiell ompr\u00f6vning. <\/p>\n<p><\/p>\n<p>Vi kom fram till att vi kopierade schemat fr\u00e5n PgBouncer d\u00e4r vi har d\u00e4mpning av antalet TCP-anslutningar som vi g\u00f6r accept p\u00e5. <\/p>\n<p><\/p>\n<p>Om vi ser att vi accepterar anslutningar men de har sv\u00e5rt att genomf\u00f6ra handskakningen, placerar vi dem i k\u00f6 f\u00f6r att de inte ska anv\u00e4nda CPU-resurser. Detta inneb\u00e4r att samtidig handskakning kanske inte kan genomf\u00f6ras f\u00f6r alla anslutningar som kommit in. Men \u00e5tminstone f\u00e5r n\u00e5gon person i databasen \u00e5tkomst, \u00e4ven om belastningen \u00e4r ganska h\u00f6g.<\/p>\n<p><\/p>\n<p><strong>Roadmap<\/strong><\/p>\n<p><\/p>\n<p>Vad skulle vi vilja se i framtiden i Odyssey? Vad \u00e4r vi redo att utveckla sj\u00e4lva och vad f\u00f6rv\u00e4ntar vi oss fr\u00e5n gemenskapen?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4719437d80b33efc3da6572af9a4dedb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>I augusti 2019.<\/strong><\/p>\n<p><\/p>\n<p>S\u00e5 h\u00e4r s\u00e5g roadmapen f\u00f6r Odyssey ut i augusti:<\/p>\n<p><\/p>\n<ul>\n<li>Vi ville ha SCRAM och PAM autentisering.<\/li>\n<li>Vi ville ha fram\u00e5triktade l\u00e4sfr\u00e5gor p\u00e5 standby. <\/li>\n<li>Vi skulle vilja ha online-restart. <\/li>\n<li>Och m\u00f6jligheten att pausa servern. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/455c92f92df826257c2c57dc2b034e22.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>H\u00e4lften av denna roadmap \u00e4r genomf\u00f6rd, och det \u00e4r inte vi som har gjort det. Och det \u00e4r bra. S\u00e5 l\u00e5t oss diskutera det som \u00e5terst\u00e5r och l\u00e4gga till mer. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey 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\">N\u00e4r det g\u00e4ller fram\u00e5triktade l\u00e4sfr\u00e5gor till standby<\/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: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0873cffd4f1ae15d9ffa6d080671051b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I princip, i Postgres, fr\u00e5n version 10, finns det m\u00f6jlighet att ange session_attrs vid anslutningen. Du kan lista alla databashostar i anslutningen och ange varf\u00f6r du bes\u00f6ker databasen: f\u00f6r att skriva eller bara l\u00e4sa. Och drivrutinen v\u00e4ljer sj\u00e4lv den f\u00f6rsta hosten i listan som passar b\u00e4st, som uppfyller kraven p\u00e5 session_attrs. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0693d1327fe5826502a01c21d05d5b4c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Men problemet med detta angreppss\u00e4tt \u00e4r att det inte kontrollerar replikationsf\u00f6rdr\u00f6jningen. Du kan ha en replik som \u00e4r f\u00f6rsenad p\u00e5 ett oacceptabelt s\u00e4tt f\u00f6r din tj\u00e4nst. F\u00f6r att m\u00f6jligg\u00f6ra fullst\u00e4ndig utf\u00f6rande av l\u00e4sfr\u00e5gor p\u00e5 replik m\u00e5ste vi i princip st\u00f6dja i Odyssey att det inte fungerar n\u00e4r det inte \u00e4r m\u00f6jligt att l\u00e4sa. <\/p>\n<p><\/p>\n<p>Odyssey b\u00f6r d\u00e5 och d\u00e5 fr\u00e5ga databasen om replikationsavst\u00e5ndet fr\u00e5n prim\u00e4r. Och om det n\u00e5r en gr\u00e4ns, b\u00f6r nya f\u00f6rfr\u00e5gningar till databasen blockeras, informera klienten om att de m\u00e5ste \u00e5terinitiera anslutningarna och eventuellt v\u00e4lja en annan host f\u00f6r att utf\u00f6ra f\u00f6rfr\u00e5gningarna. Detta kommer att m\u00f6jligg\u00f6ra f\u00f6r databasen att snabbare \u00e5terh\u00e4mta replikationsf\u00f6rdr\u00f6jningen och \u00e5terkomma f\u00f6r att svara p\u00e5 f\u00f6rfr\u00e5gningar. <\/p>\n<p><\/p>\n<p>Tidsramen f\u00f6r genomf\u00f6rande \u00e4r sv\u00e5r att ange eftersom det \u00e4r \u00f6ppen k\u00e4llkod. Men jag hoppas att det inte tar 2,5 \u00e5r som f\u00f6r kollegorna p\u00e5 PgBouncer. Vi skulle vilja se denna funktion i Odyssey. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey 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\">I gemenskapen har m\u00e4nniskor fr\u00e5gat om st\u00f6d f\u00f6rprepared statement<\/a><\/noindex>Nu kan du skapa en prepared statement p\u00e5 tv\u00e5 s\u00e4tt. F\u00f6r det f\u00f6rsta kan du utf\u00f6ra SQL-kommandot, n\u00e4mligen \"prepared\". F\u00f6r att f\u00f6rst\u00e5 detta SQL-kommando m\u00e5ste vi l\u00e4ra oss att f\u00f6rst\u00e5 SQL p\u00e5 Bouncer-sidan. Det skulle vara \u00f6verdrivet, eftersom vi beh\u00f6ver en fullst\u00e4ndig parser. Vi kan inte parsa varje SQL-kommando. <\/p>\n<p><\/p>\n<p>Men det finns prepared statement p\u00e5 meddelandeprotokollets niv\u00e5 i proto3. Och det \u00e4r d\u00e4r informationen om att en prepared statement skapas kommer i strukturerad form. Vi skulle kunna st\u00f6dja f\u00f6rst\u00e5elsen av att en klient har beg\u00e4rt att skapa prepared statements p\u00e5 en viss serveranslutning. Och \u00e4ven om transaktionen har st\u00e4ngts, beh\u00f6ver vi fortfarande st\u00f6dja kopplingen mellan server och klient. <\/p>\n<p><\/p>\n<p>Men h\u00e4r uppst\u00e5r en diskrepans i dialogen, eftersom n\u00e5gon talar om att f\u00f6rst\u00e5 vilken specifik prepared statement klienten har skapat och att separera serveranslutningen mellan alla klienter som har skapat den serveranslutningen, det vill s\u00e4ga som har skapat en s\u00e5dan prepared statement. <\/p>\n<p><\/p>\n<p>Andres Freund sa att om en klient kommer som redan har skapat en s\u00e5dan prepared statement i en annan serveranslutning, b\u00f6r du skapa den f\u00f6r honom. Men det verkar lite fel att utf\u00f6ra databaskommandon ist\u00e4llet f\u00f6r klienten, men ur ett utvecklarperspektiv, som skriver protokoll f\u00f6r databaskommunikation, skulle det vara praktiskt om han bara fick en n\u00e4tverksanslutning d\u00e4r det finns en s\u00e5n preparerad fr\u00e5ga. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/cd56b3ad015195d86a64e52be365b16a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Och \u00e4n en funktion som vi beh\u00f6ver implementera. Vi har nu \u00f6vervakning som \u00e4r kompatibel med PgBouncer. Vi kan \u00e5terge den genomsnittliga k\u00f6rningstiden f\u00f6r en fr\u00e5ga. Men den genomsnittliga tiden \u00e4r som den genomsnittliga temperaturen p\u00e5 sjukhuset: n\u00e5gra \u00e4r kalla, n\u00e5gra \u00e4r varma \u2013 i genomsnitt \u00e4r alla friska. Det \u00e4r en l\u00f6gn. <\/p>\n<p><\/p>\n<p>Vi beh\u00f6ver implementera st\u00f6d f\u00f6r percentiler som skulle visa att det finns l\u00e5ngsamma fr\u00e5gor som f\u00f6rbrukar resurser, och g\u00f6ra \u00f6vervakningen mer acceptabel. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6f285f3eb0d79e7f25d42f0e792b85b1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det viktigaste \u00e4r att vi vill ha version 1.0 (version 1.1 har redan sl\u00e4ppts). Faktum \u00e4r att Odyssey just nu \u00e4r i version 1.0rc, det vill s\u00e4ga release candidate. Och alla de problem jag n\u00e4mnde har \u00e5tg\u00e4rdats i just den versionen, f\u00f6rutom minnesl\u00e4ckorna. <\/p>\n<p><\/p>\n<p>Vad betyder version 1.0 f\u00f6r oss? Vi lanserar Odyssey p\u00e5 v\u00e5ra databaser. Den fungerar redan nu p\u00e5 v\u00e5ra databaser, men n\u00e4r den n\u00e5r punkten av 1 000 000 f\u00f6rfr\u00e5gningar per sekund kan vi s\u00e4ga att detta \u00e4r en releaseversion och det \u00e4r en version vi kan kalla 1.0. <\/p>\n<p><\/p>\n<p>I communityt har flera personer bett om att version 1.0 ska inkludera paus och SCRAM. Men det skulle inneb\u00e4ra att vi beh\u00f6ver lansera n\u00e4sta version i produktion, eftersom varken SCRAM eller paus \u00e4nnu har blivit integrerade. Men f\u00f6rmodligen kommer denna fr\u00e5ga att l\u00f6sas ganska snabbt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: what else we want from the connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2f50de9f51f653a7396965239bd545e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jag v\u00e4ntar p\u00e5 era pull requests. Jag skulle ocks\u00e5 g\u00e4rna vilja h\u00f6ra vilka problem ni har med Bouncer. L\u00e5t oss diskutera dem. Kanske kan vi implementera n\u00e5gra funktioner som ni beh\u00f6ver. <\/p>\n<p><\/p>\n<p>Min del \u00e4r nu avslutad, jag skulle g\u00e4rna vilja h\u00f6ra er. Tack!<\/p>\n<p><\/p>\n<p>Fr\u00e5gor<\/p>\n<p><\/p>\n<p><em>Om jag s\u00e4tter min application_name, kommer det att skickas korrekt, inklusive i transaction pooling i Odyssey?<\/em><\/p>\n<p><\/p>\n<p>I Odyssey eller i Bouncer?<\/p>\n<p><\/p>\n<p><em>I Odyssey. I Bouncer skickas det.<\/em> <\/p>\n<p><\/p>\n<p>Vi kommer att g\u00f6ra en set. <\/p>\n<p><\/p>\n<p><em>Och om min verkliga anslutning hoppar mellan andra anslutningar, kommer den d\u00e5 att \u00f6verf\u00f6ras?<\/em><\/p>\n<p><\/p>\n<p>Vi kommer att g\u00f6ra en set av alla parametrar som anges i listan. Jag kan inte s\u00e4ga om application_name finns med i den listan. Det verkar som att jag s\u00e5g den d\u00e4r. Vi kommer att st\u00e4lla in alla samma parametrar. Med en f\u00f6rfr\u00e5gan g\u00f6r setet allt som har st\u00e4llts in av klienten vid start. <\/p>\n<p><\/p>\n<p><em>Tack, Andrey, f\u00f6r presentationen! Bra presentation! Jag \u00e4r glad att Odyssey utvecklas snabbare och snabbare f\u00f6r varje minut. Jag \u00f6nskar att vi ska kunna forts\u00e4tta s\u00e5 h\u00e4r. Vi har redan kontaktat er med en f\u00f6rfr\u00e5gan om att ha multi data-source-anslutning, s\u00e5 att Odyssey kan ansluta till olika databaser samtidigt, det vill s\u00e4ga master-slave, och sedan automatiskt efter failover ansluta till den nya master.<\/em> <\/p>\n<p><\/p>\n<p>Ja, jag tror att jag minns den diskussionen. Just nu finns det flera lagringsl\u00f6sningar. Men det finns ingen v\u00e4xling mellan dem. Vi m\u00e5ste p\u00e5 v\u00e5r sida fr\u00e5ga servern om den fortfarande \u00e4r aktiv och f\u00f6rst\u00e5 att en failover har intr\u00e4ffat, vem som kommer att \u00e5kalla pg_recovery. Jag har ett standardiserat s\u00e4tt att f\u00f6rst\u00e5 att vi inte har kommit till master. Och vi m\u00e5ste f\u00f6rst\u00e5 detta p\u00e5 n\u00e5got s\u00e4tt genom felmeddelanden eller hur? Det vill s\u00e4ga, id\u00e9n \u00e4r intressant och den diskuteras. Skriv fler kommentarer. Om ni har arbetskraft som kan C, d\u00e5 \u00e4r det verkligen fantastiskt. <\/p>\n<p><\/p>\n<p>Fr\u00e5gan om skalning av repliker intresserar oss ocks\u00e5, eftersom vi vill g\u00f6ra adoption av replikerade kluster s\u00e5 enkelt som m\u00f6jligt f\u00f6r applikationsutvecklare. Men h\u00e4r skulle jag vilja ha fler kommentarer, det vill s\u00e4ga hur man exakt g\u00f6r det bra. <\/p>\n<p><\/p>\n<p><em>Fr\u00e5gan handlar ocks\u00e5 om repliker. Det verkar som att ni har en master och flera repliker. Och det \u00e4r klart att man ofta g\u00e5r till master ist\u00e4llet f\u00f6r repliker n\u00e4r det g\u00e4ller anslutningar, eftersom det kan finnas skillnader. Ni n\u00e4mnde att skillnaderna i data kan vara s\u00e5dana att det inte skulle tillfredsst\u00e4lla ert f\u00f6retag och att ni inte skulle g\u00e5 dit f\u00f6rr\u00e4n den har replikats helt. Om ni inte har g\u00e5tt dit p\u00e5 l\u00e4nge och sedan b\u00f6rjar, s\u00e5 kommer de data ni beh\u00f6ver kanske inte vara omedelbart tillg\u00e4ngliga. Det vill s\u00e4ga, om vi hela tiden g\u00e5r till master s\u00e5 \u00e4r cachen d\u00e4r uppv\u00e4rmd, medan cachen i repliken ligger lite efter.<\/em> <\/p>\n<p><\/p>\n<p>Ja, det st\u00e4mmer. I pcache kommer det inte finnas block av data som ni vill ha, i real cache kommer det inte finnas information om tabellerna som ni vill ha, i planerna kommer det inte finnas parserade fr\u00e5gor, \u00f6verhuvudtaget ingenting. <\/p>\n<p><\/p>\n<p><em>Och n\u00e4r ni har ett kluster och l\u00e4gger till en ny replik, s\u00e5 medan den startar, \u00e4r den inte i bra skick, det vill s\u00e4ga den bygger upp sin cache.<\/em> <\/p>\n<p><\/p>\n<p>Jag f\u00f6rstod id\u00e9n. Den r\u00e4tta metoden skulle vara att f\u00f6rst k\u00f6ra en liten procentandel av f\u00f6rfr\u00e5gningarna p\u00e5 repliken, vilket skulle v\u00e4rma upp cachen. Grovt sagt har vi en f\u00f6ruts\u00e4ttning att vi inte f\u00e5r vara mer \u00e4n 10 sekunder efter master. Och detta villkor ska inte aktiveras p\u00e5 en g\u00e5ng, utan mjukt f\u00f6r vissa kunder. <\/p>\n<p><\/p>\n<p><em>Ja, \u00f6ka vikten.<\/em><\/p>\n<p><\/p>\n<p>Det \u00e4r en bra id\u00e9. Men f\u00f6rst beh\u00f6ver vi implementera denna avst\u00e4ngning. F\u00f6rst m\u00e5ste vi st\u00e4nga av, och sedan t\u00e4nker vi p\u00e5 hur vi ska sl\u00e5 p\u00e5 det. Det \u00e4r en utm\u00e4rkt funktion f\u00f6r att mjukt sl\u00e5 p\u00e5.<\/p>\n<p><\/p>\n<p><em>I nginx finns det ett s\u00e5dant alternativ <code>slowly start<\/code> f\u00f6r serverklustret. Och den gradvis \u00f6kar belastningen.<\/em> <\/p>\n<p><\/p>\n<p>Ja, utm\u00e4rkt id\u00e9, vi ska prova n\u00e4r vi n\u00e5r dit.<\/p>\n<p>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/odyssey-roadmap-chto-eshhyo-my-hotim-ot-pulera-soedinenij-andrej-borodin-2019\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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: vad mer vill vi ha fr\u00e5n f\u00f6rbindelsepoolern. Andrey Borodin (2019) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/sv\/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":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/96515","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=96515"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/96515\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/96516"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=96515"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=96515"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=96515"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}