{"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\/sq\/blog\/administrirovanie\/odyssey-roadmap-chto-eshhyo-my-hotim-ot-pulera-soedinenij-andrej-borodin-2019","title":{"rendered":"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6c445191705a4c96939cd094bc457a53.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00eb k\u00ebt\u00eb raport, Andrei Borodin do t\u00eb flas\u00eb se si mor\u00ebn parasysh p\u00ebrvoj\u00ebn e shkall\u00ebzimit t\u00eb PgBouncer gjat\u00eb projektimit t\u00eb pool-it t\u00eb lidhjeve. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex\/odyssey\">Odyssey<\/a><\/noindex>, si e lan\u00e7uan at\u00eb n\u00eb production. P\u00ebr m\u00eb tep\u00ebr, do t\u00eb diskutojm\u00eb cilat funksione t\u00eb pool-it do t\u00eb d\u00ebshiroja t\u00eb shihja n\u00eb versionet e reja: na r\u00ebnd\u00ebsi jo vet\u00ebm t\u00eb mbyllim nevojat tona, por t\u00eb zhvillojm\u00eb komunitetin e p\u00ebrdoruesve. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex\/odyssey\">Odisea<\/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=\"Luaj videon\" 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: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/dd2ea50b72e3d9c4e795aecbf9afdd25.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>P\u00ebrsh\u00ebndetje t\u00eb gjith\u00ebve! M\u00eb quajn\u00eb Andrei. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0a2f1880005bec1f61b72fb23b555adc.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00eb Yandex, merrem me zhvillimin e bazave t\u00eb t\u00eb dh\u00ebnave open source. Dhe sot kemi nj\u00eb tem\u00eb p\u00ebr pool-in e lidhjeve. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c18e7c937423d2514faa12e820e78e70.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00ebse e dini se si t\u00eb quhet pool-i i lidhjeve n\u00eb rusisht, m\u00eb thoni. Dua shum\u00eb t\u00eb gjej nj\u00eb term teknik t\u00eb mir\u00eb q\u00eb duhet t\u00eb konsolidohet n\u00eb literatur\u00ebn teknike. <\/p>\n<p><\/p>\n<p>Tema \u00ebsht\u00eb mjaft e komplikuar, sepse n\u00eb shum\u00eb baza t\u00eb dh\u00ebnash pool-i i lidhjeve \u00ebsht\u00eb i integruar dhe nuk duhet t\u00eb dihet fare p\u00ebr t\u00eb. Disa cil\u00ebsime, sigurisht, ka kudo, por n\u00eb Postgres nuk funksionon ashtu. Dhe paralelisht (n\u00eb HighLoad++ 2019) ka nj\u00eb raport nga Nikolai Samohvalov p\u00ebr cil\u00ebsimin e k\u00ebrkesave n\u00eb Postgres. Dhe mendoj se k\u00ebtu erdh\u00ebn njer\u00ebz q\u00eb tashm\u00eb i kan\u00eb konfiguruar k\u00ebrkesat n\u00eb m\u00ebnyr\u00eb perfekte, dhe k\u00ebta jan\u00eb njer\u00ebzit q\u00eb p\u00ebrballen me probleme sistemike m\u00eb t\u00eb rralla t\u00eb lidhura me rrjetin, shfryt\u00ebzimin e burimeve. Dhe ndonj\u00ebher\u00eb ka qen\u00eb mjaft e komplikuar, p\u00ebr shkak se problemet jan\u00eb t\u00eb paqart\u00eb.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/89c660dd530575e2938e6bf312b83e95.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00eb Yandex ka Postgres. N\u00eb Yandex.Cloud jetojn\u00eb shum\u00eb sh\u00ebrbime t\u00eb Yandex. Dhe ne kemi disa petabyte t\u00eb dh\u00ebnash q\u00eb gjenerojn\u00eb jo m\u00eb pak se nj\u00eb milion k\u00ebrkesa n\u00eb sekond\u00eb n\u00eb Postgres. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/288bfa37b9dcd60acd22ba48f0ef8a39.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dhe ne ofrojm\u00eb nj\u00eb klaster mjaft standard p\u00ebr t\u00eb gjitha sh\u00ebrbimet \u2013 ky \u00ebsht\u00eb nodi kryesor primar, dy-replikat normale (nj\u00eb sinkron dhe nj\u00eb asinkron), kopjimi rezerv dhe shkall\u00ebzimi i k\u00ebrkesave lexuese n\u00eb replik\u00eb. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c249ca55bb387e25a5560324024cc523.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c7do nod i klasterit \u00ebsht\u00eb Postgres, mbi t\u00eb cilin p\u00ebrve\u00e7 Postgresit dhe sistemeve t\u00eb monitoringut \u00ebsht\u00eb gjithashtu instaluar pool-i i lidhjeve. Pool-i i lidhjeve p\u00ebrdoret p\u00ebr fencing dhe p\u00ebr q\u00ebllimin e tij kryesor. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0e29be55cc048007db21c80bbb08a9d4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c7far\u00eb \u00ebsht\u00eb q\u00ebllimi kryesor i pool-it t\u00eb lidhjeve? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e2fbbd440c2781573cb35deeef358f20.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00eb Postgres \u00ebsht\u00eb pranuar modeli procesor n\u00eb pun\u00ebn me baz\u00ebn e t\u00eb dh\u00ebnave. Kjo do t\u00eb thot\u00eb se nj\u00eb lidhje \u2013 \u00ebsht\u00eb nj\u00eb proces, nj\u00eb backend i Postgres. Dhe n\u00eb k\u00ebt\u00eb backend ka shum\u00eb cache t\u00eb ndryshme, t\u00eb cilat jan\u00eb t\u00eb kushtueshme p\u00ebr t'u b\u00ebr\u00eb t\u00eb ndryshme p\u00ebr lidhje t\u00eb ndryshme. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/587498063b1af8fac4a845961c654bc2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>P\u00ebr m\u00eb tep\u00ebr, n\u00eb kodin e Postgres ka nj\u00eb array, i quajtur procArray. Ai p\u00ebrmban t\u00eb dh\u00ebna kryesore rreth lidhjeve rrjet. Dhe pothuajse t\u00eb gjith\u00eb algoritmet e p\u00ebrpunimit t\u00eb procArray kan\u00eb kompleksitet linear, ata kalojn\u00eb n\u00ebp\u00ebr t\u00eb gjith\u00eb array-n\u00eb e lidhjeve rrjet. Ky \u00ebsht\u00eb nj\u00eb cik\u00ebl mjaft i shpejt\u00eb, por me nj\u00eb num\u00ebr t\u00eb madh t\u00eb lidhjeve rrjet, gjith\u00e7ka b\u00ebhet pak m\u00eb e shtrenjt\u00eb. Dhe kur \u00e7do gj\u00eb b\u00ebhet pak m\u00eb e shtrenjt\u00eb, n\u00eb fund mund t\u00eb paguani nj\u00eb \u00e7mim shum\u00eb t\u00eb lart\u00eb p\u00ebr nj\u00eb num\u00ebr t\u00eb madh t\u00eb lidhjeve rrjet. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/b534a38d0bfae7a65fc4258155a50280.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ka 3 qasje t\u00eb mundshme:<\/p>\n<p><\/p>\n<ul>\n<li>N\u00eb an\u00ebn e aplikacionit. <\/li>\n<li>N\u00eb an\u00ebn e baz\u00ebs s\u00eb t\u00eb dh\u00ebnave. <\/li>\n<li>Dhe mes tyre, dmth, t\u00eb gjitha kombinimet e mundshme. <\/li>\n<\/ul>\n<p><\/p>\n<p>Fatkeq\u00ebsisht, pooler-i i integruar \u00ebsht\u00eb aktualisht n\u00eb faz\u00ebn e zhvillimit. Miqt\u00eb n\u00eb kompanin\u00eb PostgreSQL Professional kryesisht po merren me k\u00ebt\u00eb. Kur do t\u00eb shfaqet, \u00ebsht\u00eb e v\u00ebshtir\u00eb t\u00eb parashikohet. Dhe n\u00eb t\u00eb v\u00ebrtet\u00eb, p\u00ebr arkitektin ka dy zgjidhje. Kjo \u00ebsht\u00eb pool-i nga ana e aplikacionit dhe proxy pool. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/702527a09e9fc86dd39b7fd69dcf1fc9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pool-i nga ana e aplikacionit \u00ebsht\u00eb manera m\u00eb e thjesht\u00eb. Dhe pothuajse t\u00eb gjitha drejtorit\u00eb e klient\u00ebve ju ofrojn\u00eb nj\u00eb m\u00ebnyr\u00eb: miliona lidhjet tuaja n\u00eb kod t\u00eb paraqiten si disa dhjet\u00ebra lidhje n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7b66b9e20d22f472ca5ac39f6b9e0ba4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Shtrohet problemi se n\u00eb nj\u00eb moment t\u00eb caktuar d\u00ebshironi t\u00eb shkall\u00ebzoni backend-in, d\u00ebshironi ta publikoni at\u00eb n\u00eb shum\u00eb makineri virtuale. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f216fd7a8c01c2b07891e2242c48b06a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pastaj e kuptoni edhe se keni disa zona t\u00eb disponueshm\u00ebris\u00eb, disa qendra t\u00eb t\u00eb dh\u00ebnave. Dhe qasja me pooling nga ana e klientit \u00e7on n\u00eb numra t\u00eb m\u00ebdhenj. T\u00eb m\u00ebdhenj do t\u00eb thot\u00eb rreth 10,000 lidhje. Ky \u00ebsht\u00eb kufiri q\u00eb mund t\u00eb funksionoj\u00eb normalisht. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e5bc5f284fd8ff568bbe16c3895b7ac6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00ebse flasim p\u00ebr proxy poolers, ka dy poolers q\u00eb din\u00eb shum\u00eb. Ata nuk jan\u00eb vet\u00ebm poolers. Ata jan\u00eb poolers + funksionalitete t\u00eb tjera fantastike. K\u00ebto jan\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/www.pgpool.net\/\">Pgpool<\/a><\/noindex> dhe <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/crunchy-proxy\">Crunchy-Proxy<\/a><\/noindex>. <\/p>\n<p><\/p>\n<p>Por, fatkeq\u00ebsisht, kjo funksionalitet shtes\u00eb nuk \u00ebsht\u00eb e nevojshme p\u00ebr t\u00eb gjith\u00eb. Dhe ajo \u00e7on n\u00eb at\u00eb q\u00eb poolers mb\u00ebshtesin vet\u00ebm pooling sesionesh, dmth, nj\u00eb klient i ardhsh\u00ebm, nj\u00eb klient n\u00eb dalje n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave. <\/p>\n<p><\/p>\n<p>P\u00ebr ne, kjo nuk i p\u00ebrshtatet shum\u00eb mir\u00eb, prandaj ne p\u00ebrdorim PgBouncer, q\u00eb realizon pooling transaksionesh, dmth, lidhjet server aleatizohen me lidhjet e klient\u00ebve vet\u00ebm p\u00ebr koh\u00ebn e transaksionit. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e5fedbe14656d2ac2cde8d1878a950e2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dhe n\u00eb ngarkes\u00ebn ton\u00eb \u2013 kjo \u00ebsht\u00eb e v\u00ebrtet\u00eb. <strong>Por ka disa probleme<\/strong>.<img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/61fd36cadcd9948d624dafa711777307.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Problemet fillojn\u00eb kur d\u00ebshironi t\u00eb diagnostikoni nj\u00eb seanc\u00eb, sepse t\u00eb gjitha lidhjet e ardhshme jan\u00eb lokale. T\u00eb gjitha erdh\u00ebn nga loopback dhe ndonj\u00eb m\u00ebnyr\u00eb gjurmimi seanc\u00ebs b\u00ebhet e v\u00ebshtir\u00eb. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/36108c4956c410a1b1f286a88bc393d6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sigurisht, mund t\u00eb p\u00ebrdorni application_name_add_host. Ky \u00ebsht\u00eb nj\u00eb m\u00ebnyr\u00eb n\u00eb an\u00ebn e Bouncer p\u00ebr t\u00eb shtuar nj\u00eb IP n\u00eb application_name. Por application_name vendoset me nj\u00eb lidhje t\u00eb n\u00ebntok\u00ebs. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/b4cec483aa776f48db7ad3966c3b78e4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00eb k\u00ebt\u00eb grafik, ku linja e verdh\u00eb paraqet k\u00ebrkesat reale, dhe ku linja blu paraqet k\u00ebrkesat q\u00eb hyjn\u00eb n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave. Dhe kjo diferenc\u00eb \u00ebsht\u00eb pik\u00ebrisht konfigurimi i application_name, i cili \u00ebsht\u00eb i nevojsh\u00ebm vet\u00ebm p\u00ebr gjurmim, por ai nuk \u00ebsht\u00eb krejt\u00ebsisht falas. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c02ea73a6f1a2a4cd6af6c621f321ab4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>P\u00ebr m\u00eb tep\u00ebr, n\u00eb Bouncer nuk mund t\u00eb kufizoni nj\u00eb pool, dmth numrin e lidhjeve me baz\u00ebn e t\u00eb dh\u00ebnave p\u00ebr p\u00ebrdorues t\u00eb caktuar, p\u00ebr nj\u00eb baz\u00eb t\u00eb caktuar. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3431a463e04106066e2799aead66f571.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00eb \u00e7far\u00eb rezultati \u00e7on kjo? Keni nj\u00eb sh\u00ebrbim t\u00eb ngarkuar, t\u00eb shkruar n\u00eb C++, dhe diku pran\u00eb nj\u00eb sh\u00ebrbim t\u00eb vog\u00ebl n\u00eb nod\u00eb, i cili nuk b\u00ebn asgj\u00eb t\u00eb keqe me baz\u00ebn, por drejtori i tij po \u00e7mendet. Ai hap 20,000 lidhje, nd\u00ebrsa \u00e7do gj\u00eb tjet\u00ebr pret. Madje edhe kodi juaj \u00ebsht\u00eb n\u00eb rregull. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/d7fa321714dc017b017945dffcf79bc6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sigurisht, ne kemi shkruar nj\u00eb patch t\u00eb vog\u00ebl p\u00ebr Bouncer, i cili shtoi k\u00ebt\u00eb konfigurim, dmth kufizimin e klient\u00ebve n\u00eb pool. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/d58884fc5ac0f90ff8442f126972157a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kjo do t\u00eb ishte e mundur n\u00eb an\u00ebn e Postgres, dmth rolet n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave t\u00eb kufizohen me numrin e lidhjeve.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8d6ff70db72964ed4eae5eaa47309931.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Por at\u00ebher\u00eb humbni mund\u00ebsin\u00eb p\u00ebr t\u00eb kuptuar pse nuk keni lidhje me serverin. PgBouncer nuk transmeton gabimin e lidhjes, ai gjithmon\u00eb kthen t\u00eb nj\u00ebjt\u00ebn informacion. Dhe nuk mund t\u00eb kuptoni: ndoshta keni ndryshuar fjal\u00ebkalimin, ndoshta thjesht baza ka r\u00ebn\u00eb, ndoshta ka di\u00e7ka q\u00eb nuk shkon. Por nuk ka diagnostikim. N\u00ebse sesioni nuk mund t\u00eb vendoset, nuk do t\u00eb dini pse kjo nuk mund t\u00eb b\u00ebhet. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/cb3048344a94f2953bf403485d28e69f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00eb nj\u00eb moment t\u00eb caktuar shikoni grafik\u00ebt e aplikacionit dhe shihni se aplikacioni nuk po funksionon.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e67c6680bb9a7f41242af9f9e4920916.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Shikoni n\u00eb p\u00ebrqendrim dhe shihni se Bouncer \u00ebsht\u00eb nj\u00ebri-n\u00eb-njeri. Ky \u00ebsht\u00eb nj\u00eb moment p\u00ebrmbys\u00ebs n\u00eb jet\u00ebn e sh\u00ebrbimit. Kuptoni se ishit p\u00ebrgatitur p\u00ebr t\u00eb shkall\u00ebzuar baz\u00ebn e t\u00eb dh\u00ebnave pas nj\u00eb viti e gjysm\u00eb, por ju nevojitet t\u00eb shkall\u00ebzoni pooler. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4c140c4ba6db19cb9939c1148638fb73.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ne arrit\u00ebm n\u00eb p\u00ebrfundimin se na nevojiten m\u00eb shum\u00eb PgBouncer' <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/d369f572a66c16a8917e13393324a644.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/542629\/\">https:\/\/lwn.net\/Articles\/542629\/<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Paksa e p\u00ebrmir\u00ebsuam Bouncer. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/97755489a25ebfe38efd56ff897bd8fa.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dhe b\u00ebm\u00eb q\u00eb t\u00eb mund t\u00eb ngrihen disa Bouncers me rip\u00ebrdorimin e portit TCP. Dhe tashm\u00eb sistemi operativ automatikisht i ndani lidhjet TCP q\u00eb hyjn\u00eb mes tyre me nj\u00eb rund-robin.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/ac30d3f067de2a8cd66ad2325c3a3b58.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kjo \u00ebsht\u00eb transparente p\u00ebr klient\u00ebt, dmth gjith\u00e7ka duket sikur keni nj\u00eb Bouncer, por keni nj\u00eb fragmentim t\u00eb lidhjeve idle mes Bouncer'ave t\u00eb nisur. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/53825f075db00b026c12013a610be456.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dhe n\u00eb nj\u00eb moment t\u00eb caktuar, mund t\u00eb v\u00ebreni se k\u00ebta 3 Bouncers po p\u00ebrdorin secili 100% t\u00eb b\u00ebrtham\u00ebs s\u00eb tij. Ju nevojiten mjaft Bouncers. Pse? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/66c17883a043e157cd7ceab2c2a4e326.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sepse keni TLS. Keni nj\u00eb lidhje t\u00eb enkriptuar. Dhe n\u00ebse benchmarkoni Postgres me TLS dhe pa TLS, do t\u00eb zbuloni se numri i lidhjeve t\u00eb vendosura bie gati me dy renditje me aktivizimin e enkriptimeve, sepse dor\u00ebzimi i TLS konsumon burime t\u00eb procesorit. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6101121ebe136af16e5eb1a484c65d66.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dhe n\u00eb krye mund t\u00eb shihni mjaft shum\u00eb funksione kriptografike q\u00eb kryhen gjat\u00eb val\u00ebs s\u00eb lidhjeve t\u00eb ardhshme. Duke pasur parasysh se primary yn\u00eb mund t\u00eb kaloj\u00eb midis zonave t\u00eb disponueshm\u00ebris\u00eb, vala e lidhjeve t\u00eb ardhshme \u00ebsht\u00eb nj\u00eb situat\u00eb mjaft e zakonshme. Me fjal\u00eb t\u00eb tjera, p\u00ebr nj\u00eb arsye t\u00eb caktuar, primary i vjet\u00ebr nuk ishte i disponuesh\u00ebm, dhe gjith\u00eb ngarkesa u d\u00ebrgua n\u00eb nj\u00eb qend\u00ebr tjet\u00ebr t\u00eb t\u00eb dh\u00ebnave. T\u00eb gjith\u00eb do t\u00eb vijn\u00eb menj\u00ebher\u00eb p\u00ebr t\u00eb p\u00ebrsh\u00ebndetur me TLS. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c238ac2f511568590dc275e01c192c00.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dhe nj\u00eb num\u00ebr i madh i dor\u00ebzimeve TLS mund t\u00eb mos p\u00ebrsh\u00ebndesin m\u00eb Bouncer-in, por ta ngushtojn\u00eb at\u00eb. P\u00ebr shkak t\u00eb koh\u00ebs s\u00eb mbarimit, vala e lidhjeve t\u00eb ardhshme mund t\u00eb b\u00ebhet e pakontrolluar. N\u00ebse keni nj\u00eb ritretry n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave pa exponential backoff, ato nuk do t\u00eb vij\u00eb p\u00ebrs\u00ebri dhe p\u00ebrs\u00ebri si nj\u00eb val\u00eb koherente. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f42d0b210174d4d172254603ae6b834a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ja nj\u00eb shembull i 16 PgBouncer q\u00eb ngarkojn\u00eb 16 b\u00ebrthama n\u00eb 100%.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8d048d3774c09e5b6a3fb3c7bff62084.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kemi arritur n\u00eb PgBouncer t\u00eb kaskad\u00ebs. Kjo \u00ebsht\u00eb konfigurimi m\u00eb i mir\u00eb q\u00eb mund t\u00eb arrihet n\u00eb ngarkes\u00ebn ton\u00eb me Bouncer. Bouncers e jashtme sh\u00ebrbejn\u00eb p\u00ebr dor\u00ebzimin TCP, nd\u00ebrsa Bouncers e brendshme sh\u00ebrbejn\u00eb p\u00ebr pooling real, q\u00eb t\u00eb mos fragmentojn\u00eb shum\u00eb lidhjet e jashtme.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3a4ee4ea46d5fe8479a5a7222ee134da.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00eb nj\u00eb konfigurim t\u00eb till\u00eb, \u00ebsht\u00eb e mundur nj\u00eb restart i qet\u00eb. Mund t\u00eb rinitni gjith\u00eb k\u00ebta 18 Bouncers nj\u00eb nga nj\u00eb. Por mbajtja e nj\u00eb konfigurimi t\u00eb till\u00eb \u00ebsht\u00eb e v\u00ebshtir\u00eb. Administrator\u00ebt e sistemeve, DevOps dhe njer\u00ebzit q\u00eb kan\u00eb v\u00ebrtet p\u00ebrgjegj\u00ebsi p\u00ebr k\u00ebt\u00eb server, nuk do t\u00eb jen\u00eb shum\u00eb t\u00eb k\u00ebnaqur me k\u00ebt\u00eb skem\u00eb. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5291fe67dbe02036f3ff8e98bdd84d1b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Duket se mund t\u00eb promovojm\u00eb t\u00eb gjitha zhvillimet tona n\u00eb open source, por Bouncer-i nuk mb\u00ebshtetet shum\u00eb mir\u00eb. P\u00ebr shembull, mund\u00ebsia p\u00ebr t\u00eb nisur disa PgBouncers n\u00eb nj\u00eb port \u00ebsht\u00eb komituar nj\u00eb muaj m\u00eb par\u00eb. Nd\u00ebrsa pull request p\u00ebr k\u00ebt\u00eb funksion ishte b\u00ebr\u00eb disa vjet m\u00eb par\u00eb. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2059d7f49649d136249103db4aa3ec19.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/libpq-cancel.html\">https:\/\/www.postgresql.org\/docs\/current\/libpq-cancel.html<\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pgbouncer\/pgbouncer\/pull\/79\">https:\/\/github.com\/pgbouncer\/pgbouncer\/pull\/79<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Ose shembuj tjet\u00ebr. N\u00eb Postgres mund t\u00eb anulloni nj\u00eb k\u00ebrkes\u00eb q\u00eb po ekzekutohet, duke d\u00ebrguar nj\u00eb sekret n\u00eb nj\u00eb lidhje tjet\u00ebr pa autentifikim t\u00eb panevojsh\u00ebm. Por disa klient\u00eb thjesht d\u00ebrgojn\u00eb nj\u00eb TCP-reset, pra, p\u00ebrshtasin lidhjen rrjet. \u00c7far\u00eb do t\u00eb b\u00ebj\u00eb Bouncer n\u00eb k\u00ebt\u00eb rast? Ai nuk do t\u00eb b\u00ebj\u00eb asgj\u00eb. Ai do t\u00eb vazhdoj\u00eb t\u00eb ekzekutoj\u00eb k\u00ebrkes\u00ebn. N\u00ebse keni ardhur me nj\u00eb num\u00ebr t\u00eb madh lidhjesh q\u00eb kan\u00eb mbushur baz\u00ebn me k\u00ebrkesa t\u00eb vogla, thjesht t\u00eb shk\u00ebputni lidhjen nga Bouncer nuk do t\u00eb mjaftoj\u00eb, duhet gjithashtu t\u00eb p\u00ebrfundoni ato k\u00ebrkesa q\u00eb po ekzekutohen n\u00eb baz\u00eb. <\/p>\n<p><\/p>\n<p>Ky problem \u00ebsht\u00eb rregulluar dhe ende nuk \u00ebsht\u00eb integruar n\u00eb upstream t\u00eb Bouncer-it. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a9695b6d9e640a5543dc73429eb0050b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>K\u00ebshtu arrit\u00ebm n\u00eb p\u00ebrfundimin se na nevojitet nj\u00eb pooler lidhjesh ton\u00eb, i cili do t\u00eb zhvillohet, rregullohet, ku do t\u00eb jet\u00eb e mundur t\u00eb zgjidhen shpejt problemet dhe q\u00eb, natyrisht, duhet t\u00eb jet\u00eb shum\u00ebprocesor. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e755cd9b06a004f0eced1dc12fd3a6fb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dhe multithreading-u e kemi vendosur si nj\u00eb detyr\u00eb kryesore. Na duhet t\u00eb p\u00ebrballojm\u00eb mir\u00eb val\u00ebn e lidhjeve TLS q\u00eb po vijn\u00eb. <\/p>\n<p><\/p>\n<p>P\u00ebr k\u00ebt\u00eb, na nevojitej t\u00eb zhvillonim nj\u00eb bibliotek\u00eb t\u00eb ve\u00e7ant\u00eb, e cila quhet Machinarium, e cila \u00ebsht\u00eb e destinuar p\u00ebr t\u00eb p\u00ebrshkruar gjendjet e makin\u00ebs s\u00eb lidhjes rrjet si kod t\u00eb radhitur. N\u00ebse shikoni n\u00eb kodin burimor libpq, do t\u00eb shihni thirrje mjaft t\u00eb komplikuara, t\u00eb cilat mund t'ju kthejn\u00eb nj\u00eb rezultat dhe t'ju thon\u00eb: \"M\u00eb thirr pak m\u00eb von\u00eb. Tani kam ende IO, por, kur IO t\u00eb kaloj\u00eb, kam ngarkes\u00eb p\u00ebr procesorin\u201d. Dhe kjo \u00ebsht\u00eb nj\u00eb skem\u00eb me shum\u00eb nivele. Nd\u00ebrveprimi rrjetor zakonisht p\u00ebrshkruhet si nj\u00eb makin\u00eb gjendjesh. Nj\u00eb s\u00ebr\u00eb rregullash t\u00eb til\u00eb si \"N\u00ebse kam marr\u00eb m\u00eb par\u00eb nj\u00eb titull paketi t\u00eb madh\u00ebsis\u00eb N, tani po pres N byte\", \"N\u00ebse kam d\u00ebrguar paket\u00ebn SYNC, tani po pres paket\u00ebn me metadatat e rezultatit\". K\u00ebshtu, kemi kod mjaft t\u00eb komplikuar, si\u00e7 do t\u00eb transformohej nj\u00eb labirint n\u00eb nj\u00eb shtrirje lineare. Ne b\u00ebm\u00eb q\u00eb, n\u00eb vend t\u00eb makine gjendjesh, programuesi t\u00eb p\u00ebrshkruaj\u00eb rrug\u00ebn kryesore t\u00eb nd\u00ebrveprimit si kod t\u00eb zakonsh\u00ebm imperativ. Thjesht, n\u00eb k\u00ebt\u00eb kod imperativ duhet t\u00eb futen vende ku sekuenca e ekzekutimit duhet t\u00eb nd\u00ebrpritet p\u00ebr t\u00eb pritur t\u00eb dh\u00ebna nga rrjeti, duke kaluar kontekstin e ekzekutimit n\u00eb nj\u00eb korutin\u00eb tjet\u00ebr (thread-i i gjelb\u00ebr). Ky qasje \u00ebsht\u00eb e ngjashme me at\u00eb se si regjistrojm\u00eb rrug\u00ebn m\u00eb t\u00eb pritur n\u00eb labirint radhazi dhe pastaj i shtojm\u00eb deg\u00ebzimet e saj. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a6bfb4b11961c7db3a7c7184674e3bc2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Si rezultat, kemi nj\u00eb thread q\u00eb b\u00ebn TCP accept dhe me round-robin i kalon shum\u00eb workers TCP lidhjen. <\/p>\n<p><\/p>\n<p>\u00c7do lidhje klienti punon gjithmon\u00eb n\u00eb nj\u00eb procesor. Kjo e b\u00ebn at\u00eb miq\u00ebsore p\u00ebr cache. <\/p>\n<p><\/p>\n<p>P\u00ebr m\u00eb tep\u00ebr, ne kemi b\u00ebr\u00eb disa p\u00ebrmir\u00ebsime n\u00eb mbledhjen e paketave t\u00eb vogla n\u00eb nj\u00eb paket\u00eb t\u00eb madhe p\u00ebr t\u00eb leht\u00ebsuar ngarkes\u00ebn n\u00eb TCP-stack t\u00eb sistemit.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7d740c23baecdd2f993c83cd54a0a8e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Gjithashtu, ne kemi p\u00ebrmir\u00ebsuar puliin transaksional n\u00eb m\u00ebnyr\u00eb q\u00eb Odyssey me konfigurimin e duhur mund t\u00eb d\u00ebrgoj\u00eb CANCEL dhe ROLLBACK n\u00eb rast t\u00eb nd\u00ebrprerjes s\u00eb lidhjes rrjet, dmth n\u00ebse askush nuk po pret p\u00ebr k\u00ebrkes\u00ebn, Odyssey do t'i thot\u00eb baz\u00ebs t\u00eb mos p\u00ebrpiqet t\u00eb ekzekutoj\u00eb at\u00eb k\u00ebrkes\u00eb q\u00eb mund t\u00eb shpenzoj\u00eb burime t\u00eb \u00e7muara.<\/p>\n<p><\/p>\n<p>Sa m\u00eb shum\u00eb t\u00eb jet\u00eb e mundur, ne ruajm\u00eb lidhjet me t\u00eb nj\u00ebjtin klient. Kjo e lejon q\u00eb t\u00eb mos riinstalohet application_name_add_host. N\u00ebse \u00ebsht\u00eb e mundur, nuk ka riinstalimin shtes\u00eb t\u00eb parametrave t\u00eb nevojsh\u00ebm p\u00ebr diagnostikim. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/afb2fb7fb16d65c9ea73a8978d1eb83c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ne punojm\u00eb n\u00eb interes t\u00eb Yandex.Cloud. Dhe n\u00ebse p\u00ebrdorni PostgreSQL t\u00eb menaxhuar dhe keni instaluar connection pooler, mund t\u00eb krijoni replikim logjik jasht\u00eb, dmth t\u00eb largoheni prej nesh, n\u00eb qoft\u00eb se d\u00ebshirat p\u00ebrmes replikimit logjik. Bouncer nuk do t\u2019i jap\u00eb rrjedh\u00ebn e replikimit logjik jasht\u00eb. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c53defc92ebd8f3bec57ce64d97b9f72.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ky \u00ebsht\u00eb nj\u00eb shembull i konfigurimit t\u00eb replikimit logjik. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a37d9d1abf288d17fa646b642e8b62ab.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Gjithashtu, kemi mb\u00ebshtetje p\u00ebr replikimin fizik jasht\u00eb. N\u00eb Cloud \u00ebsht\u00eb, natyrisht, e pamundur, sepse at\u00ebher\u00eb klasteri do t'ju jap\u00eb shum\u00eb informacion rreth vetes. Por n\u00eb instalimet tuaja, n\u00ebse ju nevojitet replikim fizik p\u00ebrmes connection pooler n\u00eb Odyssey, kjo \u00ebsht\u00eb e mundur. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/572934ce5b08115e57ab4b55d2153c6d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00eb Odyssey ka monitorim plot\u00ebsisht t\u00eb p\u00ebrshtatsh\u00ebm me PgBouncer. Ne kemi t\u00eb nj\u00ebjt\u00ebn konsol\u00eb q\u00eb ekzekuton pothuajse t\u00eb nj\u00ebjtat komanda. N\u00ebse ndokush ka ndonj\u00eb nevoj\u00eb q\u00eb mungon, d\u00ebrgoni nj\u00eb pull request, ose t\u00eb pakt\u00ebn nj\u00eb issue n\u00eb GitHub, ne do ta p\u00ebrfundojm\u00eb komandon e nevojshme. Por funksionaliteti kryesor i konsol\u00ebs PgBouncer tashm\u00eb \u00ebsht\u00eb i pranish\u00ebm. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/451dd798fb3523a7a174ebfe00a14bc5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dhe sigurisht, kemi forwarding t\u00eb gabimeve. Ne do t\u00eb kthejm\u00eb at\u00eb gabim q\u00eb raportoi baza. Do t\u00eb merrni informacion p\u00ebrse nuk po hyni n\u00eb baz\u00eb, e jo vet\u00ebm se nuk po hyni. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/14b4cb0efa33a2658dfc528349a5382f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kjo mund\u00ebsi mund t\u00eb \u00e7aktivizohet n\u00eb rast se keni nevoj\u00eb p\u00ebr 100%-t\u00eb p\u00ebrputhshm\u00ebri me PgBouncer. Mund t\u00eb veprojm\u00eb si Bouncer, thjesht p\u00ebr \u00e7do rast. <\/p>\n<p><\/p>\n<p><strong>Zhvillimi<\/strong><\/p>\n<p><\/p>\n<p>Disa fjal\u00eb p\u00ebr kodin burimor t\u00eb Odyssey. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6055d5ec9676c331a83592916a6a292f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex\/odyssey\/pull\/66\">https:\/\/github.com\/yandex\/odyssey\/pull\/66<\/a><\/noindex><\/p>\n<p><\/p>\n<p>P\u00ebr shembull, ka komandat \u00abPause \/ Resume\u00bb. Ato zakonisht p\u00ebrdoren p\u00ebr t\u00eb p\u00ebrdit\u00ebsuar baz\u00ebn e t\u00eb dh\u00ebnave. N\u00ebse ju nevojitet t\u00eb p\u00ebrdit\u00ebsoni Postgres, mund ta vendosni at\u00eb n\u00eb pauz\u00eb n\u00eb connection pooler, t\u00eb b\u00ebni pg_upgrade dhe pastaj t\u00eb b\u00ebni resume. Dhe nga ana e klientit do t\u00eb duket si t\u00eb kishte ndaluar baza. K\u00ebt\u00eb funksionalitet na e soll\u00ebn njer\u00ebzit nga komuniteti. Akoma nuk \u00ebsht\u00eb marr\u00eb me merge, por shpejt do t\u00eb jet\u00eb. (Ndiqeni me merge)<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/d2f7c57e0ae3e466ec2a701bbdb8eb3f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex\/odyssey\/pull\/73\">https:\/\/github.com\/yandex\/odyssey\/pull\/73<\/a><\/noindex> \u2014 tashm\u00eb \u00ebsht\u00eb marr\u00eb me merge<\/p>\n<p><\/p>\n<p>P\u00ebr m\u00eb tep\u00ebr, nj\u00eb nga ve\u00e7orit\u00eb e reja n\u00eb PgBouncer \u00ebsht\u00eb mb\u00ebshtetja p\u00ebr SCRAM Authentication, q\u00eb na e solli gjithashtu nj\u00eb person q\u00eb nuk punon n\u00eb Yandex.Cloud. T\u00eb dyja - \u00ebsht\u00eb funksionalitet kompleks dhe i r\u00ebnd\u00ebsish\u00ebm. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f39346a543c88d17728233d05c2dff19.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Prandaj dua t\u00eb flas p\u00ebr at\u00eb nga \u00e7far\u00eb \u00ebsht\u00eb nd\u00ebrtuar Odyssey, ndoshta ju gjithashtu d\u00ebshironi tani t\u00eb shkruani pak kod. <\/p>\n<p><\/p>\n<p>Ju keni baz\u00ebn origjinale Odyssey, e cila mb\u00ebshtetet n\u00eb dy biblioteka kryesore. Biblioteka Kiwi - \u00ebsht\u00eb realizimi i protokollit t\u00eb mesazheve t\u00eb Postgres. Pra, protokolli natyror 3 i Postgres \u00ebsht\u00eb mesazhet standarde, me t\u00eb cilat frontend\u00ebt dhe backend\u00ebt mund t\u00eb shk\u00ebmbejn\u00eb. Ato jan\u00eb realizuar n\u00eb biblioteken Kiwi.<\/p>\n<p><\/p>\n<p>Biblioteka Machinarium - \u00ebsht\u00eb biblioteka e realizimit t\u00eb rrjedhave. Nj\u00eb fragment i vog\u00ebl i k\u00ebtij Machinarium \u00ebsht\u00eb shkruar n\u00eb assembler. Por, mos u friksoni, aty ka vet\u00ebm 15 rreshta. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/cd18f250af50eabd53536b2c0d7f12b5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Arkitektura e Odyssey. Ka nj\u00eb makin\u00eb kryesore, n\u00eb t\u00eb cil\u00ebn jan\u00eb t\u00eb lan\u00e7uar coroutines. N\u00eb k\u00ebt\u00eb makin\u00eb realizohet accept i lidhjeve TCP q\u00eb vijn\u00eb dhe shp\u00ebrndarja n\u00eb workers. <\/p>\n<p><\/p>\n<p>Brenda nj\u00eb worker-i mund t\u00eb punoj\u00eb nj\u00eb trajtues p\u00ebr disa klient\u00eb. Po ashtu, n\u00eb rrjedh\u00ebn kryesore rrotullohen konsola dhe p\u00ebrpunimi i detyrave crone p\u00ebr t\u00eb hequr lidhjet q\u00eb nuk jan\u00eb m\u00eb t\u00eb nevojshme n\u00eb pool.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7072fb20f406f2ee5788542860ccdf50.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>P\u00ebr testimin e Odyssey p\u00ebrdoret seti standard i testeve t\u00eb Postgres. Thjesht aktivizojm\u00eb install-check p\u00ebrmes Bouncer dhe p\u00ebrmes Odyssey, marrim nj\u00eb div zero. Ka disa teste, t\u00eb lidhura me formatimin e datave, q\u00eb nuk kalojn\u00eb krejt\u00ebsisht nj\u00ebsoj n\u00eb Bouncer dhe n\u00eb Odyssey.<\/p>\n<p><\/p>\n<p>P\u00ebr m\u00eb tep\u00ebr, ka shum\u00eb driver-a, q\u00eb kan\u00eb testimin e tyre. Dhe testet e tyre i p\u00ebrdorim p\u00ebr testimin e Odyssey.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/fb01cc9a0e9724ddcd3cc3d088afb182.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>P\u00ebr m\u00eb tep\u00ebr, p\u00ebr shkak t\u00eb konfiguracioneve tona kaskad\u00eb na duhet t\u00eb testojm\u00eb lidhje t\u00eb ndryshme: Postgres + Odyssey, PgBouncer + Odyssey, Odyssey + Odyssey, p\u00ebr t\u00eb qen\u00eb t\u00eb sigurt q\u00eb, n\u00ebse Odyssey ndodhet n\u00eb ndonj\u00eb nga pjes\u00ebt n\u00eb kaskad\u00eb, ai gjithashtu funksionon si\u00e7 e presim. <\/p>\n<p><\/p>\n<p><strong>Grab<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/25855b691180bca083025b9e8b611c09.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ne p\u00ebrdorim Odyssey n\u00eb prodhim. Nuk do t\u00eb ishte e drejt\u00eb t\u00eb thoja se gjith\u00e7ka funksionon thjesht. Jo, pra, po, por jo gjithmon\u00eb. P\u00ebr shembull, n\u00eb prodhim gjith\u00e7ka punoi thjesht, pastaj erdh\u00ebn miqt\u00eb tan\u00eb nga PostgreSQL Professional dhe than\u00eb se kishim nj\u00eb memory leak. Ata me t\u00eb v\u00ebrtet\u00eb kishin t\u00eb drejt\u00eb, e rregulluam k\u00ebt\u00eb. Por ishte thjesht at\u00ebher\u00eb. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e638d88397b32b1ca0b74c9c1b905f81.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pastaj zbuluam se n\u00eb connection pooler ka lidhje TLS q\u00eb hyjn\u00eb dhe lidhje TLS q\u00eb dalin. Dhe p\u00ebr k\u00ebto lidhje k\u00ebrkohen certifikata klienti dhe certifikata serveri.<\/p>\n<p><\/p>\n<p>Certifikatat serveri Bouncer dhe Odyssey i rishikojn\u00eb ato pcache, por certifikatat e klientit nuk kan\u00eb nevoj\u00eb t\u00eb rishikohen nga pcache sepse Odyssey yn\u00eb i shkall\u00ebzuar n\u00eb fund t\u00eb fundit p\u00ebrballet me performanc\u00ebn sistemike t\u00eb leximit t\u00eb k\u00ebsaj certifikate. Kjo p\u00ebr ne ishte nj\u00eb befasi, sepse e kishte nj\u00eb problem shum\u00eb von\u00eb. Fillimisht, ai ishte duke u shkall\u00ebzuar linear, por pas 20,000 lidhjeve t\u00eb pranuara nj\u00ebkoh\u00ebsisht, ky problem doli n\u00eb pah.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6cff094cd59a990e448b82fa0b1572b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Metoda e Autorizimit t\u00eb Lejuar \u2013 \u00ebsht\u00eb mund\u00ebsia q\u00eb t\u00eb autentifikohesh me mjetet e integruara t\u00eb linux. N\u00eb PgBouncer kjo realizohet n\u00eb m\u00ebnyr\u00eb q\u00eb ka nj\u00eb rrjedh t\u00eb ve\u00e7ant\u00eb p\u00ebr t\u00eb pritur p\u00ebrgjigjen nga PAM dhe ka rrjedh\u00ebn kryesore PgBouncer, e cila sh\u00ebrben lidhjen aktuale dhe mund t'i k\u00ebrkoj\u00eb q\u00eb t\u00eb presin n\u00eb rrjedh\u00ebn PAM. <\/p>\n<p><\/p>\n<p>Ne nuk e realizuam k\u00ebt\u00eb p\u00ebr nj\u00eb arsye t\u00eb thjesht\u00eb. Ne kemi shum\u00eb rrjedha. Pse na duhet kjo?<\/p>\n<p><\/p>\n<p>Si rezultat, kjo mund t\u00eb krijoj\u00eb probleme me at\u00eb q\u00eb, n\u00ebse keni autentifikimin PAM dhe jo PAM, nj\u00eb val\u00eb e madhe e autentifikimit PAM mund t\u00eb vonoj\u00eb ndjesh\u00ebm autentifikimin jo PAM. Kjo \u00ebsht\u00eb nj\u00eb nga ato gj\u00ebra q\u00eb ne nuk e rregulluam. Por n\u00ebse d\u00ebshironi ta rregulloni, mund t\u00eb merret me k\u00ebt\u00eb. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c7bd9e9980ff7298b30a59c130f03dbb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nj\u00eb tjet\u00ebr problem ishte se kemi nj\u00eb rrjedh q\u00eb pranon t\u00eb gjitha lidhjet e pranuara. Dhe pastaj i kalon n\u00eb pool-in e pun\u00ebtor\u00ebve, ku do t\u00eb ndodhi TLS handshake.<\/p>\n<p><\/p>\n<p>Si rezultat, n\u00ebse keni nj\u00eb val\u00eb koherente prej 20,000 lidhjesh rrjet, ato t\u00eb gjitha do t\u00eb priten. Dhe n\u00eb an\u00ebn e klientit libpq do t\u00eb filloj\u00eb num\u00ebrimin e timeout-eve. N\u00eb parazgjedhje duket se aty jan\u00eb 3 sekonda. <\/p>\n<p><\/p>\n<p>N\u00ebse ato t\u00eb gjitha nuk mund t\u00eb hyjn\u00eb n\u00eb baz\u00eb nj\u00ebkoh\u00ebsisht, at\u00ebher\u00eb ata nuk mund t\u00eb hyjn\u00eb n\u00eb baz\u00eb, sepse gjith\u00eb kjo mund t\u00eb mbulohet me nj\u00eb retry jo eksponencial. <\/p>\n<p><\/p>\n<p>Ne arrit\u00ebm n\u00eb p\u00ebrfundimin se kopjuam k\u00ebtu skem\u00ebn nga PgBouncer me at\u00eb q\u00eb kemi mbrojtjen e numrit t\u00eb lidhjeve TCP, t\u00eb cilat ne i pranojm\u00eb. <\/p>\n<p><\/p>\n<p>N\u00ebse ne shohim se po pranojm\u00eb lidhjet, por ato nuk arrijn\u00eb t\u00eb kryejn\u00eb handshake-in, i vendosim n\u00eb radh\u00eb q\u00eb t\u00eb mos shpenzojn\u00eb burimet e procesorit qendror. Kjo sjell q\u00eb handshake-i n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb mund t\u00eb realizohet vet\u00ebm p\u00ebr disa lidhje q\u00eb kan\u00eb ardhur. Por t\u00eb pakt\u00ebn dikush do t\u00eb hyj\u00eb n\u00eb baz\u00eb, edhe n\u00ebse ngarkesa \u00ebsht\u00eb mjaft e madhe.<\/p>\n<p><\/p>\n<p><strong>Plani i Veprimit<\/strong><\/p>\n<p><\/p>\n<p>\u00c7far\u00eb do t\u00eb doja t\u00eb shihja n\u00eb t\u00eb ardhmen n\u00eb Odyssey? \u00c7far\u00eb jemi t\u00eb gatsh\u00ebm t\u00eb zhvillojm\u00eb vet\u00eb dhe \u00e7far\u00eb presim nga komuniteti?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4719437d80b33efc3da6572af9a4dedb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>N\u00eb gusht 2019.<\/strong><\/p>\n<p><\/p>\n<p>K\u00ebtu \u00ebsht\u00eb si dukej plani i veprimit t\u00eb Odyssey n\u00eb gusht:<\/p>\n<p><\/p>\n<ul>\n<li>Ne do t\u00eb donim autentikimin SCRAM dhe PAM.<\/li>\n<li>Do t\u00eb doja t\u00eb lexoja pyetje p\u00ebrpara n\u00eb varg. <\/li>\n<li>Do t\u00eb d\u00ebshironim nj\u00eb rindizje online. <\/li>\n<li>Dhe mund\u00ebsin\u00eb p\u00ebr t\u00eb b\u00ebr\u00eb nj\u00eb pauz\u00eb n\u00eb server. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/455c92f92df826257c2c57dc2b034e22.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Gjasht\u00ebdhjet\u00eb p\u00ebr qind e k\u00ebtij plani jan\u00eb realizuar, madje jo nga ne. Dhe kjo \u00ebsht\u00eb shum\u00eb mir\u00eb. Pra, le t\u00eb diskutojm\u00eb p\u00ebr at\u00eb q\u00eb ka mbetur dhe t\u00eb shtojm\u00eb m\u00eb shum\u00eb. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4a1daafbfe8d65ba0dd3e1ebdae8dd94.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex\/odyssey\/issues\/12\">Sa i p\u00ebrket pyetjeve t\u00eb leximit p\u00ebrpara n\u00eb varg<\/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: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0873cffd4f1ae15d9ffa6d080671051b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00eb thelb, n\u00eb Postgres, duke filluar nga versioni 10, ka mund\u00ebsi q\u00eb gjat\u00eb lidhjes t\u00eb specifikoni gjithashtu session_attrs. N\u00eb lidhje mund t\u00eb listoni t\u00eb gjith\u00eb hostet e baz\u00ebs s\u00eb t\u00eb dh\u00ebnave dhe t\u00eb thoni se p\u00ebrse po hyni n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave: p\u00ebr t\u00eb shkruar ose vet\u00ebm p\u00ebr t\u00eb lexuar. Dhe drejtuesi do t\u00eb zgjedh\u00eb vet\u00eb hostin e par\u00eb n\u00eb list\u00eb q\u00eb e p\u00eblqen m\u00eb shum\u00eb, q\u00eb p\u00ebrmbush k\u00ebrkesat e session_attrs. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0693d1327fe5826502a01c21d05d5b4c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Por problemi i k\u00ebtij qasje \u00ebsht\u00eb se nuk kontrollon vones\u00ebn e replikimit. Mund t\u00eb keni nj\u00eb replik\u00eb q\u00eb \u00ebsht\u00eb vonuar p\u00ebr nj\u00eb periudh\u00eb t\u00eb papranueshme p\u00ebr sh\u00ebrbimin tuaj. P\u00ebr t\u00eb realizuar ekzekutimin e plot\u00eb t\u00eb k\u00ebrkesave t\u00eb leximit n\u00eb replik\u00eb, n\u00eb thelb, na nevojitet t\u00eb mb\u00ebshtesim n\u00eb Odyssey mund\u00ebsin\u00eb p\u00ebr t\u00eb mos funksionuar kur nuk mund t\u00eb lexojm\u00eb. <\/p>\n<p><\/p>\n<p>Odyssey duhet t\u00eb hyj\u00eb her\u00eb pas here n\u00eb baz\u00eb dhe t\u00eb pyes\u00eb p\u00ebr distanc\u00ebn e replikimit nga primari. Dhe n\u00ebse ka arritur nj\u00eb vler\u00eb kufitare, t\u00eb mos lejoj\u00eb k\u00ebrkesat e reja n\u00eb baz\u00eb, t\u00eb informoj\u00eb klientin q\u00eb duhet t\u00eb nisin p\u00ebrs\u00ebri lidhjet dhe ndoshta t\u00eb zgjedhin nj\u00eb host tjet\u00ebr p\u00ebr ekzekutimin e k\u00ebrkesave. Kjo do t\u00eb lejoj\u00eb baz\u00ebn q\u00eb t\u00eb rikuperoj\u00eb m\u00eb shpejt vones\u00ebn e replikimit dhe t\u00eb kthehet p\u00ebr t'u p\u00ebrgjigjur k\u00ebrkesave. <\/p>\n<p><\/p>\n<p>Afati i realizimit \u00ebsht\u00eb i v\u00ebshtir\u00eb t\u00eb thuhet, sepse \u00ebsht\u00eb open source. Por, shpresoj se nuk do t\u00eb zgjas\u00eb 2.5 vjet si koleg\u00ebt e PgBouncer. K\u00ebt\u00eb funksion do t\u00eb doja ta shihja n\u00eb Odyssey. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4ec3cd2ff7b2298927cccfe8e0ba890a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex\/odyssey\/issues\/16\">N\u00eb komunitet, njer\u00ebzit kan\u00eb pyetur p\u00ebr mb\u00ebshtetje p\u00ebr deklaratat e p\u00ebrgatitura.<\/a><\/noindex>Tani tani mund t\u00eb krijoni nj\u00eb prepared statement n\u00eb dy m\u00ebnyra. S\u00eb pari, mund t\u00eb ekzekutoni komand\u00ebn SQL, q\u00eb \u00ebsht\u00eb \"prepared\". P\u00ebr t\u00eb kuptuar k\u00ebt\u00eb komand\u00eb SQL, duhet t\u00eb m\u00ebsojm\u00eb t\u00eb kuptojm\u00eb SQL nga ana e Bouncer. Do t\u00eb ishte nj\u00eb overkill, sepse na nevojitet plot\u00ebsisht nj\u00eb parser. Nuk mund t\u00eb analizojm\u00eb \u00e7do komand\u00eb SQL. <\/p>\n<p><\/p>\n<p>Por ka nj\u00eb prepared statement n\u00eb nivelin e protokollit t\u00eb mesazheve n\u00eb proto3. Dhe kjo \u00ebsht\u00eb ajo vend ku informacioni p\u00ebr krijimin e prepared statement vjen n\u00eb nj\u00eb form\u00eb t\u00eb strukturuar. Ne mund ta mb\u00ebshtesim kuptimin se n\u00eb nj\u00eb lidhje serveri klienti k\u00ebrkoi t\u00eb krijoj\u00eb prepared statements. Dhe edhe n\u00ebse transaksioni p\u00ebrfundoi, na duhet ende t\u00eb mbajm\u00eb lidhshm\u00ebrin\u00eb midis serverit dhe klientit. <\/p>\n<p><\/p>\n<p>Por k\u00ebtu ndodhet nj\u00eb mosmarr\u00ebveshje n\u00eb dialog, sepse dikush po flet p\u00ebr nevoj\u00ebn p\u00ebr t\u00eb kuptuar se cili sakt\u00ebsisht prepared statements ka krijuar klienti dhe p\u00ebr t\u00eb ndar\u00eb lidhjen e serverit midis t\u00eb gjitha kli\u00ebnteve q\u00eb krijuan k\u00ebt\u00eb lidhje serveri, pra ata q\u00eb krijuan nj\u00eb prepared statement t\u00eb till\u00eb. <\/p>\n<p><\/p>\n<p>Andres Freund tha se n\u00ebse ju vjen nj\u00eb klient q\u00eb tashm\u00eb ka krijuar nj\u00eb prepared statement n\u00eb nj\u00eb lidhje tjet\u00ebr serveri, at\u00ebher\u00eb krijoni at\u00eb p\u00ebr t\u00eb. Por duket se \u00ebsht\u00eb pak e gabuar t\u00eb ekzekutoni k\u00ebrkesat n\u00eb baz\u00eb n\u00eb vend t\u00eb klientit, por nga k\u00ebndv\u00ebshtrimi i zhvilluesit q\u00eb shkruan protokollin e nd\u00ebrveprimit me baz\u00ebn, do t\u00eb ishte e p\u00ebrshtatshme, n\u00ebse thjesht do t'i jepnin nj\u00eb lidhje rrjeti, n\u00eb t\u00eb cil\u00ebn ka nj\u00eb k\u00ebrkes\u00eb t\u00eb till\u00eb t\u00eb p\u00ebrgatitur. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/cd56b3ad015195d86a64e52be365b16a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dhe nj\u00eb ve\u00e7ori tjet\u00ebr q\u00eb duhet t\u00eb implementojm\u00eb. Tani kemi monitorim, t\u00eb p\u00ebrputhsh\u00ebm me PgBouncer. Mund t\u00eb kthejm\u00eb koh\u00ebn mesatare t\u00eb ekzekutimit t\u00eb k\u00ebrkes\u00ebs. Por koha mesatare \u00ebsht\u00eb temperatura mesatare n\u00eb spital: dikush \u00ebsht\u00eb i ftoht\u00eb, ndokush \u00ebsht\u00eb i ngroht\u00eb - n\u00eb mesatare t\u00eb gjith\u00eb jan\u00eb t\u00eb sh\u00ebndetsh\u00ebm. Kjo nuk \u00ebsht\u00eb e v\u00ebrtet\u00eb. <\/p>\n<p><\/p>\n<p>Na duhet t\u00eb realizojm\u00eb mb\u00ebshtetje p\u00ebr percentiles q\u00eb do t\u00eb tregonin se ka k\u00ebrkesa t\u00eb ngadalta q\u00eb konsumojn\u00eb burime dhe do ta b\u00ebnin monitorimin m\u00eb t\u00eb pranuesh\u00ebm. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6f285f3eb0d79e7f25d42f0e792b85b1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>M\u00eb e r\u00ebnd\u00ebsishmja \u2013 dua versionin 1.0 (Versioni 1.1 tashm\u00eb ka dal\u00eb). \u00c7\u00ebshtja \u00ebsht\u00eb se tani Odyssey ndodhet n\u00eb versionin 1.0rc, pra release candidate. Dhe t\u00eb gjith\u00eb problemet q\u00eb p\u00ebrmenda ishin zgjidhur pik\u00ebrisht me at\u00eb version, p\u00ebrve\u00e7 memory leak. <\/p>\n<p><\/p>\n<p>\u00c7far\u00eb do t\u00eb thot\u00eb p\u00ebr ne versioni 1.0? Ne po nxjerrim Odyssey n\u00eb bazat tona. Ai tashm\u00eb funksionon n\u00eb bazat tona, por kur t\u00eb arrij\u00eb n\u00eb pik\u00ebn e 1,000,000 k\u00ebrkesave n\u00eb sekond\u00eb, mund t\u00eb themi se kjo \u00ebsht\u00eb versioni i l\u00ebshuar dhe mund t\u00eb quhet 1.0. <\/p>\n<p><\/p>\n<p>N\u00eb komunitet disa njer\u00ebz k\u00ebrkuan q\u00eb n\u00eb versionin 1.0 t\u00eb ishin gjithashtu pauza dhe SCRAM. Por kjo do t\u00eb thot\u00eb se do t\u00eb na duhet t\u00eb nxjerrim n\u00eb prodhim versionin e ardhsh\u00ebm, sepse as SCRAM dhe as pauza nuk jan\u00eb fqinj n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb. Megjithat\u00eb, shum\u00eb p\u00ebr s\u00eb shumti, ky problem do t\u00eb zgjidhet mjaft shpejt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Odyssey roadmap: \u00e7far\u00eb tjet\u00ebr duam nga connection pooler. Andrey Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2f50de9f51f653a7396965239bd545e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Po pres k\u00ebrkesat tuaja. Dhe do t\u00eb doja gjithashtu t\u00eb d\u00ebgjoja se cilat probleme keni me Bouncer. Le t\u00eb diskutojm\u00eb p\u00ebr to. Ndoshta mund t\u00eb realizojm\u00eb disa funksione q\u00eb ju nevojiten. <\/p>\n<p><\/p>\n<p>Me k\u00ebt\u00eb p\u00ebrfundoj pjes\u00ebn time, do doja t\u00eb d\u00ebgjoja ju. Faleminderit!<\/p>\n<p><\/p>\n<p>Pyetje<\/p>\n<p><\/p>\n<p><em>N\u00ebse vendos application_name tim, a do t\u00eb kaloj\u00eb si\u00e7 duhet, p\u00ebrfshir\u00eb n\u00eb pool-in e transaksioneve n\u00eb Odyssey?<\/em><\/p>\n<p><\/p>\n<p>N\u00eb Odyssey apo n\u00eb Bouncer?<\/p>\n<p><\/p>\n<p><em>N\u00eb Odyssey. N\u00eb Bouncer kalon.<\/em> <\/p>\n<p><\/p>\n<p>Ne do t\u00eb b\u00ebjm\u00eb set-in. <\/p>\n<p><\/p>\n<p><em>Dhe n\u00ebse lidhja ime e v\u00ebrtet\u00eb do t\u00eb kaloj\u00eb n\u00eb lidhje t\u00eb tjera, a do t\u00eb transferohet?<\/em><\/p>\n<p><\/p>\n<p>Ne do t\u00eb b\u00ebjm\u00eb nj\u00eb set t\u00eb t\u00eb gjitha parametrave t\u00eb renditur n\u00eb list\u00eb. Nuk mund t\u00eb them n\u00ebse n\u00eb k\u00ebt\u00eb list\u00eb ka application_name. M\u00eb duket se e kam par\u00eb atje. Ne do t\u00eb vendosim t\u00eb nj\u00ebjt\u00ebt parametra. Me nj\u00eb k\u00ebrkes\u00eb atje set do t\u00eb b\u00ebj\u00eb gjith\u00e7ka q\u00eb \u00ebsht\u00eb vendosur nga klienti gjat\u00eb fillimit. <\/p>\n<p><\/p>\n<p><em>Faleminderit, Andrei, p\u00ebr raportin! Raport i mir\u00eb! G\u00ebzohem q\u00eb Odyssey po zhvillohet gjithnj\u00eb e m\u00eb shpejt \u00e7do minut\u00eb. Uroj q\u00eb t\u00eb vazhdoni k\u00ebshtu. Ne tashm\u00eb ju kemi k\u00ebrkuar t\u00eb keni lidhje multi data-source, n\u00eb m\u00ebnyr\u00eb q\u00eb Odyssey t\u00eb mund t\u00eb lidhet nj\u00ebkoh\u00ebsisht n\u00eb baza t\u00eb ndryshme t\u00eb dh\u00ebnash, dmth. master slave, dhe pastaj automatikisht pas nj\u00eb faillover t\u00eb lidhet me nj\u00eb master t\u00eb ri.<\/em> <\/p>\n<p><\/p>\n<p>Po, m\u00eb duket se e mbaj mend k\u00ebt\u00eb diskutim. Aktualisht ka disa storage. Por nuk ka kalim mes tyre. Ne duhet t\u00eb shqyrtojm\u00eb serverin n\u00eb an\u00ebn ton\u00eb, q\u00eb ai t\u00eb jet\u00eb ende n\u00eb jet\u00eb dhe t\u00eb kuptojm\u00eb se ka ndodhur nj\u00eb faillover, kush do ta th\u00ebrras\u00eb pg_recovery. Kam nj\u00eb m\u00ebnyr\u00eb standarde p\u00ebr t\u00eb kuptuar q\u00eb nuk jemi n\u00eb master. Dhe ne duhet ta kuptojm\u00eb ndonj\u00ebher\u00eb nga gabimet ose si? Pra, ideja \u00ebsht\u00eb interesante, ajo \u00ebsht\u00eb duke u diskutuar. Shkruani m\u00eb shum\u00eb komente. N\u00ebse keni duar t\u00eb pun\u00ebs q\u00eb din\u00eb C, at\u00ebher\u00eb \u00ebsht\u00eb fantastike. <\/p>\n<p><\/p>\n<p>Ne pyetje p\u00ebr skalimin me replikat na intereson gjithashtu, sepse d\u00ebshirojm\u00eb ta b\u00ebjm\u00eb pranimin e klastereve t\u00eb replikuar sa m\u00eb t\u00eb leht\u00eb p\u00ebr zhvilluesit e aplikacioneve. Por k\u00ebtu do t\u00eb donim m\u00eb shum\u00eb komente, dometh\u00ebn\u00eb si t\u00eb b\u00ebjm\u00eb sakt\u00ebsisht, si t\u00eb b\u00ebjm\u00eb mir\u00eb. <\/p>\n<p><\/p>\n<p><em>P\u00ebrs\u00ebri, kjo \u00ebsht\u00eb nj\u00eb pyetje p\u00ebr replikat. Pra, keni nj\u00eb master dhe disa replika. Dhe \u00ebsht\u00eb e qart\u00eb se n\u00eb nj\u00eb replik\u00eb vini m\u00eb rrall\u00eb se n\u00eb master p\u00ebr lidhjet, sepse ato mund t\u00eb ken\u00eb dallime. Ju keni th\u00ebn\u00eb se dallimi n\u00eb t\u00eb dh\u00ebna mund t\u00eb jet\u00eb i till\u00eb, sa nuk do t\u00eb plot\u00ebsoj\u00eb biznesin tuaj dhe nuk do t\u00eb shkoni atje derisa t\u00eb ri-replikohet. N\u00ebse pas nj\u00eb kohe t\u00eb gjat\u00eb, filloni t\u00eb shkoni atje, t\u00eb dh\u00ebnat q\u00eb ju nevojiten nuk do t\u00eb jen\u00eb menj\u00ebher\u00eb t\u00eb disponueshme. Pra, n\u00ebse vazhdimisht shkojm\u00eb n\u00eb master, aty cache \u00ebsht\u00eb ngrohur, nd\u00ebrsa n\u00eb replik\u00eb cache \u00ebsht\u00eb pak prapa.<\/em> <\/p>\n<p><\/p>\n<p>Po, \u00ebsht\u00eb e v\u00ebrtet\u00eb. N\u00eb pcache nuk do t\u00eb ket\u00eb blloqe t\u00eb dh\u00ebnash q\u00eb ju d\u00ebshironi, n\u00eb real cache nuk do t\u00eb ket\u00eb informacion rreth tabelave q\u00eb ju d\u00ebshironi, n\u00eb planet nuk do t\u00eb ket\u00eb k\u00ebrkesa t\u00eb parseruara, n\u00eb p\u00ebrgjith\u00ebsi nuk do t\u00eb ket\u00eb asgj\u00eb. <\/p>\n<p><\/p>\n<p><em>Dhe kur keni nj\u00eb klaster dhe shtoni nj\u00eb replik\u00eb t\u00eb re, p\u00ebrderisa ajo starton, gjith\u00e7ka \u00ebsht\u00eb keq, dometh\u00ebn\u00eb ajo po ngre cache-in e saj.<\/em> <\/p>\n<p><\/p>\n<p>E kuptova iden\u00eb. Qasja e duhur do t\u00eb ishte t\u00eb filloni nj\u00eb p\u00ebrqindje t\u00eb vog\u00ebl t\u00eb k\u00ebrkesave fillimisht n\u00eb replik\u00eb, t\u00eb cilat do t\u00eb ngrohin cache-in. Thjesht, kemi nj\u00eb kusht q\u00eb duhet t\u00eb jemi m\u00eb shum\u00eb se 10 sekonda prapa masterit. Dhe ky kusht t\u00eb aktivizohet jo me nj\u00eb val\u00eb, por gradualisht p\u00ebr disa klient\u00eb. <\/p>\n<p><\/p>\n<p><em>Po, rritni pesh\u00ebn.<\/em><\/p>\n<p><\/p>\n<p>Kjo \u00ebsht\u00eb nj\u00eb ide e mir\u00eb. Por fillimisht duhet t\u00eb implementojm\u00eb k\u00ebt\u00eb \u00e7aktivizim. Fillimisht duhet t\u00eb fikemi, pastaj do t\u00eb mendojm\u00eb se si t\u00eb ndizemi. Kjo \u00ebsht\u00eb nj\u00eb karakteristik\u00eb e shk\u00eblqyer p\u00ebr t\u00eb u ngjitur gradualisht.<\/p>\n<p><\/p>\n<p><em>N\u00eb nginx ekziston nj\u00eb opsion t\u00eb till\u00eb <code>fillimisht ngadal\u00eb nis<\/code> n\u00eb klasterin p\u00ebr serverin. Dhe ai gradualisht ndihmon n\u00eb rritjen e ngarkes\u00ebs.<\/em> <\/p>\n<p><\/p>\n<p>Po, nj\u00eb ide e shk\u00eblqyer, do ta provojm\u00eb kur t\u00eb arrijm\u00eb aty.<\/p>\n<p>Burimi: <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.2 - 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\/sq\/blog\/administrirovanie\/odyssey-roadmap-chto-eshhyo-my-hotim-ot-pulera-soedinenij-andrej-borodin-2019\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\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\/sq\/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: \u00e7far\u00eb tjet\u00ebr d\u00ebshirojm\u00eb nga pool-i i lidhjeve. Andrei Borodin (2019) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/sq\/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":"sq_AL","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\/sq\/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\/sq\/wp-json\/wp\/v2\/posts\/96515","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=96515"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/96515\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/96516"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=96515"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=96515"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=96515"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}