Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Ve zprávě Andrey Borodin ukáže, jak vzali v úvahu zkušenosti s měřítkem PgBouncer při návrhu connection pooler. Odyssea, jak byl nasazen do produkčního prostředí. Dále prodiskutujeme, jaké funkce by connection pooler měl mít v nových verzích: pro nás je důležité nejen uspokojit naše potřeby, ale také rozvíjet komunitu uživatelů. Odyssea.

Video:

Přehrát video

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Ahoj všichni! Jmenuji se Andrej.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

V Yandexu se věnuji vývoji open source databází. A dnes máme téma o connection pooler.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Pokud víte, jak nazvat connection pooler česky, dejte mi vědět. Velmi rád bych našel dobrý technický termín, který se ustálí v technické literatuře.

Téma je poměrně složité, protože v mnoha databázích je connection pooler vestavěný a není vůbec třeba o něm vědět. Určitá nastavení samozřejmě existují, ale v Postgresu to tak nefunguje. Paralelně (na HighLoad++ 2019) běží prezentace Nikolaje Samokhvalova o nastavení dotazů v Postgresu. A já chápu, že sem přišli lidé, kteří už dotazy nastavili ideálně, a to jsou lidé, kteří čelí vzácnějším systémovým problémům, které se týkají sítě a využívání zdrojů. A místy to mohlo být docela složité v tom smyslu, že problémy nejsou zřejmé.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

V Yandexu máme Postgres. V Yandex. Cloudu žije mnoho služeb Yandexu. A máme několik petabajtů dat, které generují ne méně než milion dotazů za sekundu v Postgresu.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

A poskytujeme dostatečně typický klastr všem službám – to je hlavní primary uzel, běžné dvě repliky (synchronní a asynchronní), zálohování, škálování čtení na replikách.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Každý uzel klastru je Postgres, na kterém vedle Postgres a systémů monitorování je ještě nainstalován connection pooler. Connection pooler se používá pro fencing a pro své hlavní určení.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Jaké je hlavní určení connection pooler?

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

V Postgresu je přijat procesní model pro práci s databází. To znamená, že jedno spojení – to je jeden proces, jeden backend Postgres. A v tomto backendu je spousta různých cache, které je poměrně nákladné mít různé pro různá spojení.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Kromě toho, v kódu Postgres existuje pole, které se nazývá procArray. Obsahuje základní informace o síťových připojeních. A téměř všechny algoritmy zpracování procArray mají lineární složitost, procházejí celým polem síťových připojení. Je to docela rychlý cyklus, ale s vysokým počtem příchozích síťových připojení se to vše stává o něco dražší. A když se to stane o něco dražší, nakonec můžete zaplatit velmi vysokou cenu za velké množství síťových připojení.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Existují 3 možné přístupy:

  • Na straně aplikace.
  • Na straně databáze.
  • A mezi nimi, tj. různé kombinace.

Bohužel, integrovaný pooler je nyní ve vývoji. Přátelé z společnosti PostgreSQL Professional se tím většinou zabývají. Kdy se objeví, je těžké předpovědět. A vlastně máme na výběr dvě řešení. Je to pool na straně aplikace a proxy pool.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Pool na straně aplikace je nejjednodušší způsob. A téměř všechny clientské ovladače vám poskytují způsob, jak prezentovat miliony vašich připojení v kódu jako několik desítek připojení k databázi.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Vzniká problém, když chcete škálovat backend, chcete ho nasadit na mnoho virtuálních strojů.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Pak si také uvědomíte, že máte několik zón dostupnosti, několik datacenter. A přístup s poolováním na straně klienta vede k velkým číslům. Velká čísla jsou okolo 10 000 připojení. To je maximum, které může fungovat normálně.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Pokud mluvíme o proxy poolerech, existují dva poolery, které umí spoustu věcí. Nejsou to jen poolery. Jsou to poolery + skvělá funkčnost. To jsou Pgpool a Crunchy-Proxy.

Ale bohužel, tato další funkčnost není pro všechny potřeba. A vede to k tomu, že poolery podporují pouze session pooling, tj. jeden příchozí klient, jeden odchozí klient do databáze.

Pro naše úkoly to není příliš vhodné, proto používáme PgBouncer, který implementuje transaction pooling, tj. serverová spojení se mapují na klientská spojení pouze na dobu transakce.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

A při naší zátěži – to je pravda. Ale existuje několik problémů..Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Problémy začínají, když chcete diagnostikovat relaci, protože všechna příchozí připojení jsou lokální. Všechna přišla z loopback a jaksi je obtížné sledovat relaci.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Samozřejmě, můžete použít application_name_add_host. Je to způsob na straně Bouncer, jak přidat IP adresu do application_name. Avšak application_name je nastavena dodatečným připojením.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Na tomto grafu, kde žlutá čára představuje skutečné požadavky, a modrá – požadavky, které přicházejí do databáze. A tato rozdílnost – to je přesně nastavení application_name, které je potřeba pouze pro sledování, ale rozhodně není bez nákladů.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Kromě toho není možné v Bounceru omezit jeden pool, tj. počet připojení k databázi pro určitého uživatele, k určité databázi.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

K čemu to vede? Máte přetíženou službu napsanou v C++ a někde blízko malý servis na nodu, který na databázi nedělá nic špatného, ale jeho ovladač se zblázní. Otevírá 20 000 připojení, a všechno ostatní počká. I váš kód je v pořádku.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Samozřejmě jsme napsali malý patch pro Bouncer, který přidal toto nastavení, tj. omezení klientů na pool.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Bylo by možné to udělat na straně Postgres, tj. omezit role v databázi počtem připojení.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Ale pak ztrácíte možnost pochopit, proč nemáte připojení k serveru. PgBouncer nezprostředkovává chybu připojení, stále vrací stejnou informaci. A vy nemůžete zjistit: možná jste změnili heslo, možná jednoduše databáze spadla, možná je něco špatně. Ale žádná diagnostika není k dispozici. Pokud nelze navázat sezení, nezjistíte, proč to nelze udělat.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

V určitém okamžiku se díváte na grafy aplikace a vidíte, že aplikace nefunguje.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Díváte se na top a vidíte, že Bouncer je jednovláknový. To je zlomový moment v životě služby. Chápete, že jste se připravovali na škálování databáze za rok a půl, ale potřebujete škálovat pooler.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Dospěli jsme k závěru, že potřebujeme více PgBouncerů.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

https://lwn.net/Articles/542629/

Trochu jsme patchovali Bouncer.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

A udělali tak, že může být spuštěno několik Bouncerů s opětovným využitím TCP portu. A již operační systém automaticky rozděluje příchozí TCP připojení mezi nimi round-robin.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Je to transparentní pro klienty, tj. všechno vypadá tak, jako byste měli jednoho Bouncera, ale máte fragmentaci idle připojení mezi spuštěnými Bouncery.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

A v určitém okamžiku můžete zjistit, že těchto 3 Bouncerů využívá každé své jádro na 100 %. Potřebujete jich poměrně hodně.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Protože máte TLS. Máte šifrované připojení. A pokud benchmarkujete Postgres s TLS a bez TLS, zjistíte, že počet navázaných připojení klesá téměř o dvě řády s aktivací šifrování, protože TLS handshake spotřebovává prostředky procesoru.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

A na vrcholu můžete vidět poměrně hodně kryptografických funkcí, které se vykonávají při vlně příchozích připojení. Vzhledem k tomu, že náš primary může přepínat mezi dostupnostními zónami, je vlna příchozích připojení poměrně typická situace. To znamená, že z nějakého důvodu starý primary nebyl dostupný, a celá zátěž byla zaslána do jiného datacentra. Všichni najednou přijdou pozdravit s TLS.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

A velké množství TLS handshake se může už nemít potřebu pozdravit s Bouncerem, ale může mu přitom škrtit hrdlo. Kvůli timeoutu se vlna příchozích připojení může stát nekončící. Pokud máte retry do databáze bez exponenciálního backoffu, nebudou přicházet znovu a znovu v koherentní vlně.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Toto je příklad 16 PgBouncerů, které zatěžují 16 jader na 100 %.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Dospěli jsme k kaskádovému PgBounceru. To je nejlepší konfigurace, kterou lze dosáhnout na naší zátěži s Bouncerem. Vnější Bouncers slouží pro TCP handshake, zatímco vnitřní Bouncers slouží pro skutečné pooling, aby se příliš netříštily vnější připojení.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

V takové konfiguraci je možný plynulý restart. Můžete restartovat všechny tyto 18 Bouncerů jedno po druhém. Ale udržování takové konfigurace je poměrně složité. Systémoví administrátoři, DevOps a lidé, kteří skutečně nesou zodpovědnost za tento server, nebudou z takové schématu příliš nadšeni.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Mohlo by se zdát, že můžeme všechny naše úpravy propagovat do open source, ale Bouncer se příliš dobře nepodporuje. Například možnost spustit několik PgBouncerů na jednom portu byla zakotvena před měsícem. A pull request s touto funkcí byl před několika lety.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

https://www.postgresql.org/docs/current/libpq-cancel.html

https://github.com/pgbouncer/pgbouncer/pull/79

Nebo další příklad. V Postgres můžete zrušit prováděný dotaz zasláním tajného klíče přes jiné spojení bez další autentizace. Někteří klienti však posílají pouze TCP-reset, tedy přeruší síťové spojení. Co v tomto případě udělá Bouncer? Nic. Bouncer bude pokračovat v provádění dotazu. Pokud máte obrovské množství spojení, která malými dotazy zatížila databázi, jednoduše přerušení spojení s Bouncerem nebude stačit, je potřeba také ukončit ty dotazy, které běží v databázi.

Bylo to opraveno a tento problém zatím nebyl sloučen do upstreamu Bouncera.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

A tak jsme dospěli k tomu, že potřebujeme svůj vlastní connection pooler, který se bude vyvíjet, patchovat, v němž budeme moci okamžitě opravovat problémy a který musí být samozřejmě vícerozměrný.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Vícevláknovost jsme si stanovili jako hlavní úkol. Musíme dobře zvládat nápor příchozích TLS spojení.

Za tímto účelem jsme museli vyvinout samostatnou knihovnu, která se jmenuje Machinarium, a která je určena k popisu strojových stavů síťového spojení jako sekvenčního kódu. Pokud se podíváte na zdrojový kód libpq, uvidíte poměrně složité volání, která vám mohou vrátit výsledek a říct: „Zavolej mě později. Teď mám I/O, ale až I/O skončí, budu mít zátěž pro procesor“. A to je víceúrovňový systém. Síťová interakce se obvykle popisuje jako strojový stav. Mnoha pravidly typu „Pokud jsem dříve obdržel hlavičku paketu velikosti N, nyní očekávám N bytů“, „Pokud jsem posílal paket SYNC, nyní očekávám paket s metadaty výsledku“. Vytváří to poměrně obtížný kontrintuitivní kód, jako kdyby byl labyrint převeden na lineární rozložení. Udělali jsme to tak, že místo strojového stavu programátor popisuje hlavní cestu interakce jako běžný imperativní kód. Jen v tomto imperativním kódu je třeba vložit místa, kde je třeba přerušit sekvenci provádění čekáním na data ze sítě, předávající kontext provádění jiné koruně (green threadu). Tento přístup je podobný tomu, že vyzdvihneme nejžádanější cestu v labyrintu a zapíšeme ji za sebou, a pak k ní přidáme odbočky.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Nakonec máme jeden proud, který provádí TCP accept a round-robin přenáší mnoho workerům TPC připojení.

Každé klientské připojení vždy pracuje na jednom procesoru. To umožňuje, aby bylo cache-friendly.

Kromě toho jsme mírně upravili shromažďování malých paketů do jednoho velkého paketu, abychom uvolnili systémový TCP stack.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Dále jsme vylepšili transakční pooling tak, že Odyssey při nastavené konfiguraci může odeslat CANCEL a ROLLBACK v případě porušení síťového připojení, t. j. pokud na žádost nikdo nečeká, Odyssey řekne databázi, aby se nesnažila provést tuto žádost, která by mohla spotřebovat cenné zdroje.

Pokud je to možné, uchováváme připojení ke stejnému klientovi. To umožňuje, abychom nepřestavovali application_name_add_host. Pokud to je možné, nemáme další přeinstalaci parametrů, které jsou potřebné pro diagnostiku.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Pracujeme v zájmu Yandex.Cloud. A pokud používáte managed PostgreSQL a máte nastavený connection pooler, můžete vytvořit logickou replikaci ven, t. j. odejít od nás, pokud budete chtít, pomocí logické replikace. Bouncer ven proud logické replikace neodevzdá.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

To je příklad nastavení logické replikace.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Kromě toho máme podporu fyzické replikace ven. V Cloudu je to samozřejmě nemožné, protože by vám cluster dal příliš mnoho informací o sobě. Ale ve vašich instalacích, pokud potřebujete fyzickou replikaci přes connection pooler v Odyssey, je to možné.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

V Odyssey je plně kompatibilní monitoring s PgBouncer. Máme stejnou konzoli, která vykonává téměř všechny stejné příkazy. Pokud něco chybí, pošlete pull request nebo alespoň issue na GitHub, budeme doplňovat potřebné příkazy. Základní funkčnost konzole PgBouncer již máme.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

A samozřejmě máme error forwarding. Vrátíme tu chybu, kterou databáze nahlásila. Získáte informace o tom, proč se vám nedaří připojit k databázi, a ne jen to, že se vám nedaří.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Tato funkce se vypíná v případě, že potřebujete 100% kompatibilitu s PgBouncer. Můžeme se chovat stejně jako Bouncer, jen tak pro jistotu.

Vývoj

Několik slov o zdrojovém kódu Odyssey.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

https://github.com/yandex/odyssey/pull/66

Například existují příkazy „Pozastavit / Pokračovat“. Ty se obvykle používají pro aktualizaci databáze. Pokud potřebujete aktualizovat Postgres, můžete jej pozastavit v connection pooleru, provést pg_upgrade a poté obnovit. Na straně klienta to bude vypadat tak, jako by se databáze jednoduše zpomalila. Tuto funkčnost nám přinesli lidé z komunity. Zatím ještě není sloučena, ale brzy bude. (Už sloučena)

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

https://github.com/yandex/odyssey/pull/73 — už sloučena

Kromě toho je jednou z nových funkcí v PgBouncer podpora SCRAM Authentication, kterou nám také přinesl člověk, který nepracuje ve Yandex.Cloud. Obě funkce jsou složité a důležité.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Proto bych chtěl povědět, z čeho je Odyssey vyroben, možná i vy teď chcete trochu psát kód.

Máte základní strukturu Odyssey, která se opírá o dvě hlavní knihovny. Knihovna Kiwi je implementací Postgresového protokolu zpráv. Tedy nativní proto 3 u Postgres je standardní zpráva, se kterou si frontend a backend mohou vyměňovat informace. Tyto zprávy jsou implementovány v knihovně Kiwi.

Knihovna Machinarium je knihovna pro implementaci vláken. Malý fragment tohoto Machinarium je napsán v assembleru. Ale nebojte se, je jich jen 15 řádků.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Architektura Odyssey. Existuje hlavní stroj, ve kterém jsou spuštěny coroutines. V tomto stroji se implementuje přijetí příchozích TCP spojení a jejich rozdělení mezi pracovníky.

Uvnitř jednoho pracovníka může pracovat zpracovatel několika klientů. A také v hlavním vlákně běží konzole a zpracování crone úloh pro odstranění spojení, která již nejsou potřeba v poolu.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Pro testování Odyssey se používá standardní sada testů Postgres. Stačí spustit install-check přes Bouncer a přes Odyssey, a získáme nulový div. Několik testů spojených s formátováním dat neprobíhá úplně stejně v Bouncer a v Odyssey.

Kromě toho existuje mnoho ovladačů, které mají vlastní testování. A jejich testy používáme pro testování Odyssey.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Kromě toho, kvůli naší kaskádové konfiguraci musíme testovat různé kombinace: Postgres + Odyssey, PgBouncer + Odyssey, Odyssey + Odyssey, abychom byli jisti, že pokud Odyssey skončil v nějaké části v kaskádě, funguje nadále tak, jak očekáváme.

Hřebíky

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Používáme Odyssey v produkci. A nebylo by fér, kdybych řekl, že všechno prostě funguje. Ne, jako ano, ale ne vždy. Například v produkci to prostě fungovalo, pak přišli naši kamarádi z PostgreSQL Professional a řekli, že máme memory leak. Opravdu to bylo, opravili jsme to. Ale byla to prostě náhoda.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Pak jsme zjistili, že v connection pooleru jsou příchozí TLS spojení a odchozí TLS spojení. A pro ta spojení jsou potřeba klientské certifikáty a serverové certifikáty.

Serverové certifikáty Bouncer a Odyssey je čtou z pcache, ale klientské certifikáty není nutné číst z pcache, protože náš škálovatelný Odyssey nakonec naráží na systémový výkon při četbě tohoto certifikátu. Bylo to pro nás překvapení, protože nenastalo hned. Zpočátku se lineárně škáloval, ale po 20 000 příchozích souběžných připojení se tento problém projevil.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Pluggable Authentication Method je možnost autentizace vestavěnými linuxovými prostředky. V PgBouncer je to realizováno tak, že existuje samostatný thread na čekání na odpověď od PAM a je zde hlavní thread PgBouncer, který obsluhuje aktuální spojení a může je požádat, aby nějakou chvíli pobyly v threadu PAM.

Toto jsme nezrealizovali z jednoho prostého důvodu. Máme přece hodně threadů. Proč bychom to potřebovali?

V důsledku toho mohou vznikat problémy, že pokud máte PAM autentizaci a ne PAM autentizaci, pak velká vlna PAM autentizace může významně zdržovat ne PAM autentizaci. To je jedna z těch věcí, které jsme neopravili. Ale pokud to chcete opravit, můžete se o to postarat.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Další problém byl ten, že máme jeden thread, který přijímá všechna příchozí spojení. A poté je předává do worker poolu, kde proběhne TLS handshake.

Pokud tedy máte koherentní vlnu ze 20 000 síťových spojení, všechny budou přijaty. A na straně klienta libpq začne odpočet časových limitů. Podle defaultu tam prý je 3 sekundy.

Pokud se nemohou všechny najednou připojit k databázi, pak se nemohou připojit k databázi, protože to vše může být kryto neexponenciálním opakováním.

Dospěli jsme k tomu, že jsme zde zkopírovali schéma z PgBouncer, kde máme throttling počtu TCP spojení, kterým děláme accept.

Pokud vidíme, že akceptujeme připojení, ale nakonec nestihnou proběhnout handshake, zařazujeme je do fronty, aby nevyužívaly prostředky procesoru. To vede k tomu, že současný handshake nemusí probíhat pro všechna připojení, která přišla. Ale alespoň někdo se dostane do databáze, i když je zátěž dost vysoká.

Roadmap

Co bychom rádi viděli v budoucnu v Odyssey? Co jsme ochotni vyvíjet sami a co očekáváme od komunity?

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

K srpnu 2019.

Takto vypadal roadmap Odyssey v srpnu:

  • Chtěli jsme autentizaci SCRAM a PAM.
  • Chtěli jsme směrovat čtenářské dotazy na standby.
  • Rádi bychom online-restart.
  • A možnost pozastavit server.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Polovina této roadmapy byla splněna, a to dokonce ne námi. A to je dobře. Takže pojďme probrat, co zbývá a přidat další.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Pokud jde o směrování read-only dotazů na standby? У нас есть реплики, которые без выполнения запросов будут просто греть воздух. Они нам необходимы для обеспечения failover и switchover. В случае проблем в одном из дата-центре хотелось бы их занять какой-то полезной работой. Потому что те же самые центральные процессоры, ту же самую память мы не можем сконфигурировать по-другому, потому что иначе не будет работать репликация.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

V podstatě od verze 10 v Postgres existuje možnost při připojení také uvést session_attrs. Můžete v připojení vyjmenovat všechny databázové hostitele a říci, proč jdete do databáze: zapisovat nebo pouze číst. A ovladač sám vybere prvního hostitele v seznamu, který mu vyhovuje a splňuje požadavky session_attrs.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Ale problém tohoto přístupu je v tom, že neřídí zpoždění replikace. Může existovat nějaká replikace, která je zpožděna na nepřijatelně dlouhou dobu pro vaši službu. Abychom umožnili plnohodnotné provádění čtenářských dotazů na replikaci, v podstatě musíme v Odyssey podpořit, aby nefungovalo, když číst nelze.

Odyssey by měl občas jít do databáze a zjišťovat replikaci od primárního serveru. A pokud dosáhne limitu, novým dotazům do databáze by měl být zabráněno, říct klientovi, aby znovu inicioval připojení a možná zvolil jiného hostitele pro provádění dotazů. To umožní databázi rychleji obnovit zpoždění replikace a znovu se vrátit k odpovědi na dotazy.

Termíny realizace je obtížné nazvat, protože je to open source. Ale doufám, že to nebude trvat 2,5 roku jako u kolegů z PgBouncer. Tuto funkci bychom rádi viděli v Odyssey.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Lidé v komunitě se ptali na podporu připravených prohlášení.Nyní můžete vytvořit připravený příkaz dvěma způsoby. Za prvé, můžete provést SQL příkaz, konkrétně „prepared“. Abyste pochopili tento SQL příkaz, musíme se naučit chápat SQL na straně Bouncer. To by bylo přehnané, protože potřebujeme kompletní parser. Nemůžeme analyzovat každý SQL příkaz.

Existuje však připravený příkaz na úrovni protokolu zpráv na proto3. A to je místo, kdy informace o tom, že se vytváří připravený příkaz, přichází ve strukturovaném formátu. A mohli bychom podpořit pochopení, že na nějakém serverovém spojení klient požádal o vytvoření připravených příkazů. A i když byla transakce uzavřena, potřebujeme nadále udržovat koherenci serveru a klienta.

Ale zde se objevuje rozpor v dialogu, protože někdo říká, že je třeba chápat, který konkrétní připravený příkaz vytvořil klient a oddělit serverové spojení mezi všemi klienty, kteří toto serverové spojení vytvořili, tj. kteří vytvořili takový připravený příkaz.

Andres Freund řekl, že pokud k vám přišel klient, který již vytvořil takový připravený příkaz v jiném serverovém spojení, vytvořte ho za něj. Ale zdá se, že je trochu špatné provádět dotazy v databázi místo klienta, ale z pohledu vývojáře, který píše protokol pro interakci s databází, by bylo pohodlné, kdyby mu prostě dali síťové spojení, ve kterém je takový připravený dotaz.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

A ještě jedna funkce, kterou musíme implementovat. Nyní máme monitorování kompatibilní s PgBouncer. Můžeme vrátit průměrnou dobu trvání dotazu. Ale průměrná doba je průměrná teplota v nemocnici: někdo je studený, někdo teplý – průměrně jsou všichni zdraví. To není pravda.

Musíme implementovat podporu percentilů, které by naznačovaly, že existují pomalé dotazy, které spotřebovávají zdroje, a udělaly by monitorování přijatelnějším.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Nejdůležitější je, že chci verzi 1.0 (už byla vydána verze 1.1). Faktem je, že nyní je Odyssey ve verzi 1.0rc, tj. release candidate. A všechna úskalí, která jsem vyjmenoval, byla opravena právě s touto verzí, kromě úniku paměti.

Co pro nás bude znamenat verze 1.0? Spouštíme Odyssey na našich serverech. Již teď funguje na našich základech, ale když dosáhne bodu 1 000 000 dotazů za sekundu, můžeme říct, že to je konečná verze a tuto verzi můžeme nazvat 1.0.

V komunitě několik lidí požádalo, aby ve verzi 1.0 byla také pauza a SCRAM. To by však znamenalo, že budeme muset uvést do produkce již další verzi, protože ani SCRAM, ani pauza zatím nebyly začleněny. Ale pravděpodobně tento problém bude vyřešen dost rychle.

Odyssey roadmap: co ještě chceme od connection pooler. Andrej Borodin (2019)

Čekám na vaše pull requesty. A také bych rád slyšel, jaké máte problémy s Bouncerem. Pojďme je prodiskutovat. Možná budeme moci implementovat nějaké funkce, které potřebujete.

Na tomto skončila má část, rád bych vás slyšel. Děkuji!

Otázky

Pokud nastavím svůj application_name, bude správně přenášen, včetně transaction pooling v Odyssey?

V Odyssey nebo v Bounceru?

V Odyssey. V Bounceru se přenáší.

Sestavu vytvoříme.

A pokud se moje skutečné připojení bude skákat mezi jinými připojeními, bude přenášeno?

Vytvoříme sadu všech parametrů, které jsou uvedeny v seznamu. Nemohu říct, zda je application_name v tomto seznamu. Myslím, že jsem ho tam viděl. Nastavíme všechny stejné parametry. Jedním dotazem tam set udělá vše, co bylo nastaveno klientem při spuštění.

Děkuji, Andreji, za prezentaci! Dobrá prezentace! Jsem rád, že Odyssey se každou minutou vyvíjí rychleji a rychleji. Přeji, abyste pokračovali. Již jsme vás kontaktovali s žádostí o multi data-source připojení, aby se Odyssey mohl připojit současně k různým databázím, t. j. master slave, a poté se automaticky po failoveru připojit k novému masteru.

Ano, zdá se, že si pamatuji tuto diskusi. Nyní je několik úložišť. Ale přepínání mezi nimi není. Musíme na své straně dotazovat server, zda je ještě živý a pochopit, že došlo k failoveru, kdo zavolá pg_recovery. Mám standardní způsob, jak pochopit, že jsme přišli na ne master. A jak to máme pochopit z chyb, nebo jak? T. j. myšlenka je zajímavá, diskutuje se o ní. Pište více komentářů. Pokud máte pracovní ruce, které znají C, je to vůbec skvělé.

Otázka měřítka replik nás také zajímá, protože chceme, aby přijetí replikovaných clusterů bylo pro vývojáře aplikací co nejjednodušší. Ale chtěli bychom více komentářů, tj. jak přesně to udělat, jak to udělat dobře.

Otázka také ohledně replik. Měli byste mít master a několik replik. A je jasné, že do replik se připojují méně často než k masteru, protože se mohou lišit. Říkali jste, že rozdíl v datech může být takový, že nebude vyhovovat vašemu podnikání a nebudete tam přistupovat, dokud se znovu neproreplikují. Přičemž, pokud jste k nim dlouho nepřistupovali a pak začali, tak ta data, která potřebujete, nebudou dostupná hned. To znamená, že pokud neustále používáme master, tak tam je cache vyhřátá, zatímco v replikaci je cache trochu pozadu.

Ano, je to pravda. V pcache nebudou bloky dat, které chcete, v real cache nebude informace o tabulkách, které chcete, v plánech nebudou rozparsované dotazy, vůbec nic tam nebude.

A když máte nějaký cluster a přidáte do něj novou replikaci, tak dokud se nespustí, bude to v ní špatné, tj. buduje si svou cache.

Pochopil jsem myšlenku. Správným přístupem by bylo spustit malý procento dotazů prvně na replikaci, které by vyhřály cache. Řekněme, že máme podmínku, že bychom se měli opozdit maximálně o 10 sekund za masterem. A tuto podmínku aktivovat ne jednou, ale plynule pro některé klienty.

Ano, zvyšovat váhu.

To je dobrý nápad. Ale nejprve je potřeba implementovat to vypnutí. Nejprve se musíme odpojit a pak přemýšlet, jak se připojit. Je to skvělá funkce pro plynulé připojení.

V nginx je taková možnost pomalu začít v clusteru pro server. A postupně zvyšuje zátěž.

Ano, skvělý nápad, vyzkoušíme to, až se k tomu dostaneme.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster