{"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\/cs\/blog\/administrirovanie\/odyssey-roadmap-chto-eshhyo-my-hotim-ot-pulera-soedinenij-andrej-borodin-2019","title":{"rendered":"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6c445191705a4c96939cd094bc457a53.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ve zpr\u00e1v\u011b Andrey Borodin uk\u00e1\u017ee, jak vzali v \u00favahu zku\u0161enosti s m\u011b\u0159\u00edtkem PgBouncer p\u0159i n\u00e1vrhu connection pooler. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex\/odyssey\">Odyssea<\/a><\/noindex>, jak byl nasazen do produk\u010dn\u00edho prost\u0159ed\u00ed. D\u00e1le prodiskutujeme, jak\u00e9 funkce by connection pooler m\u011bl m\u00edt v nov\u00fdch verz\u00edch: pro n\u00e1s je d\u016fle\u017eit\u00e9 nejen uspokojit na\u0161e pot\u0159eby, ale tak\u00e9 rozv\u00edjet komunitu u\u017eivatel\u016f. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex\/odyssey\">Odyssea<\/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=\"P\u0159ehr\u00e1t 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: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/dd2ea50b72e3d9c4e795aecbf9afdd25.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ahoj v\u0161ichni! Jmenuji se Andrej. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0a2f1880005bec1f61b72fb23b555adc.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>V Yandexu se v\u011bnuji v\u00fdvoji open source datab\u00e1z\u00ed. A dnes m\u00e1me t\u00e9ma o connection pooler. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c18e7c937423d2514faa12e820e78e70.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pokud v\u00edte, jak nazvat connection pooler \u010desky, dejte mi v\u011bd\u011bt. Velmi r\u00e1d bych na\u0161el dobr\u00fd technick\u00fd term\u00edn, kter\u00fd se ust\u00e1l\u00ed v technick\u00e9 literatu\u0159e. <\/p>\n<p><\/p>\n<p>T\u00e9ma je pom\u011brn\u011b slo\u017eit\u00e9, proto\u017ee v mnoha datab\u00e1z\u00edch je connection pooler vestav\u011bn\u00fd a nen\u00ed v\u016fbec t\u0159eba o n\u011bm v\u011bd\u011bt. Ur\u010dit\u00e1 nastaven\u00ed samoz\u0159ejm\u011b existuj\u00ed, ale v Postgresu to tak nefunguje. Paraleln\u011b (na HighLoad++ 2019) b\u011b\u017e\u00ed prezentace Nikolaje Samokhvalova o nastaven\u00ed dotaz\u016f v Postgresu. A j\u00e1 ch\u00e1pu, \u017ee sem p\u0159i\u0161li lid\u00e9, kte\u0159\u00ed u\u017e dotazy nastavili ide\u00e1ln\u011b, a to jsou lid\u00e9, kte\u0159\u00ed \u010del\u00ed vz\u00e1cn\u011bj\u0161\u00edm syst\u00e9mov\u00fdm probl\u00e9m\u016fm, kter\u00e9 se t\u00fdkaj\u00ed s\u00edt\u011b a vyu\u017e\u00edv\u00e1n\u00ed zdroj\u016f. A m\u00edsty to mohlo b\u00fdt docela slo\u017eit\u00e9 v tom smyslu, \u017ee probl\u00e9my nejsou z\u0159ejm\u00e9.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/89c660dd530575e2938e6bf312b83e95.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>V Yandexu m\u00e1me Postgres. V Yandex. Cloudu \u017eije mnoho slu\u017eeb Yandexu. A m\u00e1me n\u011bkolik petabajt\u016f dat, kter\u00e9 generuj\u00ed ne m\u00e9n\u011b ne\u017e milion dotaz\u016f za sekundu v Postgresu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/288bfa37b9dcd60acd22ba48f0ef8a39.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A poskytujeme dostate\u010dn\u011b typick\u00fd klastr v\u0161em slu\u017eb\u00e1m \u2013 to je hlavn\u00ed primary uzel, b\u011b\u017en\u00e9 dv\u011b repliky (synchronn\u00ed a asynchronn\u00ed), z\u00e1lohov\u00e1n\u00ed, \u0161k\u00e1lov\u00e1n\u00ed \u010dten\u00ed na replik\u00e1ch. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c249ca55bb387e25a5560324024cc523.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ka\u017ed\u00fd uzel klastru je Postgres, na kter\u00e9m vedle Postgres a syst\u00e9m\u016f monitorov\u00e1n\u00ed je je\u0161t\u011b nainstalov\u00e1n connection pooler. Connection pooler se pou\u017e\u00edv\u00e1 pro fencing a pro sv\u00e9 hlavn\u00ed ur\u010den\u00ed. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0e29be55cc048007db21c80bbb08a9d4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jak\u00e9 je hlavn\u00ed ur\u010den\u00ed connection pooler? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e2fbbd440c2781573cb35deeef358f20.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>V Postgresu je p\u0159ijat procesn\u00ed model pro pr\u00e1ci s datab\u00e1z\u00ed. To znamen\u00e1, \u017ee jedno spojen\u00ed \u2013 to je jeden proces, jeden backend Postgres. A v tomto backendu je spousta r\u016fzn\u00fdch cache, kter\u00e9 je pom\u011brn\u011b n\u00e1kladn\u00e9 m\u00edt r\u016fzn\u00e9 pro r\u016fzn\u00e1 spojen\u00ed. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/587498063b1af8fac4a845961c654bc2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Krom\u011b toho, v k\u00f3du Postgres existuje pole, kter\u00e9 se naz\u00fdv\u00e1 procArray. Obsahuje z\u00e1kladn\u00ed informace o s\u00ed\u0165ov\u00fdch p\u0159ipojen\u00edch. A t\u00e9m\u011b\u0159 v\u0161echny algoritmy zpracov\u00e1n\u00ed procArray maj\u00ed line\u00e1rn\u00ed slo\u017eitost, proch\u00e1zej\u00ed cel\u00fdm polem s\u00ed\u0165ov\u00fdch p\u0159ipojen\u00ed. Je to docela rychl\u00fd cyklus, ale s vysok\u00fdm po\u010dtem p\u0159\u00edchoz\u00edch s\u00ed\u0165ov\u00fdch p\u0159ipojen\u00ed se to v\u0161e st\u00e1v\u00e1 o n\u011bco dra\u017e\u0161\u00ed. A kdy\u017e se to stane o n\u011bco dra\u017e\u0161\u00ed, nakonec m\u016f\u017eete zaplatit velmi vysokou cenu za velk\u00e9 mno\u017estv\u00ed s\u00ed\u0165ov\u00fdch p\u0159ipojen\u00ed. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/b534a38d0bfae7a65fc4258155a50280.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Existuj\u00ed 3 mo\u017en\u00e9 p\u0159\u00edstupy:<\/p>\n<p><\/p>\n<ul>\n<li>Na stran\u011b aplikace. <\/li>\n<li>Na stran\u011b datab\u00e1ze. <\/li>\n<li>A mezi nimi, tj. r\u016fzn\u00e9 kombinace. <\/li>\n<\/ul>\n<p><\/p>\n<p>Bohu\u017eel, integrovan\u00fd pooler je nyn\u00ed ve v\u00fdvoji. P\u0159\u00e1tel\u00e9 z spole\u010dnosti PostgreSQL Professional se t\u00edm v\u011bt\u0161inou zab\u00fdvaj\u00ed. Kdy se objev\u00ed, je t\u011b\u017ek\u00e9 p\u0159edpov\u011bd\u011bt. A vlastn\u011b m\u00e1me na v\u00fdb\u011br dv\u011b \u0159e\u0161en\u00ed. Je to pool na stran\u011b aplikace a proxy pool. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/702527a09e9fc86dd39b7fd69dcf1fc9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pool na stran\u011b aplikace je nejjednodu\u0161\u0161\u00ed zp\u016fsob. A t\u00e9m\u011b\u0159 v\u0161echny clientsk\u00e9 ovlada\u010de v\u00e1m poskytuj\u00ed zp\u016fsob, jak prezentovat miliony va\u0161ich p\u0159ipojen\u00ed v k\u00f3du jako n\u011bkolik des\u00edtek p\u0159ipojen\u00ed k datab\u00e1zi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7b66b9e20d22f472ca5ac39f6b9e0ba4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vznik\u00e1 probl\u00e9m, kdy\u017e chcete \u0161k\u00e1lovat backend, chcete ho nasadit na mnoho virtu\u00e1ln\u00edch stroj\u016f. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f216fd7a8c01c2b07891e2242c48b06a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pak si tak\u00e9 uv\u011bdom\u00edte, \u017ee m\u00e1te n\u011bkolik z\u00f3n dostupnosti, n\u011bkolik datacenter. A p\u0159\u00edstup s poolov\u00e1n\u00edm na stran\u011b klienta vede k velk\u00fdm \u010d\u00edsl\u016fm. Velk\u00e1 \u010d\u00edsla jsou okolo 10 000 p\u0159ipojen\u00ed. To je maximum, kter\u00e9 m\u016f\u017ee fungovat norm\u00e1ln\u011b. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e5bc5f284fd8ff568bbe16c3895b7ac6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pokud mluv\u00edme o proxy poolerech, existuj\u00ed dva poolery, kter\u00e9 um\u00ed spoustu v\u011bc\u00ed. Nejsou to jen poolery. Jsou to poolery + skv\u011bl\u00e1 funk\u010dnost. To jsou <noindex><a rel=\"nofollow\" href=\"https:\/\/www.pgpool.net\/\">Pgpool<\/a><\/noindex> a <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/crunchy-proxy\">Crunchy-Proxy<\/a><\/noindex>. <\/p>\n<p><\/p>\n<p>Ale bohu\u017eel, tato dal\u0161\u00ed funk\u010dnost nen\u00ed pro v\u0161echny pot\u0159eba. A vede to k tomu, \u017ee poolery podporuj\u00ed pouze session pooling, tj. jeden p\u0159\u00edchoz\u00ed klient, jeden odchoz\u00ed klient do datab\u00e1ze. <\/p>\n<p><\/p>\n<p>Pro na\u0161e \u00fakoly to nen\u00ed p\u0159\u00edli\u0161 vhodn\u00e9, proto pou\u017e\u00edv\u00e1me PgBouncer, kter\u00fd implementuje transaction pooling, tj. serverov\u00e1 spojen\u00ed se mapuj\u00ed na klientsk\u00e1 spojen\u00ed pouze na dobu transakce. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e5fedbe14656d2ac2cde8d1878a950e2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A p\u0159i na\u0161\u00ed z\u00e1t\u011b\u017ei \u2013 to je pravda. <strong>Ale existuje n\u011bkolik probl\u00e9m\u016f.<\/strong>.<img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/61fd36cadcd9948d624dafa711777307.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Probl\u00e9my za\u010d\u00ednaj\u00ed, kdy\u017e chcete diagnostikovat relaci, proto\u017ee v\u0161echna p\u0159\u00edchoz\u00ed p\u0159ipojen\u00ed jsou lok\u00e1ln\u00ed. V\u0161echna p\u0159i\u0161la z loopback a jaksi je obt\u00ed\u017en\u00e9 sledovat relaci. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/36108c4956c410a1b1f286a88bc393d6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Samoz\u0159ejm\u011b, m\u016f\u017eete pou\u017e\u00edt application_name_add_host. Je to zp\u016fsob na stran\u011b Bouncer, jak p\u0159idat IP adresu do application_name. Av\u0161ak application_name je nastavena dodate\u010dn\u00fdm p\u0159ipojen\u00edm. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/b4cec483aa776f48db7ad3966c3b78e4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Na tomto grafu, kde \u017elut\u00e1 \u010d\u00e1ra p\u0159edstavuje skute\u010dn\u00e9 po\u017eadavky, a modr\u00e1 \u2013 po\u017eadavky, kter\u00e9 p\u0159ich\u00e1zej\u00ed do datab\u00e1ze. A tato rozd\u00edlnost \u2013 to je p\u0159esn\u011b nastaven\u00ed application_name, kter\u00e9 je pot\u0159eba pouze pro sledov\u00e1n\u00ed, ale rozhodn\u011b nen\u00ed bez n\u00e1klad\u016f. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c02ea73a6f1a2a4cd6af6c621f321ab4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Krom\u011b toho nen\u00ed mo\u017en\u00e9 v Bounceru omezit jeden pool, tj. po\u010det p\u0159ipojen\u00ed k datab\u00e1zi pro ur\u010dit\u00e9ho u\u017eivatele, k ur\u010dit\u00e9 datab\u00e1zi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3431a463e04106066e2799aead66f571.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>K \u010demu to vede? M\u00e1te p\u0159et\u00ed\u017eenou slu\u017ebu napsanou v C++ a n\u011bkde bl\u00edzko mal\u00fd servis na nodu, kter\u00fd na datab\u00e1zi ned\u011bl\u00e1 nic \u0161patn\u00e9ho, ale jeho ovlada\u010d se zbl\u00e1zn\u00ed. Otev\u00edr\u00e1 20 000 p\u0159ipojen\u00ed, a v\u0161echno ostatn\u00ed po\u010dk\u00e1. I v\u00e1\u0161 k\u00f3d je v po\u0159\u00e1dku. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/d7fa321714dc017b017945dffcf79bc6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Samoz\u0159ejm\u011b jsme napsali mal\u00fd patch pro Bouncer, kter\u00fd p\u0159idal toto nastaven\u00ed, tj. omezen\u00ed klient\u016f na pool. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/d58884fc5ac0f90ff8442f126972157a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Bylo by mo\u017en\u00e9 to ud\u011blat na stran\u011b Postgres, tj. omezit role v datab\u00e1zi po\u010dtem p\u0159ipojen\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8d6ff70db72964ed4eae5eaa47309931.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ale pak ztr\u00e1c\u00edte mo\u017enost pochopit, pro\u010d nem\u00e1te p\u0159ipojen\u00ed k serveru. PgBouncer nezprost\u0159edkov\u00e1v\u00e1 chybu p\u0159ipojen\u00ed, st\u00e1le vrac\u00ed stejnou informaci. A vy nem\u016f\u017eete zjistit: mo\u017en\u00e1 jste zm\u011bnili heslo, mo\u017en\u00e1 jednodu\u0161e datab\u00e1ze spadla, mo\u017en\u00e1 je n\u011bco \u0161patn\u011b. Ale \u017e\u00e1dn\u00e1 diagnostika nen\u00ed k dispozici. Pokud nelze nav\u00e1zat sezen\u00ed, nezjist\u00edte, pro\u010d to nelze ud\u011blat. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/cb3048344a94f2953bf403485d28e69f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>V ur\u010dit\u00e9m okam\u017eiku se d\u00edv\u00e1te na grafy aplikace a vid\u00edte, \u017ee aplikace nefunguje.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e67c6680bb9a7f41242af9f9e4920916.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>D\u00edv\u00e1te se na top a vid\u00edte, \u017ee Bouncer je jednovl\u00e1knov\u00fd. To je zlomov\u00fd moment v \u017eivot\u011b slu\u017eby. Ch\u00e1pete, \u017ee jste se p\u0159ipravovali na \u0161k\u00e1lov\u00e1n\u00ed datab\u00e1ze za rok a p\u016fl, ale pot\u0159ebujete \u0161k\u00e1lovat pooler. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4c140c4ba6db19cb9939c1148638fb73.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dosp\u011bli jsme k z\u00e1v\u011bru, \u017ee pot\u0159ebujeme v\u00edce PgBouncer\u016f. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej 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>Trochu jsme patchovali Bouncer. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/97755489a25ebfe38efd56ff897bd8fa.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A ud\u011blali tak, \u017ee m\u016f\u017ee b\u00fdt spu\u0161t\u011bno n\u011bkolik Bouncer\u016f s op\u011btovn\u00fdm vyu\u017eit\u00edm TCP portu. A ji\u017e opera\u010dn\u00ed syst\u00e9m automaticky rozd\u011bluje p\u0159\u00edchoz\u00ed TCP p\u0159ipojen\u00ed mezi nimi round-robin.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/ac30d3f067de2a8cd66ad2325c3a3b58.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Je to transparentn\u00ed pro klienty, tj. v\u0161echno vypad\u00e1 tak, jako byste m\u011bli jednoho Bouncera, ale m\u00e1te fragmentaci idle p\u0159ipojen\u00ed mezi spu\u0161t\u011bn\u00fdmi Bouncery. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/53825f075db00b026c12013a610be456.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A v ur\u010dit\u00e9m okam\u017eiku m\u016f\u017eete zjistit, \u017ee t\u011bchto 3 Bouncer\u016f vyu\u017e\u00edv\u00e1 ka\u017ed\u00e9 sv\u00e9 j\u00e1dro na 100 %. Pot\u0159ebujete jich pom\u011brn\u011b hodn\u011b. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/66c17883a043e157cd7ceab2c2a4e326.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Proto\u017ee m\u00e1te TLS. M\u00e1te \u0161ifrovan\u00e9 p\u0159ipojen\u00ed. A pokud benchmarkujete Postgres s TLS a bez TLS, zjist\u00edte, \u017ee po\u010det nav\u00e1zan\u00fdch p\u0159ipojen\u00ed kles\u00e1 t\u00e9m\u011b\u0159 o dv\u011b \u0159\u00e1dy s aktivac\u00ed \u0161ifrov\u00e1n\u00ed, proto\u017ee TLS handshake spot\u0159ebov\u00e1v\u00e1 prost\u0159edky procesoru. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6101121ebe136af16e5eb1a484c65d66.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A na vrcholu m\u016f\u017eete vid\u011bt pom\u011brn\u011b hodn\u011b kryptografick\u00fdch funkc\u00ed, kter\u00e9 se vykon\u00e1vaj\u00ed p\u0159i vln\u011b p\u0159\u00edchoz\u00edch p\u0159ipojen\u00ed. Vzhledem k tomu, \u017ee n\u00e1\u0161 primary m\u016f\u017ee p\u0159ep\u00ednat mezi dostupnostn\u00edmi z\u00f3nami, je vlna p\u0159\u00edchoz\u00edch p\u0159ipojen\u00ed pom\u011brn\u011b typick\u00e1 situace. To znamen\u00e1, \u017ee z n\u011bjak\u00e9ho d\u016fvodu star\u00fd primary nebyl dostupn\u00fd, a cel\u00e1 z\u00e1t\u011b\u017e byla zasl\u00e1na do jin\u00e9ho datacentra. V\u0161ichni najednou p\u0159ijdou pozdravit s TLS. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c238ac2f511568590dc275e01c192c00.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A velk\u00e9 mno\u017estv\u00ed TLS handshake se m\u016f\u017ee u\u017e nem\u00edt pot\u0159ebu pozdravit s Bouncerem, ale m\u016f\u017ee mu p\u0159itom \u0161krtit hrdlo. Kv\u016fli timeoutu se vlna p\u0159\u00edchoz\u00edch p\u0159ipojen\u00ed m\u016f\u017ee st\u00e1t nekon\u010d\u00edc\u00ed. Pokud m\u00e1te retry do datab\u00e1ze bez exponenci\u00e1ln\u00edho backoffu, nebudou p\u0159ich\u00e1zet znovu a znovu v koherentn\u00ed vln\u011b. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f42d0b210174d4d172254603ae6b834a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Toto je p\u0159\u00edklad 16 PgBouncer\u016f, kter\u00e9 zat\u011b\u017euj\u00ed 16 jader na 100 %.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8d048d3774c09e5b6a3fb3c7bff62084.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dosp\u011bli jsme k kask\u00e1dov\u00e9mu PgBounceru. To je nejlep\u0161\u00ed konfigurace, kterou lze dos\u00e1hnout na na\u0161\u00ed z\u00e1t\u011b\u017ei s Bouncerem. Vn\u011bj\u0161\u00ed Bouncers slou\u017e\u00ed pro TCP handshake, zat\u00edmco vnit\u0159n\u00ed Bouncers slou\u017e\u00ed pro skute\u010dn\u00e9 pooling, aby se p\u0159\u00edli\u0161 net\u0159\u00ed\u0161tily vn\u011bj\u0161\u00ed p\u0159ipojen\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3a4ee4ea46d5fe8479a5a7222ee134da.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>V takov\u00e9 konfiguraci je mo\u017en\u00fd plynul\u00fd restart. M\u016f\u017eete restartovat v\u0161echny tyto 18 Bouncer\u016f jedno po druh\u00e9m. Ale udr\u017eov\u00e1n\u00ed takov\u00e9 konfigurace je pom\u011brn\u011b slo\u017eit\u00e9. Syst\u00e9mov\u00ed administr\u00e1to\u0159i, DevOps a lid\u00e9, kte\u0159\u00ed skute\u010dn\u011b nesou zodpov\u011bdnost za tento server, nebudou z takov\u00e9 sch\u00e9matu p\u0159\u00edli\u0161 nad\u0161eni. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5291fe67dbe02036f3ff8e98bdd84d1b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mohlo by se zd\u00e1t, \u017ee m\u016f\u017eeme v\u0161echny na\u0161e \u00fapravy propagovat do open source, ale Bouncer se p\u0159\u00edli\u0161 dob\u0159e nepodporuje. Nap\u0159\u00edklad mo\u017enost spustit n\u011bkolik PgBouncer\u016f na jednom portu byla zakotvena p\u0159ed m\u011bs\u00edcem. A pull request s touto funkc\u00ed byl p\u0159ed n\u011bkolika lety. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej 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>Nebo dal\u0161\u00ed p\u0159\u00edklad. V Postgres m\u016f\u017eete zru\u0161it prov\u00e1d\u011bn\u00fd dotaz zasl\u00e1n\u00edm tajn\u00e9ho kl\u00ed\u010de p\u0159es jin\u00e9 spojen\u00ed bez dal\u0161\u00ed autentizace. N\u011bkte\u0159\u00ed klienti v\u0161ak pos\u00edlaj\u00ed pouze TCP-reset, tedy p\u0159eru\u0161\u00ed s\u00ed\u0165ov\u00e9 spojen\u00ed. Co v tomto p\u0159\u00edpad\u011b ud\u011bl\u00e1 Bouncer? Nic. Bouncer bude pokra\u010dovat v prov\u00e1d\u011bn\u00ed dotazu. Pokud m\u00e1te obrovsk\u00e9 mno\u017estv\u00ed spojen\u00ed, kter\u00e1 mal\u00fdmi dotazy zat\u00ed\u017eila datab\u00e1zi, jednodu\u0161e p\u0159eru\u0161en\u00ed spojen\u00ed s Bouncerem nebude sta\u010dit, je pot\u0159eba tak\u00e9 ukon\u010dit ty dotazy, kter\u00e9 b\u011b\u017e\u00ed v datab\u00e1zi. <\/p>\n<p><\/p>\n<p>Bylo to opraveno a tento probl\u00e9m zat\u00edm nebyl slou\u010den do upstreamu Bouncera. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a9695b6d9e640a5543dc73429eb0050b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A tak jsme dosp\u011bli k tomu, \u017ee pot\u0159ebujeme sv\u016fj vlastn\u00ed connection pooler, kter\u00fd se bude vyv\u00edjet, patchovat, v n\u011bm\u017e budeme moci okam\u017eit\u011b opravovat probl\u00e9my a kter\u00fd mus\u00ed b\u00fdt samoz\u0159ejm\u011b v\u00edcerozm\u011brn\u00fd. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e755cd9b06a004f0eced1dc12fd3a6fb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>V\u00edcevl\u00e1knovost jsme si stanovili jako hlavn\u00ed \u00fakol. Mus\u00edme dob\u0159e zvl\u00e1dat n\u00e1por p\u0159\u00edchoz\u00edch TLS spojen\u00ed. <\/p>\n<p><\/p>\n<p>K tomu jsme museli vyvinout samostatnou knihovnu nazvanou Machinarium, kter\u00e1 slou\u017e\u00ed k popisu strojov\u00fdch stav\u016f s\u00ed\u0165ov\u00e9ho spojen\u00ed jako sekven\u010dn\u00edho k\u00f3du. Pokud se pod\u00edv\u00e1te do zdrojov\u00e9ho k\u00f3du libpq, uvid\u00edte pom\u011brn\u011b slo\u017eit\u00e9 vol\u00e1n\u00ed, kter\u00e1 v\u00e1m mohou vr\u00e1tit v\u00fdsledek a \u0159\u00edct: \u201eZavolej m\u011b za chv\u00edli. Te\u010f m\u00e1m IO, ale a\u017e IO prob\u011bhne, bude m\u00edt CPU zat\u00ed\u017een\u00ed.\u201c A to je v\u00edcestup\u0148ov\u00e9 sch\u00e9ma. S\u00ed\u0165ov\u00e1 interakce se obvykle popisuje jako stroj stav\u016f. Mnoha pravidly typu \u201ePokud jsem d\u0159\u00edve obdr\u017eel hlavi\u010dku paketu velikosti N, pak nyn\u00ed \u010dek\u00e1m N bajt\u016f\u201c nebo \u201ePokud jsem pos\u00edlal paket SYNC, pak nyn\u00ed \u010dek\u00e1m paket s metadaty v\u00fdsledku\u201c. Vznik\u00e1 docela slo\u017eit\u00fd, nekonven\u010dn\u00ed k\u00f3d, jakoby byl labyrint p\u0159eveden do jednoduch\u00e9ho v\u00fd\u010dtu. U\u010dinili jsme to tak, \u017ee m\u00edsto stroje stav\u016f program\u00e1tor popisuje hlavn\u00ed cestu interakce jako b\u011b\u017en\u00fd imperativn\u00ed k\u00f3d. Jen v tomto imperativn\u00edm k\u00f3du je pot\u0159eba vlo\u017eit m\u00edsta, kde je t\u0159eba p\u0159eru\u0161it sekvenci vykon\u00e1v\u00e1n\u00ed a \u010dekat na data ze s\u00edt\u011b, p\u0159ed\u00e1n\u00edm kontextu prov\u00e1d\u011bn\u00ed jin\u00e9 korun\u011b (zelen\u00e9mu vl\u00e1kna). Tento p\u0159\u00edstup je podobn\u00fd tomu, \u017ee nejv\u00edce o\u010dek\u00e1vanou cestu v labyrintu zap\u00ed\u0161eme za sebou a pak k n\u00ed p\u0159id\u00e1v\u00e1me odbo\u010dky. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a6bfb4b11961c7db3a7c7184674e3bc2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nakonec m\u00e1me jedno vl\u00e1kno, kter\u00e9 prov\u00e1d\u00ed TCP accept a round-robinem p\u0159ed\u00e1v\u00e1 mnoha worker\u016fm TPC spojen\u00ed. <\/p>\n<p><\/p>\n<p>Ka\u017ed\u00e9 klientsk\u00e9 p\u0159ipojen\u00ed v\u017edy pracuje na jednom procesoru. To umo\u017e\u0148uje, aby bylo cache-friendly. <\/p>\n<p><\/p>\n<p>Krom\u011b toho jsme m\u00edrn\u011b upravili shroma\u017e\u010fov\u00e1n\u00ed mal\u00fdch paket\u016f do jednoho velk\u00e9ho paketu, abychom uvolnili syst\u00e9mov\u00fd TCP stack.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7d740c23baecdd2f993c83cd54a0a8e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>D\u00e1le jsme vylep\u0161ili transak\u010dn\u00ed pooling tak, \u017ee Odyssey p\u0159i nastaven\u00e9 konfiguraci m\u016f\u017ee odeslat CANCEL a ROLLBACK v p\u0159\u00edpad\u011b poru\u0161en\u00ed s\u00ed\u0165ov\u00e9ho p\u0159ipojen\u00ed, t. j. pokud na \u017e\u00e1dost nikdo ne\u010dek\u00e1, Odyssey \u0159ekne datab\u00e1zi, aby se nesna\u017eila prov\u00e9st tuto \u017e\u00e1dost, kter\u00e1 by mohla spot\u0159ebovat cenn\u00e9 zdroje.<\/p>\n<p><\/p>\n<p>Pokud je to mo\u017en\u00e9, uchov\u00e1v\u00e1me p\u0159ipojen\u00ed ke stejn\u00e9mu klientovi. To umo\u017e\u0148uje, abychom nep\u0159estavovali application_name_add_host. Pokud to je mo\u017en\u00e9, nem\u00e1me dal\u0161\u00ed p\u0159einstalaci parametr\u016f, kter\u00e9 jsou pot\u0159ebn\u00e9 pro diagnostiku. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/afb2fb7fb16d65c9ea73a8978d1eb83c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pracujeme v z\u00e1jmu Yandex.Cloud. A pokud pou\u017e\u00edv\u00e1te managed PostgreSQL a m\u00e1te nastaven\u00fd connection pooler, m\u016f\u017eete vytvo\u0159it logickou replikaci ven, t. j. odej\u00edt od n\u00e1s, pokud budete cht\u00edt, pomoc\u00ed logick\u00e9 replikace. Bouncer ven proud logick\u00e9 replikace neodevzd\u00e1. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c53defc92ebd8f3bec57ce64d97b9f72.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>To je p\u0159\u00edklad nastaven\u00ed logick\u00e9 replikace. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a37d9d1abf288d17fa646b642e8b62ab.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Krom\u011b toho m\u00e1me podporu fyzick\u00e9 replikace ven. V Cloudu je to samoz\u0159ejm\u011b nemo\u017en\u00e9, proto\u017ee by v\u00e1m cluster dal p\u0159\u00edli\u0161 mnoho informac\u00ed o sob\u011b. Ale ve va\u0161ich instalac\u00edch, pokud pot\u0159ebujete fyzickou replikaci p\u0159es connection pooler v Odyssey, je to mo\u017en\u00e9. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/572934ce5b08115e57ab4b55d2153c6d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>V Odyssey je pln\u011b kompatibiln\u00ed monitoring s PgBouncer. M\u00e1me stejnou konzoli, kter\u00e1 vykon\u00e1v\u00e1 t\u00e9m\u011b\u0159 v\u0161echny stejn\u00e9 p\u0159\u00edkazy. Pokud n\u011bco chyb\u00ed, po\u0161lete pull request nebo alespo\u0148 issue na GitHub, budeme dopl\u0148ovat pot\u0159ebn\u00e9 p\u0159\u00edkazy. Z\u00e1kladn\u00ed funk\u010dnost konzole PgBouncer ji\u017e m\u00e1me. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/451dd798fb3523a7a174ebfe00a14bc5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A samoz\u0159ejm\u011b m\u00e1me error forwarding. Vr\u00e1t\u00edme tu chybu, kterou datab\u00e1ze nahl\u00e1sila. Z\u00edsk\u00e1te informace o tom, pro\u010d se v\u00e1m neda\u0159\u00ed p\u0159ipojit k datab\u00e1zi, a ne jen to, \u017ee se v\u00e1m neda\u0159\u00ed. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/14b4cb0efa33a2658dfc528349a5382f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tato funkce se vyp\u00edn\u00e1 v p\u0159\u00edpad\u011b, \u017ee pot\u0159ebujete 100% kompatibilitu s PgBouncer. M\u016f\u017eeme se chovat stejn\u011b jako Bouncer, jen tak pro jistotu. <\/p>\n<p><\/p>\n<p><strong>V\u00fdvoj<\/strong><\/p>\n<p><\/p>\n<p>N\u011bkolik slov o zdrojov\u00e9m k\u00f3du Odyssey. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej 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>Nap\u0159\u00edklad existuj\u00ed p\u0159\u00edkazy \u201ePozastavit \/ Pokra\u010dovat\u201c. Ty se obvykle pou\u017e\u00edvaj\u00ed pro aktualizaci datab\u00e1ze. Pokud pot\u0159ebujete aktualizovat Postgres, m\u016f\u017eete jej pozastavit v connection pooleru, prov\u00e9st pg_upgrade a pot\u00e9 obnovit. Na stran\u011b klienta to bude vypadat tak, jako by se datab\u00e1ze jednodu\u0161e zpomalila. Tuto funk\u010dnost n\u00e1m p\u0159inesli lid\u00e9 z komunity. Zat\u00edm je\u0161t\u011b nen\u00ed slou\u010dena, ale brzy bude. (U\u017e slou\u010dena)<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej 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 u\u017e slou\u010dena<\/p>\n<p><\/p>\n<p>Krom\u011b toho je jednou z nov\u00fdch funkc\u00ed v PgBouncer podpora SCRAM Authentication, kterou n\u00e1m tak\u00e9 p\u0159inesl \u010dlov\u011bk, kter\u00fd nepracuje ve Yandex.Cloud. Ob\u011b funkce jsou slo\u017eit\u00e9 a d\u016fle\u017eit\u00e9. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f39346a543c88d17728233d05c2dff19.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Proto bych cht\u011bl pov\u011bd\u011bt, z \u010deho je Odyssey vyroben, mo\u017en\u00e1 i vy te\u010f chcete trochu ps\u00e1t k\u00f3d. <\/p>\n<p><\/p>\n<p>M\u00e1te z\u00e1kladn\u00ed strukturu Odyssey, kter\u00e1 se op\u00edr\u00e1 o dv\u011b hlavn\u00ed knihovny. Knihovna Kiwi je implementac\u00ed Postgresov\u00e9ho protokolu zpr\u00e1v. Tedy nativn\u00ed proto 3 u Postgres je standardn\u00ed zpr\u00e1va, se kterou si frontend a backend mohou vym\u011b\u0148ovat informace. Tyto zpr\u00e1vy jsou implementov\u00e1ny v knihovn\u011b Kiwi.<\/p>\n<p><\/p>\n<p>Knihovna Machinarium je knihovna pro implementaci vl\u00e1ken. Mal\u00fd fragment tohoto Machinarium je naps\u00e1n v assembleru. Ale nebojte se, je jich jen 15 \u0159\u00e1dk\u016f. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/cd18f250af50eabd53536b2c0d7f12b5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Architektura Odyssey. Existuje hlavn\u00ed stroj, ve kter\u00e9m jsou spu\u0161t\u011bny coroutines. V tomto stroji se implementuje p\u0159ijet\u00ed p\u0159\u00edchoz\u00edch TCP spojen\u00ed a jejich rozd\u011blen\u00ed mezi pracovn\u00edky. <\/p>\n<p><\/p>\n<p>Uvnit\u0159 jednoho pracovn\u00edka m\u016f\u017ee pracovat zpracovatel n\u011bkolika klient\u016f. A tak\u00e9 v hlavn\u00edm vl\u00e1kn\u011b b\u011b\u017e\u00ed konzole a zpracov\u00e1n\u00ed crone \u00faloh pro odstran\u011bn\u00ed spojen\u00ed, kter\u00e1 ji\u017e nejsou pot\u0159eba v poolu.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7072fb20f406f2ee5788542860ccdf50.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pro testov\u00e1n\u00ed Odyssey se pou\u017e\u00edv\u00e1 standardn\u00ed sada test\u016f Postgres. Sta\u010d\u00ed spustit install-check p\u0159es Bouncer a p\u0159es Odyssey, a z\u00edsk\u00e1me nulov\u00fd div. N\u011bkolik test\u016f spojen\u00fdch s form\u00e1tov\u00e1n\u00edm dat neprob\u00edh\u00e1 \u00fapln\u011b stejn\u011b v Bouncer a v Odyssey.<\/p>\n<p><\/p>\n<p>Krom\u011b toho existuje mnoho ovlada\u010d\u016f, kter\u00e9 maj\u00ed vlastn\u00ed testov\u00e1n\u00ed. A jejich testy pou\u017e\u00edv\u00e1me pro testov\u00e1n\u00ed Odyssey.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/fb01cc9a0e9724ddcd3cc3d088afb182.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Krom\u011b toho, kv\u016fli na\u0161\u00ed kask\u00e1dov\u00e9 konfiguraci mus\u00edme testovat r\u016fzn\u00e9 kombinace: Postgres + Odyssey, PgBouncer + Odyssey, Odyssey + Odyssey, abychom byli jisti, \u017ee pokud Odyssey skon\u010dil v n\u011bjak\u00e9 \u010d\u00e1sti v kask\u00e1d\u011b, funguje nad\u00e1le tak, jak o\u010dek\u00e1v\u00e1me. <\/p>\n<p><\/p>\n<p><strong>H\u0159eb\u00edky<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/25855b691180bca083025b9e8b611c09.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pou\u017e\u00edv\u00e1me Odyssey v produkci. A nebylo by f\u00e9r, kdybych \u0159ekl, \u017ee v\u0161echno prost\u011b funguje. Ne, jako ano, ale ne v\u017edy. Nap\u0159\u00edklad v produkci to prost\u011b fungovalo, pak p\u0159i\u0161li na\u0161i kamar\u00e1di z PostgreSQL Professional a \u0159ekli, \u017ee m\u00e1me memory leak. Opravdu to bylo, opravili jsme to. Ale byla to prost\u011b n\u00e1hoda. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e638d88397b32b1ca0b74c9c1b905f81.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pak jsme zjistili, \u017ee v connection pooleru jsou p\u0159\u00edchoz\u00ed TLS spojen\u00ed a odchoz\u00ed TLS spojen\u00ed. A pro ta spojen\u00ed jsou pot\u0159eba klientsk\u00e9 certifik\u00e1ty a serverov\u00e9 certifik\u00e1ty.<\/p>\n<p><\/p>\n<p>Serverov\u00e9 certifik\u00e1ty Bouncer a Odyssey je \u010dtou z pcache, ale klientsk\u00e9 certifik\u00e1ty nen\u00ed nutn\u00e9 \u010d\u00edst z pcache, proto\u017ee n\u00e1\u0161 \u0161k\u00e1lovateln\u00fd Odyssey nakonec nar\u00e1\u017e\u00ed na syst\u00e9mov\u00fd v\u00fdkon p\u0159i \u010detb\u011b tohoto certifik\u00e1tu. Bylo to pro n\u00e1s p\u0159ekvapen\u00ed, proto\u017ee nenastalo hned. Zpo\u010d\u00e1tku se line\u00e1rn\u011b \u0161k\u00e1loval, ale po 20 000 p\u0159\u00edchoz\u00edch soub\u011b\u017en\u00fdch p\u0159ipojen\u00ed se tento probl\u00e9m projevil.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej 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 je mo\u017enost autentizace vestav\u011bn\u00fdmi linuxov\u00fdmi prost\u0159edky. V PgBouncer je to realizov\u00e1no tak, \u017ee existuje samostatn\u00fd thread na \u010dek\u00e1n\u00ed na odpov\u011b\u010f od PAM a je zde hlavn\u00ed thread PgBouncer, kter\u00fd obsluhuje aktu\u00e1ln\u00ed spojen\u00ed a m\u016f\u017ee je po\u017e\u00e1dat, aby n\u011bjakou chv\u00edli pobyly v threadu PAM. <\/p>\n<p><\/p>\n<p>Toto jsme nezrealizovali z jednoho prost\u00e9ho d\u016fvodu. M\u00e1me p\u0159ece hodn\u011b thread\u016f. Pro\u010d bychom to pot\u0159ebovali?<\/p>\n<p><\/p>\n<p>V d\u016fsledku toho mohou vznikat probl\u00e9my, \u017ee pokud m\u00e1te PAM autentizaci a ne PAM autentizaci, pak velk\u00e1 vlna PAM autentizace m\u016f\u017ee v\u00fdznamn\u011b zdr\u017eovat ne PAM autentizaci. To je jedna z t\u011bch v\u011bc\u00ed, kter\u00e9 jsme neopravili. Ale pokud to chcete opravit, m\u016f\u017eete se o to postarat. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c7bd9e9980ff7298b30a59c130f03dbb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dal\u0161\u00ed probl\u00e9m byl ten, \u017ee m\u00e1me jeden thread, kter\u00fd p\u0159ij\u00edm\u00e1 v\u0161echna p\u0159\u00edchoz\u00ed spojen\u00ed. A pot\u00e9 je p\u0159ed\u00e1v\u00e1 do worker poolu, kde prob\u011bhne TLS handshake.<\/p>\n<p><\/p>\n<p>Pokud tedy m\u00e1te koherentn\u00ed vlnu ze 20 000 s\u00ed\u0165ov\u00fdch spojen\u00ed, v\u0161echny budou p\u0159ijaty. A na stran\u011b klienta libpq za\u010dne odpo\u010det \u010dasov\u00fdch limit\u016f. Podle defaultu tam pr\u00fd je 3 sekundy. <\/p>\n<p><\/p>\n<p>Pokud se nemohou v\u0161echny najednou p\u0159ipojit k datab\u00e1zi, pak se nemohou p\u0159ipojit k datab\u00e1zi, proto\u017ee to v\u0161e m\u016f\u017ee b\u00fdt kryto neexponenci\u00e1ln\u00edm opakov\u00e1n\u00edm. <\/p>\n<p><\/p>\n<p>Dosp\u011bli jsme k tomu, \u017ee jsme zde zkop\u00edrovali sch\u00e9ma z PgBouncer, kde m\u00e1me throttling po\u010dtu TCP spojen\u00ed, kter\u00fdm d\u011bl\u00e1me accept. <\/p>\n<p><\/p>\n<p>Pokud vid\u00edme, \u017ee akceptujeme p\u0159ipojen\u00ed, ale nakonec nestihnou prob\u011bhnout handshake, za\u0159azujeme je do fronty, aby nevyu\u017e\u00edvaly prost\u0159edky procesoru. To vede k tomu, \u017ee sou\u010dasn\u00fd handshake nemus\u00ed prob\u00edhat pro v\u0161echna p\u0159ipojen\u00ed, kter\u00e1 p\u0159i\u0161la. Ale alespo\u0148 n\u011bkdo se dostane do datab\u00e1ze, i kdy\u017e je z\u00e1t\u011b\u017e dost vysok\u00e1.<\/p>\n<p><\/p>\n<p><strong>Roadmap<\/strong><\/p>\n<p><\/p>\n<p>Co bychom r\u00e1di vid\u011bli v budoucnu v Odyssey? Co jsme ochotni vyv\u00edjet sami a co o\u010dek\u00e1v\u00e1me od komunity?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4719437d80b33efc3da6572af9a4dedb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>K srpnu 2019.<\/strong><\/p>\n<p><\/p>\n<p>Takto vypadal roadmap Odyssey v srpnu:<\/p>\n<p><\/p>\n<ul>\n<li>Cht\u011bli jsme autentizaci SCRAM a PAM.<\/li>\n<li>Cht\u011bli jsme sm\u011brovat \u010dten\u00e1\u0159sk\u00e9 dotazy na standby. <\/li>\n<li>R\u00e1di bychom online-restart. <\/li>\n<li>A mo\u017enost pozastavit server. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/455c92f92df826257c2c57dc2b034e22.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Polovina t\u00e9to roadmapy byla spln\u011bna, a to dokonce ne n\u00e1mi. A to je dob\u0159e. Tak\u017ee poj\u010fme probrat, co zb\u00fdv\u00e1 a p\u0159idat dal\u0161\u00ed. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej 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\">Pokud jde o sm\u011brov\u00e1n\u00ed read-only dotaz\u016f na 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: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0873cffd4f1ae15d9ffa6d080671051b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>V podstat\u011b od verze 10 v Postgres existuje mo\u017enost p\u0159i p\u0159ipojen\u00ed tak\u00e9 uv\u00e9st session_attrs. M\u016f\u017eete v p\u0159ipojen\u00ed vyjmenovat v\u0161echny datab\u00e1zov\u00e9 hostitele a \u0159\u00edci, pro\u010d jdete do datab\u00e1ze: zapisovat nebo pouze \u010d\u00edst. A ovlada\u010d s\u00e1m vybere prvn\u00edho hostitele v seznamu, kter\u00fd mu vyhovuje a spl\u0148uje po\u017eadavky session_attrs. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0693d1327fe5826502a01c21d05d5b4c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ale probl\u00e9m tohoto p\u0159\u00edstupu je v tom, \u017ee ne\u0159\u00edd\u00ed zpo\u017ed\u011bn\u00ed replikace. M\u016f\u017ee existovat n\u011bjak\u00e1 replikace, kter\u00e1 je zpo\u017ed\u011bna na nep\u0159ijateln\u011b dlouhou dobu pro va\u0161i slu\u017ebu. Abychom umo\u017enili plnohodnotn\u00e9 prov\u00e1d\u011bn\u00ed \u010dten\u00e1\u0159sk\u00fdch dotaz\u016f na replikaci, v podstat\u011b mus\u00edme v Odyssey podpo\u0159it, aby nefungovalo, kdy\u017e \u010d\u00edst nelze. <\/p>\n<p><\/p>\n<p>Odyssey by m\u011bl ob\u010das j\u00edt do datab\u00e1ze a zji\u0161\u0165ovat replikaci od prim\u00e1rn\u00edho serveru. A pokud dos\u00e1hne limitu, nov\u00fdm dotaz\u016fm do datab\u00e1ze by m\u011bl b\u00fdt zabr\u00e1n\u011bno, \u0159\u00edct klientovi, aby znovu inicioval p\u0159ipojen\u00ed a mo\u017en\u00e1 zvolil jin\u00e9ho hostitele pro prov\u00e1d\u011bn\u00ed dotaz\u016f. To umo\u017en\u00ed datab\u00e1zi rychleji obnovit zpo\u017ed\u011bn\u00ed replikace a znovu se vr\u00e1tit k odpov\u011bdi na dotazy. <\/p>\n<p><\/p>\n<p>Term\u00edny realizace je obt\u00ed\u017en\u00e9 nazvat, proto\u017ee je to open source. Ale douf\u00e1m, \u017ee to nebude trvat 2,5 roku jako u koleg\u016f z PgBouncer. Tuto funkci bychom r\u00e1di vid\u011bli v Odyssey. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej 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\">Lid\u00e9 v komunit\u011b se ptali na podporu p\u0159ipraven\u00fdch prohl\u00e1\u0161en\u00ed.<\/a><\/noindex>Nyn\u00ed m\u016f\u017eete vytvo\u0159it p\u0159ipraven\u00fd p\u0159\u00edkaz dv\u011bma zp\u016fsoby. Za prv\u00e9, m\u016f\u017eete prov\u00e9st SQL p\u0159\u00edkaz, konkr\u00e9tn\u011b \u201eprepared\u201c. Abyste pochopili tento SQL p\u0159\u00edkaz, mus\u00edme se nau\u010dit ch\u00e1pat SQL na stran\u011b Bouncer. To by bylo p\u0159ehnan\u00e9, proto\u017ee pot\u0159ebujeme kompletn\u00ed parser. Nem\u016f\u017eeme analyzovat ka\u017ed\u00fd SQL p\u0159\u00edkaz. <\/p>\n<p><\/p>\n<p>Existuje v\u0161ak p\u0159ipraven\u00fd p\u0159\u00edkaz na \u00farovni protokolu zpr\u00e1v na proto3. A to je m\u00edsto, kdy informace o tom, \u017ee se vytv\u00e1\u0159\u00ed p\u0159ipraven\u00fd p\u0159\u00edkaz, p\u0159ich\u00e1z\u00ed ve strukturovan\u00e9m form\u00e1tu. A mohli bychom podpo\u0159it pochopen\u00ed, \u017ee na n\u011bjak\u00e9m serverov\u00e9m spojen\u00ed klient po\u017e\u00e1dal o vytvo\u0159en\u00ed p\u0159ipraven\u00fdch p\u0159\u00edkaz\u016f. A i kdy\u017e byla transakce uzav\u0159ena, pot\u0159ebujeme nad\u00e1le udr\u017eovat koherenci serveru a klienta. <\/p>\n<p><\/p>\n<p>Ale zde se objevuje rozpor v dialogu, proto\u017ee n\u011bkdo \u0159\u00edk\u00e1, \u017ee je t\u0159eba ch\u00e1pat, kter\u00fd konkr\u00e9tn\u00ed p\u0159ipraven\u00fd p\u0159\u00edkaz vytvo\u0159il klient a odd\u011blit serverov\u00e9 spojen\u00ed mezi v\u0161emi klienty, kte\u0159\u00ed toto serverov\u00e9 spojen\u00ed vytvo\u0159ili, tj. kte\u0159\u00ed vytvo\u0159ili takov\u00fd p\u0159ipraven\u00fd p\u0159\u00edkaz. <\/p>\n<p><\/p>\n<p>Andres Freund \u0159ekl, \u017ee pokud k v\u00e1m p\u0159i\u0161el klient, kter\u00fd ji\u017e vytvo\u0159il takov\u00fd p\u0159ipraven\u00fd p\u0159\u00edkaz v jin\u00e9m serverov\u00e9m spojen\u00ed, vytvo\u0159te ho za n\u011bj. Ale zd\u00e1 se, \u017ee je trochu \u0161patn\u00e9 prov\u00e1d\u011bt dotazy v datab\u00e1zi m\u00edsto klienta, ale z pohledu v\u00fdvoj\u00e1\u0159e, kter\u00fd p\u00ed\u0161e protokol pro interakci s datab\u00e1z\u00ed, by bylo pohodln\u00e9, kdyby mu prost\u011b dali s\u00ed\u0165ov\u00e9 spojen\u00ed, ve kter\u00e9m je takov\u00fd p\u0159ipraven\u00fd dotaz. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/cd56b3ad015195d86a64e52be365b16a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A je\u0161t\u011b jedna funkce, kterou mus\u00edme implementovat. Nyn\u00ed m\u00e1me monitorov\u00e1n\u00ed kompatibiln\u00ed s PgBouncer. M\u016f\u017eeme vr\u00e1tit pr\u016fm\u011brnou dobu trv\u00e1n\u00ed dotazu. Ale pr\u016fm\u011brn\u00e1 doba je pr\u016fm\u011brn\u00e1 teplota v nemocnici: n\u011bkdo je studen\u00fd, n\u011bkdo tepl\u00fd \u2013 pr\u016fm\u011brn\u011b jsou v\u0161ichni zdrav\u00ed. To nen\u00ed pravda. <\/p>\n<p><\/p>\n<p>Mus\u00edme implementovat podporu percentil\u016f, kter\u00e9 by nazna\u010dovaly, \u017ee existuj\u00ed pomal\u00e9 dotazy, kter\u00e9 spot\u0159ebov\u00e1vaj\u00ed zdroje, a ud\u011blaly by monitorov\u00e1n\u00ed p\u0159ijateln\u011bj\u0161\u00edm. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6f285f3eb0d79e7f25d42f0e792b85b1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nejd\u016fle\u017eit\u011bj\u0161\u00ed je, \u017ee chci verzi 1.0 (u\u017e byla vyd\u00e1na verze 1.1). Faktem je, \u017ee nyn\u00ed je Odyssey ve verzi 1.0rc, tj. release candidate. A v\u0161echna \u00faskal\u00ed, kter\u00e1 jsem vyjmenoval, byla opravena pr\u00e1v\u011b s touto verz\u00ed, krom\u011b \u00faniku pam\u011bti. <\/p>\n<p><\/p>\n<p>Co pro n\u00e1s bude znamenat verze 1.0? Spou\u0161t\u00edme Odyssey na na\u0161ich serverech. Ji\u017e te\u010f funguje na na\u0161ich z\u00e1kladech, ale kdy\u017e dos\u00e1hne bodu 1 000 000 dotaz\u016f za sekundu, m\u016f\u017eeme \u0159\u00edct, \u017ee to je kone\u010dn\u00e1 verze a tuto verzi m\u016f\u017eeme nazvat 1.0. <\/p>\n<p><\/p>\n<p>V komunit\u011b n\u011bkolik lid\u00ed po\u017e\u00e1dalo, aby ve verzi 1.0 byla tak\u00e9 pauza a SCRAM. To by v\u0161ak znamenalo, \u017ee budeme muset uv\u00e9st do produkce ji\u017e dal\u0161\u00ed verzi, proto\u017ee ani SCRAM, ani pauza zat\u00edm nebyly za\u010dlen\u011bny. Ale pravd\u011bpodobn\u011b tento probl\u00e9m bude vy\u0159e\u0161en dost rychle. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: co je\u0161t\u011b chceme od connection pooler. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2f50de9f51f653a7396965239bd545e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u010cek\u00e1m na va\u0161e pull requesty. A tak\u00e9 bych r\u00e1d sly\u0161el, jak\u00e9 m\u00e1te probl\u00e9my s Bouncerem. Poj\u010fme je prodiskutovat. Mo\u017en\u00e1 budeme moci implementovat n\u011bjak\u00e9 funkce, kter\u00e9 pot\u0159ebujete. <\/p>\n<p><\/p>\n<p>Na tomto skon\u010dila m\u00e1 \u010d\u00e1st, r\u00e1d bych v\u00e1s sly\u0161el. D\u011bkuji!<\/p>\n<p><\/p>\n<p>Ot\u00e1zky<\/p>\n<p><\/p>\n<p><em>Pokud nastav\u00edm sv\u016fj application_name, bude spr\u00e1vn\u011b p\u0159en\u00e1\u0161en, v\u010detn\u011b transaction pooling v Odyssey?<\/em><\/p>\n<p><\/p>\n<p>V Odyssey nebo v Bounceru?<\/p>\n<p><\/p>\n<p><em>V Odyssey. V Bounceru se p\u0159en\u00e1\u0161\u00ed.<\/em> <\/p>\n<p><\/p>\n<p>Sestavu vytvo\u0159\u00edme. <\/p>\n<p><\/p>\n<p><em>A pokud se moje skute\u010dn\u00e9 p\u0159ipojen\u00ed bude sk\u00e1kat mezi jin\u00fdmi p\u0159ipojen\u00edmi, bude p\u0159en\u00e1\u0161eno?<\/em><\/p>\n<p><\/p>\n<p>Vytvo\u0159\u00edme sadu v\u0161ech parametr\u016f, kter\u00e9 jsou uvedeny v seznamu. Nemohu \u0159\u00edct, zda je application_name v tomto seznamu. Mysl\u00edm, \u017ee jsem ho tam vid\u011bl. Nastav\u00edme v\u0161echny stejn\u00e9 parametry. Jedn\u00edm dotazem tam set ud\u011bl\u00e1 v\u0161e, co bylo nastaveno klientem p\u0159i spu\u0161t\u011bn\u00ed. <\/p>\n<p><\/p>\n<p><em>D\u011bkuji, Andreji, za prezentaci! Dobr\u00e1 prezentace! Jsem r\u00e1d, \u017ee Odyssey se ka\u017edou minutou vyv\u00edj\u00ed rychleji a rychleji. P\u0159eji, abyste pokra\u010dovali. Ji\u017e jsme v\u00e1s kontaktovali s \u017e\u00e1dost\u00ed o multi data-source p\u0159ipojen\u00ed, aby se Odyssey mohl p\u0159ipojit sou\u010dasn\u011b k r\u016fzn\u00fdm datab\u00e1z\u00edm, t. j. master slave, a pot\u00e9 se automaticky po failoveru p\u0159ipojit k nov\u00e9mu masteru.<\/em> <\/p>\n<p><\/p>\n<p>Ano, zd\u00e1 se, \u017ee si pamatuji tuto diskusi. Nyn\u00ed je n\u011bkolik \u00falo\u017ei\u0161\u0165. Ale p\u0159ep\u00edn\u00e1n\u00ed mezi nimi nen\u00ed. Mus\u00edme na sv\u00e9 stran\u011b dotazovat server, zda je je\u0161t\u011b \u017eiv\u00fd a pochopit, \u017ee do\u0161lo k failoveru, kdo zavol\u00e1 pg_recovery. M\u00e1m standardn\u00ed zp\u016fsob, jak pochopit, \u017ee jsme p\u0159i\u0161li na ne master. A jak to m\u00e1me pochopit z chyb, nebo jak? T. j. my\u0161lenka je zaj\u00edmav\u00e1, diskutuje se o n\u00ed. Pi\u0161te v\u00edce koment\u00e1\u0159\u016f. Pokud m\u00e1te pracovn\u00ed ruce, kter\u00e9 znaj\u00ed C, je to v\u016fbec skv\u011bl\u00e9. <\/p>\n<p><\/p>\n<p>Ot\u00e1zka m\u011b\u0159\u00edtka replik n\u00e1s tak\u00e9 zaj\u00edm\u00e1, proto\u017ee chceme, aby p\u0159ijet\u00ed replikovan\u00fdch cluster\u016f bylo pro v\u00fdvoj\u00e1\u0159e aplikac\u00ed co nejjednodu\u0161\u0161\u00ed. Ale cht\u011bli bychom v\u00edce koment\u00e1\u0159\u016f, tj. jak p\u0159esn\u011b to ud\u011blat, jak to ud\u011blat dob\u0159e. <\/p>\n<p><\/p>\n<p><em>Ot\u00e1zka tak\u00e9 ohledn\u011b replik. M\u011bli byste m\u00edt master a n\u011bkolik replik. A je jasn\u00e9, \u017ee do replik se p\u0159ipojuj\u00ed m\u00e9n\u011b \u010dasto ne\u017e k masteru, proto\u017ee se mohou li\u0161it. \u0158\u00edkali jste, \u017ee rozd\u00edl v datech m\u016f\u017ee b\u00fdt takov\u00fd, \u017ee nebude vyhovovat va\u0161emu podnik\u00e1n\u00ed a nebudete tam p\u0159istupovat, dokud se znovu neproreplikuj\u00ed. P\u0159i\u010dem\u017e, pokud jste k nim dlouho nep\u0159istupovali a pak za\u010dali, tak ta data, kter\u00e1 pot\u0159ebujete, nebudou dostupn\u00e1 hned. To znamen\u00e1, \u017ee pokud neust\u00e1le pou\u017e\u00edv\u00e1me master, tak tam je cache vyh\u0159\u00e1t\u00e1, zat\u00edmco v replikaci je cache trochu pozadu.<\/em> <\/p>\n<p><\/p>\n<p>Ano, je to pravda. V pcache nebudou bloky dat, kter\u00e9 chcete, v real cache nebude informace o tabulk\u00e1ch, kter\u00e9 chcete, v pl\u00e1nech nebudou rozparsovan\u00e9 dotazy, v\u016fbec nic tam nebude. <\/p>\n<p><\/p>\n<p><em>A kdy\u017e m\u00e1te n\u011bjak\u00fd cluster a p\u0159id\u00e1te do n\u011bj novou replikaci, tak dokud se nespust\u00ed, bude to v n\u00ed \u0161patn\u00e9, tj. buduje si svou cache.<\/em> <\/p>\n<p><\/p>\n<p>Pochopil jsem my\u0161lenku. Spr\u00e1vn\u00fdm p\u0159\u00edstupem by bylo spustit mal\u00fd procento dotaz\u016f prvn\u011b na replikaci, kter\u00e9 by vyh\u0159\u00e1ly cache. \u0158ekn\u011bme, \u017ee m\u00e1me podm\u00ednku, \u017ee bychom se m\u011bli opozdit maxim\u00e1ln\u011b o 10 sekund za masterem. A tuto podm\u00ednku aktivovat ne jednou, ale plynule pro n\u011bkter\u00e9 klienty. <\/p>\n<p><\/p>\n<p><em>Ano, zvy\u0161ovat v\u00e1hu.<\/em><\/p>\n<p><\/p>\n<p>To je dobr\u00fd n\u00e1pad. Ale nejprve je pot\u0159eba implementovat to vypnut\u00ed. Nejprve se mus\u00edme odpojit a pak p\u0159em\u00fd\u0161let, jak se p\u0159ipojit. Je to skv\u011bl\u00e1 funkce pro plynul\u00e9 p\u0159ipojen\u00ed.<\/p>\n<p><\/p>\n<p><em>V nginx je takov\u00e1 mo\u017enost <code>pomalu za\u010d\u00edt<\/code> v clusteru pro server. A postupn\u011b zvy\u0161uje z\u00e1t\u011b\u017e.<\/em> <\/p>\n<p><\/p>\n<p>Ano, skv\u011bl\u00fd n\u00e1pad, vyzkou\u0161\u00edme to, a\u017e se k tomu dostaneme.<\/p>\n<p>Zdroj: <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.3 - 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\/cs\/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.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\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\/cs\/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: co dal\u0161\u00edho chceme od pooleru p\u0159ipojen\u00ed. Andrey Borodin (2019) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/cs\/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":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/96515","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=96515"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/96515\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/96516"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=96515"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=96515"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=96515"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}