{"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\/sk\/blog\/administrirovanie\/odyssey-roadmap-chto-eshhyo-my-hotim-ot-pulera-soedinenij-andrej-borodin-2019","title":{"rendered":"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6c445191705a4c96939cd094bc457a53.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>V spr\u00e1ve Andrej Borodin objasn\u00ed, ako zoh\u013eadnili sk\u00fasenosti so \u0161k\u00e1lovan\u00edm PgBouncer pri navrhovan\u00ed connection poolera <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex\/odyssey\">Odyssea<\/a><\/noindex>, ako ho nasadili do produkcie. Okrem toho prediskutujeme funkcie, ktor\u00e9 by sme chceli vidie\u0165 v nov\u00fdch verzi\u00e1ch: pre n\u00e1s je d\u00f4le\u017eit\u00e9 nielen uspokojova\u0165 na\u0161e potreby, ale aj rozv\u00edja\u0165 komunitu pou\u017e\u00edvate\u013eov <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=\"Prehrajte 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: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/dd2ea50b72e3d9c4e795aecbf9afdd25.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ahojte! Vol\u00e1m sa Andrej. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0a2f1880005bec1f61b72fb23b555adc.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>V Yandexe sa zaober\u00e1m v\u00fdvojom open source datab\u00e1z. A dnes m\u00e1me t\u00e9mu o connection pooler. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c18e7c937423d2514faa12e820e78e70.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ak viete, ako sa povie connection pooler po slovensky, dajte mi vedie\u0165. Ve\u013emi chcem n\u00e1js\u0165 dobr\u00fd technick\u00fd term\u00edn, ktor\u00fd by sa mal etablova\u0165 v technickej literat\u00fare. <\/p>\n<p><\/p>\n<p>T\u00e9ma je pomerne zlo\u017eit\u00e1, preto\u017ee v mnoh\u00fdch datab\u00e1zach je connection pooler zabudovan\u00fd a ani o \u0148om netreba vedie\u0165. Samozrejme, nejak\u00e9 nastavenia s\u00fa v\u0161ade, ale v Postgres to tak nefunguje. A s\u00fabe\u017ene (na HighLoad++ 2019) m\u00e1 predn\u00e1\u0161ku Nikolaj Samohvalov o optimaliz\u00e1cii dotazov v Postgres. A ch\u00e1pem, \u017ee sem pri\u0161li \u013eudia, ktor\u00ed u\u017e dotazy nastavili ide\u00e1lne, a to s\u00fa \u013eudia, ktor\u00ed \u010delili zriedkav\u00fdm syst\u00e9mov\u00fdm probl\u00e9mom spojen\u00fdm so sie\u0165ou a vyu\u017e\u00edvan\u00edm zdrojov. A miestami to mohlo by\u0165 dos\u0165 zlo\u017eit\u00e9 v tom zmysle, \u017ee probl\u00e9my s\u00fa nejasn\u00e9.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/89c660dd530575e2938e6bf312b83e95.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>V Yandexe m\u00e1me Postgres. V Yandex.Cloud \u017eije mno\u017estvo slu\u017eieb Yandexu. A m\u00e1me nieko\u013eko petabajtov d\u00e1t, ktor\u00e9 generuj\u00fa nie menej ako mili\u00f3n dotazov za sekundu v Postgres. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. 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 dos\u0165 typick\u00fd klaster v\u0161etk\u00fdm slu\u017eb\u00e1m \u2013 to je hlavn\u00fd prim\u00e1rny uzol, be\u017en\u00e9 dve repliky (synchronn\u00e1 a asynchronn\u00e1), z\u00e1lohovanie, \u0161k\u00e1lovanie \u010d\u00edtac\u00edch dotazov na replike. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. 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 uzol klastru je Postgres, na ktorom okrem Postgres a syst\u00e9mov monitorovania je e\u0161te nain\u0161talovan\u00fd connection pooler. Connection pooler sa pou\u017e\u00edva na fencing a pre jeho z\u00e1kladn\u00fa funkciu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0e29be55cc048007db21c80bbb08a9d4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u010co je z\u00e1kladn\u00e1 funkcia connection poolera? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e2fbbd440c2781573cb35deeef358f20.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>V Postgres je prijat\u00fd procesn\u00fd model pri pr\u00e1ci s datab\u00e1zou. To znamen\u00e1, \u017ee jedno pripojenie \u2013 to je jeden proces, jeden backend Postgres. A v tomto backende je ve\u013emi ve\u013ea r\u00f4znych cache, ktor\u00e9 s\u00fa dos\u0165 n\u00e1kladn\u00e9, aby sa robili r\u00f4zne pre r\u00f4zne pripojenia. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/587498063b1af8fac4a845961c654bc2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Okrem toho obsahuje k\u00f3d Postgres pole nazvan\u00e9 procArray. Obsahuje z\u00e1kladn\u00e9 \u00fadaje o sie\u0165ov\u00fdch pripojeniach. A takmer v\u0161etky algoritmy spracovania procArray maj\u00fa line\u00e1rnu zlo\u017eitost, prech\u00e1dzaj\u00fa cel\u00fdm po\u013eom sie\u0165ov\u00fdch pripojen\u00ed. To je celkom r\u00fdchly cyklus, ale s ve\u013ek\u00fdm po\u010dtom prich\u00e1dzaj\u00facich sie\u0165ov\u00fdch pripojen\u00ed sa to v\u0161etko st\u00e1va trochu drah\u0161ie. A ke\u010f v\u0161etko trochu zdra\u017eie, nakoniec m\u00f4\u017eete zaplati\u0165 ve\u013emi vysok\u00fa cenu za ve\u013ek\u00e9 mno\u017estvo sie\u0165ov\u00fdch pripojen\u00ed. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/b534a38d0bfae7a65fc4258155a50280.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Existuj\u00fa 3 mo\u017en\u00e9 pr\u00edstupy:<\/p>\n<p><\/p>\n<ul>\n<li>Na strane aplik\u00e1cie. <\/li>\n<li>Na strane datab\u00e1zy. <\/li>\n<li>A medzi nimi, t. j. r\u00f4zne kombin\u00e1cie. <\/li>\n<\/ul>\n<p><\/p>\n<p>Bohu\u017eia\u013e, vstavan\u00fd pooler sa moment\u00e1lne nach\u00e1dza vo f\u00e1ze v\u00fdvoja. Priatelia v spolo\u010dnosti PostgreSQL Professional sa t\u00fdmto v\u00e4\u010d\u0161inou zaoberaj\u00fa. Ke\u010f sa objav\u00ed, \u0165a\u017eko predv\u00edda\u0165. A skuto\u010dne m\u00e1me na v\u00fdber dve rie\u0161enia. Je to application-side pool a proxy pool. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej 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 je najjednoduch\u0161\u00ed sp\u00f4sob. A takmer v\u0161etky klientsk\u00e9 ovl\u00e1da\u010de v\u00e1m poskytuj\u00fa sp\u00f4sob, ako predstavi\u0165 mili\u00f3ny va\u0161ich pripojen\u00ed v k\u00f3de ako nieko\u013eko desiatok pripojen\u00ed v datab\u00e1ze. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. 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, \u017ee v ur\u010ditom momente chcete \u0161k\u00e1lova\u0165 backend, chcete ho nasadi\u0165 na mno\u017estvo virtu\u00e1lnych strojov. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f216fd7a8c01c2b07891e2242c48b06a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00e1sledne si e\u0161te uvedom\u00edte, \u017ee m\u00e1te nieko\u013eko dostupn\u00fdch z\u00f3n, nieko\u013eko d\u00e1tov\u00fdch centier. A pr\u00edstup s client side pooling vedie k vysok\u00fdm \u010d\u00edslam. Vysok\u00e9 \u2013 to znamen\u00e1 okolo 10 000 pripojen\u00ed. To je kraj, ktor\u00fd m\u00f4\u017ee norm\u00e1lne fungova\u0165. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e5bc5f284fd8ff568bbe16c3895b7ac6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pokia\u013e ide o proxy poolers, existuj\u00fa dva poolers, ktor\u00e9 zvl\u00e1daj\u00fa ve\u013ea vec\u00ed. Nie s\u00fa to len poolers. S\u00fa to poolers + \u010fal\u0161ia skvel\u00e1 funkcionalita. To s\u00fa <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>Bohu\u017eia\u013e, t\u00e1to dodato\u010dn\u00e1 funkcionalita nie je pre v\u0161etk\u00fdch potrebn\u00e1. A vedie to k tomu, \u017ee poolers podporuj\u00fa iba session pooling, t. j. jeden prich\u00e1dzaj\u00faci klient, jeden odch\u00e1dzaj\u00faci klient do datab\u00e1zy. <\/p>\n<p><\/p>\n<p>Pre na\u0161e \u00falohy to nie je ve\u013emi vhodn\u00e9, preto pou\u017e\u00edvame PgBouncer, ktor\u00fd implementuje transaction pooling, t. j. serverov\u00e9 pripojenia s\u00fa priraden\u00e9 klientsk\u00fdm pripojeniam iba na \u010das transakcie. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e5fedbe14656d2ac2cde8d1878a950e2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A pri na\u0161ej z\u00e1\u0165a\u017ei \u2013 to je pravda. <strong>Ale existuje nieko\u013eko probl\u00e9mov.<\/strong>.<img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. 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\u00fa, ke\u010f chcete diagnostikova\u0165 rel\u00e1ciu, preto\u017ee v\u0161etky prich\u00e1dzaj\u00face pripojenia s\u00fa lok\u00e1lne. V\u0161etky pri\u0161li z loopback a nejak\u00fdm sp\u00f4sobom trasovanie rel\u00e1cie sa st\u00e1va \u0165a\u017ek\u00fdm. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/36108c4956c410a1b1f286a88bc393d6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Samozrejme, m\u00f4\u017eete pou\u017ei\u0165 application_name_add_host. Je to sp\u00f4sob, ako na strane Bouncer prida\u0165 IP adresu do application_name. Ale application_name sa nastavuje pomocou \u010fal\u0161ieho pripojenia. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. 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 grafe, kde \u017elt\u00e1 \u010diara predstavuje skuto\u010dn\u00e9 po\u017eiadavky a modr\u00e1 reprezentuje po\u017eiadavky, ktor\u00e9 prich\u00e1dzaj\u00fa do datab\u00e1zy. A tento rozdiel je pr\u00e1ve nastavenie application_name, ktor\u00e9 je potrebn\u00e9 iba na sledovanie, ale nie je \u00faplne bezplatn\u00e9. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c02ea73a6f1a2a4cd6af6c621f321ab4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Okrem toho v Bouncer nie je mo\u017en\u00e9 obmedzi\u0165 jeden pool, t. j. po\u010det pripojen\u00ed k datab\u00e1ze pre ur\u010dit\u00e9ho pou\u017e\u00edvate\u013ea, na ur\u010dit\u00fa datab\u00e1zu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3431a463e04106066e2799aead66f571.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>K \u010domu to vedie? M\u00e1te pre\u0165a\u017een\u00fa slu\u017ebu nap\u00edsan\u00fa v C++ a niekde bl\u00edzko je mal\u00e1 slu\u017eba na n\u00f3d, ktor\u00e1 nerob\u00ed ni\u010d hrozn\u00e9ho s datab\u00e1zou, ale jej ovl\u00e1da\u010d sa zbl\u00e1zni. Otv\u00e1ra 20 000 pripojen\u00ed a v\u0161etko ostatn\u00e9 po\u010dk\u00e1. V\u00e1\u0161 k\u00f3d m\u00f4\u017ee by\u0165 norm\u00e1lny. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/d7fa321714dc017b017945dffcf79bc6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Samozrejme, nap\u00edsali sme mal\u00fa opravu pre Bouncer, ktor\u00e1 pridala toto nastavenie, t. j. obmedzenie klientov na pool. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/d58884fc5ac0f90ff8442f126972157a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mohlo by sa to spravi\u0165 na strane Postgres, t. j. obmedzi\u0165 role v datab\u00e1ze po\u010dtom pripojen\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8d6ff70db72964ed4eae5eaa47309931.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ale potom str\u00e1cate mo\u017enos\u0165 pochopi\u0165, pre\u010do nem\u00e1te pripojenia k serveru. PgBouncer nepreposiela chybu pripojenia, v\u017edy vr\u00e1ti t\u00fa ist\u00fa inform\u00e1ciu. A nem\u00f4\u017eete pochopi\u0165: mo\u017eno sa zmenilo va\u0161e heslo, mo\u017eno jednoducho datab\u00e1za spadla, mo\u017eno je nie\u010do inak. Ale \u017eiadna diagnostika nie je. Ak sa rel\u00e1cia ned\u00e1 vytvori\u0165, nezist\u00edte, pre\u010do to nie je mo\u017en\u00e9. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. 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\u010ditom momente sa pozer\u00e1te na grafy aplik\u00e1cie a vid\u00edte, \u017ee aplik\u00e1cia nefunguje.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e67c6680bb9a7f41242af9f9e4920916.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pozer\u00e1te sa do top a vid\u00edte, \u017ee Bouncer je jednovl\u00e1knov\u00fd. Toto je rozhoduj\u00faci moment v \u017eivote slu\u017eby. Uvedomujete si, \u017ee ste sa pripravovali na \u0161k\u00e1lovanie datab\u00e1zy o rok a pol, a potrebujete \u0161k\u00e1lova\u0165 pooler. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4c140c4ba6db19cb9939c1148638fb73.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dospeli sme k tomu, \u017ee potrebujeme viac PgBouncer\u2019ov. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. 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 sme opravili Bouncer. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/97755489a25ebfe38efd56ff897bd8fa.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A urobili sme to tak, \u017ee m\u00f4\u017ee by\u0165 spusten\u00fdch nieko\u013eko Bouncerov s op\u00e4tovn\u00fdm vyu\u017eit\u00edm TCP-portu. A opera\u010dn\u00fd syst\u00e9m automaticky prerovn\u00e1va prich\u00e1dzaj\u00face TCP-pripojenia medzi nimi pomocou round-robin.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. 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\u00e9 pre klientov, t. j. v\u0161etko vyzer\u00e1 tak, akoby ste mali jeden Bouncer, ale m\u00e1te fragment\u00e1ciu idle-pripojen\u00ed medzi spusten\u00fdmi Bouncermi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. 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\u010ditom momente si m\u00f4\u017eete v\u0161imn\u00fa\u0165, \u017ee t\u00fdchto 3 Bouncerov vyu\u017e\u00edva ka\u017ed\u00e9 svoje jadro na 100 %. Potrebujete dos\u0165 ve\u013ea Bouncerov. Pre\u010do? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/66c17883a043e157cd7ceab2c2a4e326.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Preto\u017ee m\u00e1te TLS. M\u00e1te \u0161ifrovan\u00e9 pripojenie. A ak benchmarkujete Postgres s TLS a bez TLS, zist\u00edte, \u017ee po\u010det nadviazan\u00fdch pripojen\u00ed sa pri zapnut\u00ed \u0161ifrovania zn\u00ed\u017ei takmer o dva poriadky, preto\u017ee TLS handshake spotrebov\u00e1va zdroje centr\u00e1lneho procesora. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. 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 vrchu m\u00f4\u017eete vidie\u0165 mno\u017estvo kryptografick\u00fdch funkci\u00ed, ktor\u00e9 sa vykon\u00e1vaj\u00fa pri vlne prich\u00e1dzaj\u00facich pripojen\u00ed. Ke\u010f\u017ee n\u00e1\u0161 primary m\u00f4\u017ee prech\u00e1dza\u0165 medzi z\u00f3nami dostupnosti, vlna prich\u00e1dzaj\u00facich pripojen\u00ed je celkom typick\u00e1 situ\u00e1cia. T. j. z nejak\u00e9ho d\u00f4vodu star\u00fd primary nebol dostupn\u00fd, v\u0161etka z\u00e1\u0165a\u017e bola presunut\u00e1 do in\u00e9ho d\u00e1tov\u00e9ho centra. V\u0161etky prich\u00e1dzaj\u00fa z\u00e1rove\u0148, aby sa pozdravili s TLS. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c238ac2f511568590dc275e01c192c00.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A ve\u013ek\u00e9 mno\u017estvo TLS handshake sa u\u017e nemus\u00ed pozdravi\u0165 s Bouncerom, ale m\u00f4\u017ee mu stiahnu\u0165 krk. Z d\u00f4vodu timeoutu sa vlna prich\u00e1dzaj\u00facich pripojen\u00ed m\u00f4\u017ee sta\u0165 nekon\u010diacou. Ak m\u00e1te retry do datab\u00e1zy bez exponential backoff, prich\u00e1dzaj\u00fa st\u00e1le znova a znova ako koherentn\u00e1 vlna. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f42d0b210174d4d172254603ae6b834a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tu je pr\u00edklad 16 PgBouncerov, ktor\u00e9 za\u0165a\u017euj\u00fa 16 jadier na 100 %.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8d048d3774c09e5b6a3fb3c7bff62084.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dostali sme sa k kask\u00e1dov\u00e9mu PgBounceru. Toto je najlep\u0161ia konfigur\u00e1cia, ktor\u00fa m\u00f4\u017eeme dosiahnu\u0165 na na\u0161ej z\u00e1\u0165a\u017ei s Bouncerom. Extern\u00e9 Bounceri sl\u00fa\u017eia na TCP handshake, zatia\u013e \u010do intern\u00e9 Bounceri sl\u00fa\u017eia na re\u00e1lne poolovanie, aby sa vonkaj\u0161ie pripojenia pr\u00edli\u0161 nezfragmentovali.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3a4ee4ea46d5fe8479a5a7222ee134da.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>V takejto konfigur\u00e1cii je mo\u017en\u00e9 hladk\u00e9 re\u0161tartovanie. M\u00f4\u017eete re\u0161tartova\u0165 v\u0161etk\u00fdch 18 Bouncerov po jednom. Ale udr\u017eiava\u0165 tak\u00fato konfigur\u00e1ciu je dos\u0165 \u0165a\u017ek\u00e9. Syst\u00e9mov\u00ed administr\u00e1tori, DevOps a \u013eudia, ktor\u00ed s\u00fa skuto\u010dne zodpovedn\u00ed za tento server, nebud\u00fa ve\u013emi nad\u0161en\u00ed z tak\u00e9ho sch\u00e9my. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5291fe67dbe02036f3ff8e98bdd84d1b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zdalo by sa, \u017ee v\u0161etky na\u0161e vylep\u0161enia m\u00f4\u017eeme propagova\u0165 ako open source, ale Bouncer sa pr\u00edli\u0161 dobre nepodporuje. Napr\u00edklad funkcia spustenia viacer\u00fdch PgBouncerov na jednom porte bola pridan\u00e1 pred mesiacom. A pull request s touto funkciou bol pred nieko\u013ek\u00fdmi rokmi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. 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>Alebo \u010fal\u0161\u00ed pr\u00edklad. V Postgres m\u00f4\u017eete zru\u0161i\u0165 vykon\u00e1vaj\u00faci sa dotaz t\u00fdm, \u017ee po\u0161lete pr\u00edkaz cez in\u00e9 spojenie bez zbyto\u010dnej autentifik\u00e1cie. Niektor\u00ed klienti v\u0161ak jednoducho posielaj\u00fa TCP-reset, t.j. preru\u0161uj\u00fa sie\u0165ov\u00e9 spojenie. \u010co urob\u00ed Bouncer? Ni\u010d. Pokra\u010duje v vykon\u00e1van\u00ed dotazu. Ak ste dostali obrovsk\u00e9 mno\u017estvo spojen\u00ed, ktor\u00e9 men\u0161\u00edmi dotazmi za\u0165a\u017eili datab\u00e1zu, jednoducho odtrhn\u00fa\u0165 spojenie od Bouncer nebude sta\u010di\u0165, potrebujete tie\u017e ukon\u010di\u0165 tie dotazy, ktor\u00e9 be\u017eia v datab\u00e1ze. <\/p>\n<p><\/p>\n<p>Toto bolo opraven\u00e9 a tento probl\u00e9m e\u0161te nebol zl\u00fa\u010den\u00fd do upstream Bouncer-a. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. 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 sme sa dostali k tomu, \u017ee potrebujeme svoj vlastn\u00fd connection pooler, ktor\u00fd sa bude rozv\u00edja\u0165, opravova\u0165, v ktorom bude mo\u017en\u00e9 r\u00fdchlo vyrie\u0161i\u0165 probl\u00e9my a ktor\u00fd, samozrejme, mus\u00ed by\u0165 v\u00edcerozmenn\u00fd. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e755cd9b06a004f0eced1dc12fd3a6fb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>V\u00edcerozmennos\u0165 sme si stanovili ako hlavn\u00fd cie\u013e. Mus\u00edme dobre zvl\u00e1da\u0165 n\u00e1por prich\u00e1dzaj\u00facich TLS-spojen\u00ed. <\/p>\n<p><\/p>\n<p>Na to sme museli vypracova\u0165 samostatn\u00fa kni\u017enicu, ktor\u00e1 sa naz\u00fdva Machinarium a je ur\u010den\u00e1 na opisovanie stavov strojov sie\u0165ov\u00e9ho pripojenia ako sekven\u010dn\u00e9ho k\u00f3du. Ak sa pozriete na zdrojov\u00fd k\u00f3d libpq, uvid\u00edte dos\u0165 zlo\u017eit\u00e1 volania, ktor\u00e9 v\u00e1m m\u00f4\u017eu vr\u00e1ti\u0165 v\u00fdsledok a poveda\u0165: \u201eZavolajte ma nesk\u00f4r. Teraz m\u00e1m IO, ale ke\u010f IO skon\u010d\u00ed, m\u00e1m v\u00fdkonov\u00fa z\u00e1\u0165a\u017e pre procesor\u201c. A to je viac\u00farov\u0148ov\u00e1 sch\u00e9ma. Sie\u0165ov\u00e1 interakcia sa obvykle opisuje ako stroj stavov. Mno\u017estvom pravidiel typu \"Ak som predt\u00fdm dostal hlavi\u010dku paketu ve\u013ekosti N, teraz \u010dak\u00e1m N bajtov\", \"Ak som posielal paket SYNC, teraz \u010dak\u00e1m paket s metad\u00e1tami v\u00fdsledku\". Vznik\u00e1 dos\u0165 \u0165a\u017ek\u00fd kontraintuit\u00edvny k\u00f3d, ako keby labyrint pretransformovali na line\u00e1rne rozvinutie. Urobili sme to tak, \u017ee namiesto stroja stavov program\u00e1tor opisuje hlavn\u00fa cestu interakcie ako oby\u010dajn\u00fd imperat\u00edvny k\u00f3d. Jednoducho v tomto imperat\u00edvnom k\u00f3de je potrebn\u00e9 vklada\u0165 miesta, kde sa mus\u00ed naru\u0161i\u0165 sekvencia vykon\u00e1vania o\u010dak\u00e1van\u00edm d\u00e1t zo siete, odovzd\u00e1vaj\u00fac kontext vykon\u00e1vania inej korut\u00edne (zelen\u00e9mu vl\u00e1kne). Tento pr\u00edstup je podobn\u00fd tomu, ako naj\u010dakanej\u0161iu cestu v labyrinte zapisujeme postupne a potom k nej prid\u00e1vame odbo\u010dky. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a6bfb4b11961c7db3a7c7184674e3bc2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nakoniec m\u00e1me jedno vl\u00e1kno, ktor\u00e9 rob\u00ed TCP accept a round-robinom pren\u00e1\u0161a mno\u017estvu pracovn\u00edkov TCP-pripojenie. <\/p>\n<p><\/p>\n<p>Ka\u017ed\u00e9 klientsk\u00e9 pripojenie pritom v\u017edy pracuje na jednom procesore. To umo\u017e\u0148uje, aby bol jeho cache-friendly. <\/p>\n<p><\/p>\n<p>A navy\u0161e, trochu sme vylep\u0161ili zhroma\u017e\u010fovanie mal\u00fdch paketov do jedn\u00e9ho ve\u013ek\u00e9ho paketu, aby sme od\u013eah\u010dili syst\u00e9mov\u00fd TCP-stack.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7d740c23baecdd2f993c83cd54a0a8e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Okrem toho sme zlep\u0161ili transak\u010dn\u00e9 poolovanie v tom zmysle, \u017ee Odyssey pri nastavenej konfigur\u00e1cii m\u00f4\u017ee posla\u0165 CANCEL a ROLLBACK v pr\u00edpade preru\u0161enia sie\u0165ov\u00e9ho pripojenia, t. j. ak nikto ne\u010dak\u00e1 na dopyt, Odyssey povie datab\u00e1ze, aby sa nesna\u017eila vykona\u0165 dopyt, ktor\u00fd m\u00f4\u017ee plytva\u0165 cenn\u00fdmi zdrojmi.<\/p>\n<p><\/p>\n<p>A ak je to mo\u017en\u00e9, uchov\u00e1vame pripojenia pre rovnak\u00e9ho klienta. To zabra\u0148uje op\u00e4tovn\u00e9mu nastavovaniu application_name_add_host. Ak je to mo\u017en\u00e9, nem\u00e1me \u017eiadne dodato\u010dn\u00e9 nastavenia potrebn\u00e9 na diagnostiku. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. 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\u00e1ujme Yandex.Cloud. A ak pou\u017e\u00edvate managed PostgreSQL a m\u00e1te nastaven\u00fd connection pooler, m\u00f4\u017eete vytvori\u0165 logick\u00fa replik\u00e1ciu von, t. j. m\u00f4\u017eete sa od n\u00e1s odpoji\u0165, ak to chcete, prostredn\u00edctvom logickej replik\u00e1cie. Bouncer von neprenesie tok logickej replik\u00e1cie. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c53defc92ebd8f3bec57ce64d97b9f72.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Toto je pr\u00edklad nastavenia logickej replik\u00e1cie. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a37d9d1abf288d17fa646b642e8b62ab.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Okrem toho m\u00e1me podporu fyzickej replik\u00e1cie von. V cloude to samozrejme nie je mo\u017en\u00e9, preto\u017ee by v\u00e1m klaster poskytol pr\u00edli\u0161 ve\u013ea inform\u00e1ci\u00ed o sebe. Ale vo va\u0161ich in\u0161tal\u00e1ci\u00e1ch, ak potrebujete fyzick\u00fa replik\u00e1ciu cez connection pooler v Odyssey, je to mo\u017en\u00e9. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. 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 plne kompatibiln\u00fd monitoring s PgBouncer. M\u00e1me tak\u00fa ist\u00fa konzolu, ktor\u00e1 vykon\u00e1va takmer v\u0161etky rovnak\u00e9 pr\u00edkazy. Ak nie\u010do ch\u00fdba, po\u0161lite pull request alebo aspo\u0148 issue na GitHub, budeme dop\u013a\u0148a\u0165 potrebn\u00e9 pr\u00edkazy. Ale z\u00e1kladn\u00e1 funk\u010dnos\u0165 konzoly PgBouncer u\u017e existuje. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/451dd798fb3523a7a174ebfe00a14bc5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A samozrejme, m\u00e1me chybov\u00e9 preposielanie. Vr\u00e1time t\u00fa chybu, ktor\u00fa ozn\u00e1mila datab\u00e1za. Z\u00edskate inform\u00e1cie, pre\u010do sa nedostanete do datab\u00e1zy, a nie iba to, \u017ee sa do nej nedostanete. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/14b4cb0efa33a2658dfc528349a5382f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>T\u00e1to funkcia sa vyp\u00edna v pr\u00edpade, ak potrebujete 100%-n\u00fa kompatibilitu s PgBouncer. M\u00f4\u017eeme sa spr\u00e1va\u0165 rovnako ako Bouncer, len pre istotu. <\/p>\n<p><\/p>\n<p><strong>V\u00fdvoj<\/strong><\/p>\n<p><\/p>\n<p>N\u00e1vrh p\u00e1r slov o zdrojovom k\u00f3de Odyssey. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. 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>Napr\u00edklad existuj\u00fa pr\u00edkazy \u201ePozastavi\u0165 \/ Obnovi\u0165\u201c. Tieto pr\u00edkazy sa zvy\u010dajne pou\u017e\u00edvaj\u00fa na aktualiz\u00e1ciu datab\u00e1zy. Ak potrebujete aktualizova\u0165 Postgres, m\u00f4\u017eete ho pozastavi\u0165 v connection pooler, vykona\u0165 pg_upgrade a potom ho obnovi\u0165. Z poh\u013eadu klienta to vyzer\u00e1, akoby datab\u00e1za len spomalila. T\u00fato funk\u010dnos\u0165 n\u00e1m priniesli \u013eudia z komunity. E\u0161te nie je zl\u00fa\u010den\u00e1, ale \u010doskoro bude. (U\u017e zl\u00fa\u010den\u00e1)<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. 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 zl\u00fa\u010den\u00e1<\/p>\n<p><\/p>\n<p>Okrem toho, jedna z nov\u00fdch funkci\u00ed v PgBouncer je podpora SCRAM Authentication, ktor\u00fa n\u00e1m tie\u017e priniesol \u010dlovek, ktor\u00fd nepracuje v Yandex.Cloud. Obe tieto funk\u010dnosti s\u00fa zlo\u017eit\u00fdmi a d\u00f4le\u017eit\u00fdmi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f39346a543c88d17728233d05c2dff19.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Preto by som chcel poveda\u0165, z \u010doho je zlo\u017een\u00fd Odyssey, mo\u017eno aj vy teraz chcete tro\u0161ku zap\u00edsa\u0165 k\u00f3d. <\/p>\n<p><\/p>\n<p>M\u00e1te p\u00f4vodn\u00fa datab\u00e1zu Odyssey, ktor\u00e1 sa opiera o dve hlavn\u00e9 kni\u017enice. Kni\u017enica Kiwi je implement\u00e1cia Postgres protokolu spr\u00e1v. T. j. nat\u00edvny proto 3 v Postgres \u2013 to s\u00fa \u0161tandardn\u00e9 spr\u00e1vy, ktor\u00fdmi si front-endy a back-endy m\u00f4\u017eu vymie\u0148a\u0165. Tieto s\u00fa implementovan\u00e9 v kni\u017enici Kiwi.<\/p>\n<p><\/p>\n<p>Kni\u017enica Machinarium je kni\u017enica implement\u00e1cie tokov. Mal\u00fd fragment tejto kni\u017enice Machinarium je nap\u00edsan\u00fd v asembleri. Ale nebojte sa, m\u00e1 len 15 riadkov. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/cd18f250af50eabd53536b2c0d7f12b5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Architekt\u00fara Odyssey. Existuje hlavn\u00fd stroj, v ktorom s\u00fa spusten\u00e9 coroutines. V tomto stroji sa realizuje akcept\u00e1cia prich\u00e1dzaj\u00facich TCP pripojen\u00ed a rozdelenie pr\u00e1c medzi workers. <\/p>\n<p><\/p>\n<p>Vo vn\u00fatri jedn\u00e9ho worker m\u00f4\u017ee be\u017ea\u0165 spracovate\u013e viacer\u00fdch klientov. A tie\u017e v hlavnom vl\u00e1kne be\u017e\u00ed konzola a spracovanie crone \u00faloh na odstr\u00e1nenie pripojen\u00ed, ktor\u00e9 u\u017e nie s\u00fa potrebn\u00e9 v pool.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7072fb20f406f2ee5788542860ccdf50.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Na testovanie Odyssey pou\u017e\u00edvame \u0161tandardn\u00fa sadu testov Postgres. Jednoducho spust\u00edme install-check cez Bouncer a cez Odyssey, dostaneme nulov\u00fd div. Nieko\u013eko testov s\u00favisiacich s form\u00e1tovan\u00edm d\u00e1t prech\u00e1dza \u00faplne rovnako v Bouncer a v Odyssey.<\/p>\n<p><\/p>\n<p>Okrem toho existuje mno\u017estvo ovl\u00e1da\u010dov, ktor\u00e9 maj\u00fa svoje vlastn\u00e9 testovanie. A ich testy pou\u017e\u00edvame na testovanie Odyssey.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/fb01cc9a0e9724ddcd3cc3d088afb182.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Okrem toho, kv\u00f4li na\u0161ej kask\u00e1dovej konfigur\u00e1cii mus\u00edme testova\u0165 r\u00f4zne kombin\u00e1cie: Postgres + Odyssey, PgBouncer + Odyssey, Odyssey + Odyssey, aby sme si boli ist\u00ed, \u017ee ak sa Odyssey ocitne v niektorej \u010dasti kask\u00e1dy, st\u00e1le funguje tak, ako o\u010dak\u00e1vame. <\/p>\n<p><\/p>\n<p><strong>Hrebene<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. 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\u00edvame Odyssey v produkcii. A nebolo by f\u00e9r poveda\u0165, \u017ee v\u0161etko len tak funguje. Nie, t. j. \u00e1no, ale nie v\u017edy. Napr\u00edklad, v produkcii to jednoducho fungovalo, potom pri\u0161li na\u0161i priatelia z PostgreSQL Professional a povedali, \u017ee m\u00e1me memory leak. Skuto\u010dne tam boli, opravili sme ich. Ale to bolo len tak. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e638d88397b32b1ca0b74c9c1b905f81.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00e1sledne sme zistili, \u017ee v connection pooleri s\u00fa prich\u00e1dzaj\u00face TLS pripojenia a odch\u00e1dzaj\u00face TLS pripojenia. A na pripojeniach s\u00fa potrebn\u00e9 klientsk\u00e9 certifik\u00e1ty a serverov\u00e9 certifik\u00e1ty.<\/p>\n<p><\/p>\n<p>Serverov\u00e9 certifik\u00e1ty Bouncer a Odyssey na\u010d\u00edtavaj\u00fa svoju pcache, ale klientsk\u00e9 certifik\u00e1ty nie je potrebn\u00e9 z pcache znova na\u010d\u00edta\u0165, preto\u017ee n\u00e1\u0161 \u0161k\u00e1lovate\u013en\u00fd Odyssey nakoniec naraz\u00ed na syst\u00e9mov\u00fd v\u00fdkon pri \u010d\u00edtan\u00ed tohto certifik\u00e1tu. Toto bolo pre n\u00e1s prekvapen\u00edm, preto\u017ee sa to neprejavilo hne\u010f. Najprv sa \u0161k\u00e1loval line\u00e1rne, ale po 20 000 prich\u00e1dzaj\u00facich s\u00fa\u010dasn\u00fdch pripojeniach sa tento probl\u00e9m objavil.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. 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\u017enos\u0165 autentifikova\u0165 sa pomocou zabudovan\u00fdch linuxov\u00fdch prostriedkov. V PgBouncer je to implementovan\u00e9 tak, \u017ee existuje samostatn\u00fd vl\u00e1kno na \u010dakanie na odpove\u010f od PAM a existuje hlavn\u00e9 vl\u00e1kno PgBouncer, ktor\u00e9 obsluhuje aktu\u00e1lne pripojenie a m\u00f4\u017ee ich po\u017eiada\u0165, aby po\u010dkali vo vl\u00e1kne PAM. <\/p>\n<p><\/p>\n<p>Toto sme nezrealizovali z jedn\u00e9ho jednoduch\u00e9ho d\u00f4vodu. Ve\u010f m\u00e1me ve\u013ea vl\u00e1kien. Na \u010do n\u00e1m to je potrebn\u00e9?<\/p>\n<p><\/p>\n<p>Nakoniec to m\u00f4\u017ee sp\u00f4sobova\u0165 probl\u00e9my, preto\u017ee ak m\u00e1te PAM autentifik\u00e1ciu a ne-PAM autentifik\u00e1ciu, ve\u013ek\u00e1 vlna PAM autentifik\u00e1cie m\u00f4\u017ee podstatne spomali\u0165 ne-PAM autentifik\u00e1ciu. Toto je jedna z t\u00fdch vec\u00ed, ktor\u00e9 sme neopravili. Ale ak to chcete opravi\u0165, m\u00f4\u017eete sa t\u00fdmto zaobera\u0165. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c7bd9e9980ff7298b30a59c130f03dbb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u010eal\u0161\u00ed probl\u00e9m bol, \u017ee m\u00e1me jedno vl\u00e1kno, ktor\u00e9 prij\u00edma v\u0161etky prich\u00e1dzaj\u00face pripojenia. A potom ich odovzd\u00e1va do pracovn\u00e9ho poolu, kde prebehne TLS handshake.<\/p>\n<p><\/p>\n<p>Nakoniec, ak m\u00e1te koherentn\u00fa vlnu z 20 000 sie\u0165ov\u00fdch pripojen\u00ed, v\u0161etky bud\u00fa prijat\u00e9. A na strane klienta libpq za\u010dne odpo\u010d\u00edtavanie timeoutov. Pod\u013ea predpokladov tam je nastaven\u00fd 3-sekundov\u00fd timeout. <\/p>\n<p><\/p>\n<p>Ak v\u0161etky nem\u00f4\u017eu z\u00e1rove\u0148 vst\u00fapi\u0165 do datab\u00e1zy, nem\u00f4\u017eu vst\u00fapi\u0165 do datab\u00e1zy, preto\u017ee v\u0161etko m\u00f4\u017ee by\u0165 pokryt\u00e9 neexponenci\u00e1lnym retry. <\/p>\n<p><\/p>\n<p>Dospeli sme k tomu, \u017ee sme tu skop\u00edrovali sch\u00e9mu z PgBouncer, kde m\u00e1me throttling po\u010dtu TCP pripojen\u00ed, ktor\u00fdm prij\u00edmame. <\/p>\n<p><\/p>\n<p>Ak vid\u00edme, \u017ee akceptujeme pripojenia, ale nakoniec sa im nedar\u00ed naplni\u0165 handshake, zarad\u00edme ich do frontu, aby nevyu\u017e\u00edvali zdroje centr\u00e1lnych procesorov. To vedie k tomu, \u017ee s\u00fa\u010dasn\u00fd handshake sa nemus\u00ed vykon\u00e1va\u0165 pre v\u0161etky pripojenia, ktor\u00e9 pri\u0161li. Ale aspo\u0148 niekto sa pripoj\u00ed do datab\u00e1zy, aj ke\u010f je z\u00e1\u0165a\u017e dos\u0165 siln\u00e1.<\/p>\n<p><\/p>\n<p><strong>Pl\u00e1n<\/strong><\/p>\n<p><\/p>\n<p>\u010co by sme chceli vidie\u0165 v bud\u00facnosti v Odyssey? \u010co sme pripraven\u00ed vyv\u00edja\u0165 sami a \u010do o\u010dak\u00e1vame od komunity?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4719437d80b33efc3da6572af9a4dedb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Na august 2019.<\/strong><\/p>\n<p><\/p>\n<p>Takto vyzeral pl\u00e1n Odyssey v auguste:<\/p>\n<p><\/p>\n<ul>\n<li>Chceli sme SCRAM a PAM autentifik\u00e1ciu.<\/li>\n<li>Chceli sme prenos \u010d\u00edtac\u00edch po\u017eiadaviek na z\u00e1lo\u017en\u00fd server. <\/li>\n<li>Bolo by fajn ma\u0165 online-re\u0161tart. <\/li>\n<li>A mo\u017enos\u0165 pozastavi\u0165 server. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/455c92f92df826257c2c57dc2b034e22.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Polovica tohto pl\u00e1nu je splnen\u00e1, a to dokonca nie na\u0161ou pr\u00e1cou. A to je dobre. Tak\u017ee diskutujme o tom, \u010do zost\u00e1va a pridajme \u010fal\u0161ie. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. 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\">Pokia\u013e ide o prenos \u010d\u00edtac\u00edch po\u017eiadaviek na z\u00e1lo\u017en\u00fd server<\/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: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0873cffd4f1ae15d9ffa6d080671051b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>V Postgres, po\u010dn\u00fac verziou 10, existuje mo\u017enos\u0165 pri pripojen\u00ed uvies\u0165 aj session_attrs. M\u00f4\u017eete v pripojen\u00ed vymenova\u0165 v\u0161etky datab\u00e1zov\u00e9 hosty a poveda\u0165, pre\u010do idete do datab\u00e1zy: zapisova\u0165 alebo iba \u010d\u00edta\u0165. A ovl\u00e1da\u010d si s\u00e1m vyberie prv\u00fd hos\u0165 v zozname, ktor\u00fd mu vyhovuje a spln\u00ed po\u017eiadavky session_attrs. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0693d1327fe5826502a01c21d05d5b4c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Probl\u00e9mom tohto pr\u00edstupu je, \u017ee nekontroluje oneskorenie replik\u00e1cie. M\u00f4\u017ee by\u0165 nejak\u00e1 replika, ktor\u00e1 zaost\u00e1va na neprijate\u013en\u00fd \u010das pre va\u0161u slu\u017ebu. Aby sme mohli funk\u010dne vykon\u00e1va\u0165 \u010d\u00edtacie po\u017eiadavky na replike, potrebujeme v Odyssey zabezpe\u010di\u0165, aby nefungoval, ke\u010f nie je mo\u017en\u00e9 \u010d\u00edta\u0165. <\/p>\n<p><\/p>\n<p>Odyssey by mal \u010das od \u010dasu vst\u00fapi\u0165 do datab\u00e1zy a op\u00fdta\u0165 sa na replik\u00e1ciu od prim\u00e1rneho servera. A ak dosiahne kritick\u00fa hodnotu, nov\u00fdm po\u017eiadavk\u00e1m do datab\u00e1zy by nemal dovoli\u0165 pr\u00edstup, mal by klientovi poveda\u0165, aby znova inicioval pripojenia a mo\u017eno si vybra\u0165 in\u00e9ho hostite\u013ea na vykon\u00e1vanie po\u017eiadaviek. To umo\u017en\u00ed datab\u00e1ze r\u00fdchlej\u0161ie obnovi\u0165 replik\u00e1ciu a znovu za\u010da\u0165 odpoveda\u0165 na po\u017eiadavky. <\/p>\n<p><\/p>\n<p>\u010casov\u00e9 r\u00e1mce realiz\u00e1cie sa \u0165a\u017eko naz\u00fdvaj\u00fa, preto\u017ee ide o open source. Ale d\u00fafam, \u017ee nie 2,5 roka ako u kolegov z PgBouncer. T\u00fato funkciu by som chcel vidie\u0165 v Odyssey. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. 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\">\u013dudia v komunite sa p\u00fdtali na podporu pripraven\u00fdch pr\u00edkazov.<\/a><\/noindex>Teraz m\u00f4\u017eete vytvori\u0165 pripraven\u00fd statement dvoma sp\u00f4sobmi. Po prv\u00e9, m\u00f4\u017eete vykona\u0165 SQL pr\u00edkaz, konkr\u00e9tne \u201eprepared\u201c. Aby sme pochopili tento SQL pr\u00edkaz, mus\u00edme sa nau\u010di\u0165 rozumie\u0165 SQL na strane Bouncer. To by bolo nadmern\u00e9, preto\u017ee potrebujeme cel\u00fd parser. Nem\u00f4\u017eeme analyzova\u0165 ka\u017ed\u00fd SQL pr\u00edkaz. <\/p>\n<p><\/p>\n<p>Existuje v\u0161ak pripraven\u00fd statement na \u00farovni protokolu spr\u00e1v na proto3. A to je to miesto, kde inform\u00e1cie o tom, \u017ee sa vytv\u00e1ra pripraven\u00fd statement, prich\u00e1dzaj\u00fa v \u0161trukt\u00farovanej forme. Mohli by sme podpori\u0165 pochopenie toho, \u017ee na nejakom serverovom spojen\u00ed klient po\u017eiadal o vytvorenie pripraven\u00fdch statementov. A aj ke\u010f sa transakcia uzavrela, mus\u00edme na\u010falej udr\u017eiava\u0165 s\u00favislos\u0165 servera a klienta. <\/p>\n<p><\/p>\n<p>Tu v\u0161ak vznik\u00e1 rozpor v dial\u00f3gu, preto\u017ee niekto hovor\u00ed o tom, \u017ee je potrebn\u00e9 pochopi\u0165, ktor\u00fd presne pripraven\u00fd statement vytvoril klient a rozde\u013eova\u0165 serverov\u00e9 spojenie medzi v\u0161etk\u00fdmi klientmi, ktor\u00ed vytvorili toto serverov\u00e9 spojenie, t.j. ktor\u00ed vytvorili tak\u00fd pripraven\u00fd statement. <\/p>\n<p><\/p>\n<p>Andres Freund povedal, \u017ee ak k v\u00e1m pri\u0161iel klient, ktor\u00fd u\u017e vytvoril v inom serverovom spojen\u00ed tak\u00fd pripraven\u00fd statement, vytvorte ho za neho. Ale zd\u00e1 sa, \u017ee je to trochu nespr\u00e1vne vykon\u00e1va\u0165 po\u017eiadavky v datab\u00e1ze namiesto klienta, ale z poh\u013eadu v\u00fdvoj\u00e1ra, ktor\u00fd p\u00ed\u0161e protokol interakcie s datab\u00e1zou, by bolo pohodln\u00e9, keby mu jednoducho dali sie\u0165ov\u00e9 spojenie, v ktorom je tak\u00fdto pripraven\u00fd dotaz. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/cd56b3ad015195d86a64e52be365b16a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A e\u0161te jedna funkcia, ktor\u00fa mus\u00edme implementova\u0165. Moment\u00e1lne m\u00e1me monitorovanie kompatibiln\u00e9 s PgBouncer. M\u00f4\u017eeme vr\u00e1ti\u0165 priemern\u00fd \u010das vykonania dotazu. Ale priemern\u00fd \u010das je priemern\u00e1 teplota v nemocnici: niekto je studen\u00fd, niekto tepl\u00fd \u2013 v priemere s\u00fa v\u0161etci zdrav\u00ed. To nie je pravda. <\/p>\n<p><\/p>\n<p>Mus\u00edme implementova\u0165 podporu percentilov, ktor\u00e9 by ukazovali na to, \u017ee existuj\u00fa pomal\u00e9 dotazy, ktor\u00e9 spotreb\u00favaj\u00fa zdroje, a urobili by monitorovanie akceptovate\u013enej\u0161\u00edm. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6f285f3eb0d79e7f25d42f0e792b85b1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Najd\u00f4le\u017eitej\u0161ie je, \u017ee chceme verziu 1.0 (u\u017e vy\u0161la verzia 1.1). Faktom je, \u017ee teraz je Odyssey vo verzii 1.0rc, t.j. release candidate. A v\u0161etky probl\u00e9my, ktor\u00e9 som uviedol, boli opraven\u00e9 presne v tejto verzii, okrem \u00faniku pam\u00e4te. <\/p>\n<p><\/p>\n<p>\u010co pre n\u00e1s bude znamena\u0165 verzia 1.0? Sp\u00fa\u0161\u0165ame Odyssey na na\u0161ich datab\u00e1zach. U\u017e teraz funguje na na\u0161ich z\u00e1kladoch, ale ke\u010f dosiahne bod 1 000 000 po\u017eiadaviek za sekundu, m\u00f4\u017eeme poveda\u0165, \u017ee to je verzia ur\u010den\u00e1 na vydanie a \u017ee to je verzia, ktor\u00fa m\u00f4\u017eeme nazva\u0165 1.0. <\/p>\n<p><\/p>\n<p>V komunite nieko\u013eko \u013eud\u00ed po\u017eiadalo, aby verzia 1.0 obsahovala aj pauzu a SCRAM. Ale to by znamenalo, \u017ee budeme musie\u0165 v produk\u010dnom prostred\u00ed nasadi\u0165 u\u017e \u010fal\u0161iu verziu, preto\u017ee ani SCRAM, ani pauza zatia\u013e nie s\u00fa zl\u00fa\u010den\u00e9. Ale pravdepodobne bude tento probl\u00e9m dostato\u010dne r\u00fdchlo vyrie\u0161en\u00fd. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u010do \u010fal\u0161ie o\u010dak\u00e1vame od connection poolera. Andrej Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2f50de9f51f653a7396965239bd545e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u010cak\u00e1m na va\u0161e pull requesty. A tie\u017e by som r\u00e1d po\u010dul, ak\u00e9 m\u00e1te probl\u00e9my s Bouncerom. Po\u010fme ich prediskutova\u0165. Mo\u017eno budeme m\u00f4c\u0165 implementova\u0165 niektor\u00e9 funkcie, ktor\u00e9 potrebujete. <\/p>\n<p><\/p>\n<p>Na tomto kon\u010d\u00edm svoju \u010das\u0165, r\u00e1d by som v\u00e1s po\u010dul. \u010eakujem!<\/p>\n<p><\/p>\n<p>Ot\u00e1zky<\/p>\n<p><\/p>\n<p><em>Ak nastav\u00edm svoje application_name, spr\u00e1vne sa prenesie, vr\u00e1tane transak\u010dn\u00e9ho poolingu v Odyssey?<\/em><\/p>\n<p><\/p>\n<p>V Odyssey alebo v Bouncerovi?<\/p>\n<p><\/p>\n<p><em>V Odyssey. V Bouncerovi sa pren\u00e1\u0161a.<\/em> <\/p>\n<p><\/p>\n<p>Set sprav\u00edme. <\/p>\n<p><\/p>\n<p><em>A ak bude moje skuto\u010dn\u00e9 spojenie preskakova\u0165 na in\u00e9 spojenia, bude sa pren\u00e1\u0161a\u0165?<\/em><\/p>\n<p><\/p>\n<p>Urob\u00edme set v\u0161etk\u00fdch parametrov uveden\u00fdch v zozname. Neviem, \u010di je v tomto zozname application_name. Zd\u00e1 sa, \u017ee som ho tam videl. Nastav\u00edme v\u0161etky tie ist\u00e9 parametre. Jedn\u00fdm dopytom sa tam set rob\u00ed v\u0161etko, \u010do bolo nastaven\u00e9 klientom pri \u0161tarte. <\/p>\n<p><\/p>\n<p><em>\u010eakujem, Andrej, za prezent\u00e1ciu! Dobr\u00fd prejav! R\u00e1d vid\u00edm, \u017ee Odyssey sa s ka\u017edou min\u00fatou vyv\u00edja r\u00fdchlej\u0161ie a r\u00fdchlej\u0161ie. Prajem v\u00e1m, aby ste pokra\u010dovali tak\u00fdmto tempom. U\u017e sme sa na v\u00e1s obracali s prosbou o multi data-source pripojenie, aby sa Odyssey mohol pripoji\u0165 s\u00fa\u010dasne k r\u00f4znym datab\u00e1zam, t. j. master-slave, a potom sa automaticky po failoveri pripoji\u0165 k nov\u00e9mu masterovi.<\/em> <\/p>\n<p><\/p>\n<p>\u00c1no, zd\u00e1 sa, \u017ee si pam\u00e4t\u00e1m t\u00fato diskusiu. Moment\u00e1lne existuje nieko\u013eko \u00falo\u017e\u00edsk. Ale medzi nimi nie je prech\u00e1dzanie. Mus\u00edme na svojej strane kontrolova\u0165 server, \u010di je e\u0161te \u017eiv\u00fd a pochopi\u0165, \u017ee do\u0161lo k failoveru, kto vyvol\u00e1 pg_recovery. M\u00e1m \u0161tandardn\u00fd sp\u00f4sob, ako zisti\u0165, \u017ee sme sa nepripojili k masterovi. A mus\u00edme to nejak pochopi\u0165 z ch\u00fdb alebo ako? T. j. my\u0161lienka je zauj\u00edmav\u00e1, je predmetom diskusie. P\u00ed\u0161te viac koment\u00e1rov. Ak m\u00e1te pracovn\u00e9 sily, ktor\u00e9 ovl\u00e1daj\u00fa C, tak to je v\u00f4bec \u00fa\u017easn\u00e9. <\/p>\n<p><\/p>\n<p>Ot\u00e1zka \u0161k\u00e1lovania pomocou replik\u00e1ci\u00ed n\u00e1s tie\u017e zauj\u00edma, preto\u017ee chceme, aby adopcia replikovan\u00fdch klastrov bola pre v\u00fdvoj\u00e1rov aplik\u00e1ci\u00ed \u010do najjednoduch\u0161ia. Chceli by sme v\u0161ak viac koment\u00e1rov, t. j. ako presne to implementova\u0165, ako to spravi\u0165 dobre. <\/p>\n<p><\/p>\n<p><em>Ot\u00e1zka tie\u017e t\u00fdka replik\u00e1ci\u00ed. M\u00e1te master a nieko\u013eko replik. A je jasn\u00e9, \u017ee do replik sa pristupuje menej \u010dasto ako k masteru, preto\u017ee m\u00f4\u017eu ma\u0165 odch\u00fdlky. Hovorili ste, \u017ee rozdiel v \u00fadajoch m\u00f4\u017ee by\u0165 tak\u00fd, \u017ee nebude vyhovova\u0165 v\u00e1\u0161mu podnikaniu a nebudete tam pristupova\u0165, k\u00fdm nebude replik\u00e1cia dokon\u010den\u00e1. Ak ste tam dlho nechodili a potom za\u010dnete, \u00fadaje, ktor\u00e9 potrebujete, nebud\u00fa ihne\u010f dostupn\u00e9. T. j. ak neust\u00e1le chod\u00edme do mastera, tam je vyhriaty cache, zatia\u013e \u010do v replik\u00e1ch cache trochu zaost\u00e1va.<\/em> <\/p>\n<p><\/p>\n<p>\u00c1no, to je pravda. V pcache nebud\u00fa bloky \u00fadajov, ktor\u00e9 chcete, v real cache nebude inform\u00e1cia o tabu\u013ek\u00e1ch, ktor\u00e9 chcete, v pl\u00e1noch nebud\u00fa spracovan\u00e9 po\u017eiadavky, proste tam nebude ni\u010d. <\/p>\n<p><\/p>\n<p><em>A ke\u010f m\u00e1te nejak\u00fd klaster a prid\u00e1te do\u0148 nov\u00fa replik\u00e1ciu, tak pokia\u013e sa sp\u00fa\u0161\u0165a, je na tom zle, t. j. buduje si svoj cache.<\/em> <\/p>\n<p><\/p>\n<p>Rozumiem n\u00e1padu. Spr\u00e1vny pr\u00edstup by bol spusti\u0165 mal\u00fd percentu\u00e1lny podiel po\u017eiadaviek najprv na replik\u00e1ciu, aby sa vyhrial cache. Vo vo\u013enom preklade, m\u00e1me podmienku, \u017ee mus\u00edme by\u0165 maxim\u00e1lne 10 sek\u00fand za masterom. A t\u00fato podmienku je potrebn\u00e9 zavies\u0165 nie jednou vlnou, ale postupne pre niektor\u00fdch klientov. <\/p>\n<p><\/p>\n<p><em>\u00c1no, zvy\u0161ova\u0165 v\u00e1hu.<\/em><\/p>\n<p><\/p>\n<p>To je dobr\u00fd n\u00e1pad. Ale najprv je potrebn\u00e9 implementova\u0165 toto odpojenie. Najprv sa mus\u00edme vypn\u00fa\u0165 a potom premyslie\u0165, ako sa zapn\u00fa\u0165. Je to skvel\u00e1 funkcia, aby sme sa mohli zapn\u00fa\u0165 plynulo.<\/p>\n<p><\/p>\n<p><em>V nginx je tak\u00e1to vo\u013eba <code>slowly start<\/code> pre server v klastri. A postupne zvy\u0161uje z\u00e1\u0165a\u017e.<\/em> <\/p>\n<p><\/p>\n<p>\u00c1no, skvel\u00fd n\u00e1pad, pok\u00fasime sa to, ke\u010f sa 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.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\/sk\/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=\"sk_SK\" \/>\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\/sk\/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: \u010do e\u0161te chceme od poolera pripojen\u00ed. Andrej Borodin (2019) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/sk\/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":"sk_SK","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\/sk\/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\/sk\/wp-json\/wp\/v2\/posts\/96515","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=96515"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/96515\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/96516"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=96515"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=96515"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=96515"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}