Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Fir-rapport tiegħu, Andrey Borodin jgħidlek kif qiesu l-esperjenza tal-iskala PgBouncer meta ddisinjaw il-pooler tal-konnessjoni Odyssey, hekk kif ħarġuha fil-produzzjoni. Barra minn hekk, se niddiskutu liema funzjonijiet tal-puller nixtiequ naraw f'verżjonijiet ġodda: huwa importanti għalina mhux biss li nilħqu l-bżonnijiet tagħna, iżda li niżviluppaw il-komunità tal-utenti. Odyssey.

Video:

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Hi kollha! Jisimni Andrew.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

F'Yandex, niżviluppa databases ta' sors miftuħ. U llum għandna suġġett dwar konnessjonijiet pooler konnessjoni.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Jekk taf kif issejjaħ pooler tal-konnessjoni bir-Russu, imbagħad għidli. Irrid verament insib terminu tekniku tajjeb li għandu jiġi stabbilit fil-letteratura teknika.

Is-suġġett huwa pjuttost ikkumplikat, għaliex f'ħafna databases il-pooler tal-konnessjoni huwa inkorporat u lanqas m'għandek bżonn tkun taf dwaru. Naturalment, hemm xi settings kullimkien, iżda f'Postgres ma taħdimx hekk. U b'mod parallel (f'HighLoad++ 2019) hemm rapport minn Nikolai Samokhvalov dwar it-twaqqif ta' mistoqsijiet f'Postgres. U kif nifhem jien, ġew hawn nies li diġà kkonfiguraw il-mistoqsijiet tagħhom perfettament, u dawn huma nies li jiffaċċjaw problemi ta 'sistema aktar rari relatati man-netwerk u l-użu tar-riżorsi. U f'xi postijiet jista 'jkun pjuttost diffiċli fis-sens li l-problemi mhumiex ovvji.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Yandex għandu Postgres. Ħafna servizzi Yandex jgħixu f'Yandex.Cloud. U għandna diversi petabytes ta 'dejta li jiġġeneraw mill-inqas miljun talba kull sekonda f'Postgres.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

U aħna nipprovdu cluster pjuttost standard għas-servizzi kollha - dan huwa n-nodu primarju ewlieni tan-node, iż-żewġ repliki tas-soltu (sinkroniċi u asinkroniċi), backup, skalar ta 'talbiet ta' qari fuq ir-replika.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Kull node ta 'cluster huwa Postgres, li fuqu, minbarra Postgres u sistemi ta' monitoraġġ, huwa installat ukoll pooler ta 'konnessjoni. Connection pooler jintuża għall-fencing u għall-iskop ewlieni tiegħu.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

X'inhu l-għan ewlieni ta 'konnessjoni pooler?

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Postgres jadotta mudell ta' proċess meta jaħdem ma' database. Dan ifisser li konnessjoni waħda hija proċess wieħed, backend wieħed Postgres. U f'dan il-backend hemm ħafna caches differenti, li huma pjuttost għoljin biex jagħmlu differenti għal konnessjonijiet differenti.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Barra minn hekk, il-kodiċi Postgres għandu firxa msejħa procArray. Fiha data bażika dwar konnessjonijiet tan-netwerk. U kważi l-algoritmi kollha tal-ipproċessar procArray għandhom kumplessità lineari; jimxu fuq il-firxa kollha ta 'konnessjonijiet tan-netwerk. Huwa ċiklu pjuttost mgħaġġel, iżda b'aktar konnessjonijiet tan-netwerk li jidħlu l-affarijiet jiswew ftit aktar. U meta l-affarijiet jiswew ftit aktar, tista 'tispiċċa tħallas prezz għoli ħafna għal ħafna konnessjonijiet tan-netwerk.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Hemm 3 approċċi possibbli:

  • Fuq in-naħa tal-applikazzjoni.
  • Fuq in-naħa tad-database.
  • U bejn, jiġifieri, kull tip ta 'kombinazzjonijiet.

Sfortunatament, il-pooler built-in bħalissa qed jiġi żviluppat. Il-ħbieb tagħna fil-PostgreSQL Professional jagħmlu dan l-aktar. Meta se jidher huwa diffiċli li wieħed ibassar. U fil-fatt, għandna żewġ soluzzjonijiet għall-perit minn fejn jagħżel. Dawn huma pool in-naħa tal-applikazzjoni u pool proxy.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Il-pool tan-naħa tal-applikazzjoni huwa l-eħfef mod. U kważi s-sewwieqa tal-klijenti kollha jagħtuk mod: tippreżenta miljuni ta 'konnessjonijiet tiegħek f'kodiċi bħala diversi għexieren ta' konnessjonijiet għad-database.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Il-problema li tqum hija li f'ċertu punt trid tiskala l-backend, trid tiskjerah f'ħafna magni virtwali.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Imbagħad tirrealizza li għandek bosta żoni ta 'disponibbiltà aktar, diversi ċentri tad-dejta. U l-approċċ tal-ġbir tan-naħa tal-klijent iwassal għal numri kbar. Dawk kbar huma madwar 10 konnessjoni. Dan huwa t-tarf li jista 'jaħdem normalment.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Jekk nitkellmu dwar proxy poolers, allura hemm żewġ poolers li jistgħu jagħmlu ħafna affarijiet. Huma mhux biss poolers. Huma poolers + funzjonalità aktar friska. Dan Pgpool и Crunchy-Proxy.

Iżda, sfortunatament, mhux kulħadd jeħtieġ din il-funzjonalità addizzjonali. U jwassal għall-fatt li l-poolers jappoġġjaw biss il-pooling tas-sessjonijiet, jiġifieri klijent wieħed li jidħol, klijent wieħed li joħroġ għad-database.

Dan mhux adattat ħafna għall-iskopijiet tagħna, għalhekk nużaw PgBouncer, li jimplimenta l-pooling tat-tranżazzjonijiet, jiġifieri l-konnessjonijiet tas-server huma mqabbla mal-konnessjonijiet tal-klijenti biss għat-tul tat-tranżazzjoni.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

U fl-ammont tax-xogħol tagħna, dan huwa minnu. Iżda hemm ftit problemi.Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Il-problemi jibdew meta trid tiddijanjostika sessjoni, minħabba li l-konnessjonijiet kollha deħlin tiegħek huma lokali. Kulħadd ġie b'loopback u b'xi mod isir diffiċli biex jintraċċa s-sessjoni.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Naturalment tista' tuża application_name_add_host. Dan huwa mod fuq in-naħa tal-Bouncer biex iżżid indirizz IP ma application_name. Iżda application_name huwa stabbilit minn konnessjoni addizzjonali.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Fuq din il-grafika, fejn il-linja safra hija talbiet reali, u fejn il-linja blu hija talbiet li jtiru fid-database. U din id-differenza hija preċiżament l-installazzjoni ta 'application_name, li hija meħtieġa biss għat-traċċar, iżda mhix b'xejn għal kollox.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Barra minn hekk, f'Bouncer ma tistax tillimita pool wieħed, jiġifieri n-numru ta' konnessjonijiet ta' database għal kull utent speċifiku, għal kull database speċifika.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Għal xiex iwassal dan? Għandek servizz mgħobbi miktub f'C++ u x'imkien fil-qrib servizz żgħir fuq node li ma jagħmel xejn terribbli mad-database, iżda s-sewwieq tiegħu jimġenn. Jiftaħ 20 konnessjoni u kull ħaġa oħra se tistenna. Anke l-kodiċi tiegħek huwa normali.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Aħna, ovvjament, ktibna garża żgħira għal Bouncer li żiedet dan is-setting, jiġifieri tillimita l-klijenti għall-pool.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Ikun possibbli li tagħmel dan fuq in-naħa ta 'Postgres, jiġifieri, tillimita r-rwoli fid-database bin-numru ta' konnessjonijiet.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Imma mbagħad titlef il-ħila li tifhem għaliex m'għandekx konnessjonijiet mas-server. PgBouncer ma jarmix żball ta' konnessjoni, dejjem jirritorna l-istess informazzjoni. U ma tistax tifhem: forsi l-password tiegħek inbidlet, forsi d-database biss intilfet, forsi xi ħaġa hija ħażina. Iżda m'hemm l-ebda dijanjosi. Jekk sessjoni ma tistax tiġi stabbilita, ma tkunx taf għaliex ma tistax tiġi stabbilita.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

F'ċertu punt, tħares lejn il-graffs tal-applikazzjoni u tara li l-applikazzjoni mhix qed taħdem.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Ħares lejn il-quċċata u ara li Bouncer huwa b'ħajt wieħed. Dan huwa punt ta 'bidla fil-ħajja tas-servizz. Tinduna li kont qed tipprepara biex tiskala id-database f'sena u nofs, u trid tiskala l-pooler.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Wasalna għall-konklużjoni li għandna bżonn aktar PgBouncers.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

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

Bouncer ġie patched daqsxejn.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

U għamluha sabiex diversi Bouncers jistgħu jitqajmu billi jerġgħu jintużaw il-port TCP. U s-sistema operattiva tittrasferixxi awtomatikament il-konnessjonijiet TCP deħlin bejniethom billi tuża round-robin.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Dan huwa trasparenti għall-klijenti, li jfisser li jidher li għandek Bouncer wieħed, iżda għandek frammentazzjoni ta 'konnessjonijiet idle bejn it-tħaddim ta' Bouncers.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

U f'ċertu mument tista' tinnota li dawn it-3 Bouncers kull wieħed jieklu l-qalba tagħhom b'100%. Għandek bżonn pjuttost ftit Bouncers. Għaliex?

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Għax għandek TLS. Għandek konnessjoni kriptata. U jekk tagħmel benchmark ta 'Postgres bi u mingħajr TLS, issib li n-numru ta' konnessjonijiet stabbiliti jonqos bi kważi żewġ ordnijiet ta 'kobor bil-kriptaġġ attivat, minħabba li t-TLS handshake jikkonsma riżorsi tas-CPU.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

U fil-quċċata tista 'tara pjuttost ftit funzjonijiet kriptografiċi li huma esegwiti meta jkun hemm mewġa ta' konnessjonijiet deħlin. Peress li l-primarja tagħna tista 'taqleb bejn iż-żoni ta' disponibbiltà, mewġa ta 'konnessjonijiet deħlin hija sitwazzjoni pjuttost tipika. Jiġifieri, għal xi raġuni l-primarja l-antika ma kinitx disponibbli, it-tagħbija kollha ntbagħtet lil ċentru tad-dejta ieħor. Kollha se jiġu biex jgħidu bonjour lil TLS fl-istess ħin.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

U numru kbir ta 'handshake TLS jistgħu ma jibqgħux jgħidu bonjour lil Bouncer, iżda se għafas gerżuma tiegħu. Minħabba l-timeout, il-mewġa ta 'konnessjonijiet deħlin tista' ssir undamped. Jekk terġa 'tipprova lejn il-bażi mingħajr backoff esponenzjali, ma jiġux għal darb'oħra u għal darb'oħra f'mewġa koerenti.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Hawn hu eżempju ta '16 PgBouncers li jgħabbi 16-il qalba f'100%.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Wasalna għall-kaskata PgBouncer. Din hija l-aħjar konfigurazzjoni li tista 'tinkiseb fuq it-tagħbija tagħna ma' Bouncer. Il-Bouncers esterni tagħna jintużaw għal handshake tat-TCP, u l-Bouncers interni jintużaw għal pooling reali, sabiex ma jifframmentawx wisq il-konnessjonijiet esterni.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

F'din il-konfigurazzjoni, restart bla xkiel huwa possibbli. Tista 'terġa' tibda dawn it-18-il Bouncers kollha wieħed wieħed. Iżda ż-żamma ta 'konfigurazzjoni bħal din hija pjuttost diffiċli. Sysadmins, DevOps, u nies li fil-fatt huma responsabbli għal dan is-server mhux se jkunu kuntenti ħafna b'dan l-arranġament.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Jidher li t-titjib kollu tagħna jista 'jiġi promoss għal sors miftuħ, iżda Bouncer mhux appoġġjat tajjeb ħafna. Pereżempju, il-kapaċità li tmexxi diversi PgBouncers fuq port wieħed ġiet impenjata xahar ilu. Kien hemm pull request b'din il-karatteristika bosta snin ilu.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

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

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

Jew eżempju ieħor. F'Postgres, tista 'tikkanċella talba li tkun għaddejja billi tibgħat is-sigriet għal konnessjoni differenti mingħajr awtentikazzjoni bla bżonn. Iżda xi klijenti sempliċiment jibagħtu reset TCP, jiġifieri jiksru l-konnessjoni tan-netwerk. X'se jagħmel Bouncer? Mhu se jagħmel xejn. Se tkompli tesegwixxi t-talba. Jekk irċevejt numru kbir ta 'konnessjonijiet li ħolqu database b'talbiet żgħar, allura sempliċement skonnettja l-konnessjoni minn Bouncer mhux se tkun biżżejjed; trid ukoll timla dawk it-talbiet li qed jaħdmu fid-database.

Dan ġie patched u din il-problema għadha ma ġietx magħquda mal-upstream ta' Bouncer.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

U għalhekk wasalna għall-konklużjoni li neħtieġu l-pooler tal-konnessjoni tagħna stess, li se jiġi żviluppat, patched, li fih il-problemi jistgħu jiġu kkoreġuti malajr u li, ovvjament, għandu jkun multi-threaded.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Aħna waqqafna multithreading bħala l-kompitu ewlieni. Għandna bżonn inkunu nistgħu nittrattaw tajjeb il-mewġa ta 'konnessjonijiet TLS deħlin.

Biex nagħmlu dan, kellna niżviluppaw librerija separata msejħa Machinarium, li hija mfassla biex tiddeskrivi l-istati tal-magni ta 'konnessjoni tan-netwerk bħala kodiċi sekwenzjali. Jekk tħares lejn il-kodiċi tas-sors libpq, tara xi sejħiet pjuttost kumplessi li jistgħu jirritornak riżultat u jgħidulek, “Ċempelni aktar tard. Bħalissa għandi IO għalissa, iżda meta l-IO jitlaq ikolli tagħbija fuq il-proċessur.” U din hija skema fuq diversi livelli. Il-komunikazzjoni tan-netwerk hija ġeneralment deskritta minn magna tal-istat. Ħafna regoli bħal "Jekk qabel irċevejt header ta' pakkett ta' daqs N, issa qed nistenna N bytes," "Jekk bgħatt pakkett SYNC, issa qed nistenna pakkett b'metadata tar-riżultat." Ir-riżultat huwa pjuttost diffiċli, kodiċi kontrointuwittiv, bħallikieku l-labirint kien konvertit għal line scan. Għamilna hekk li minflok magna tal-istat, il-programmatur jiddeskrivi t-triq ewlenija tal-interazzjoni fil-forma ta 'kodiċi imperattiv ordinarju. Huwa biss li f'dan il-kodiċi imperattiv għandek bżonn daħħal postijiet fejn is-sekwenza ta 'eżekuzzjoni trid tiġi interrotta billi tistenna d-dejta min-netwerk, tgħaddi l-kuntest ta' eżekuzzjoni għal coroutine ieħor (ħajt aħdar). Dan l-approċċ huwa simili għall-fatt li niktbu l-aktar triq mistennija fil-labirint wara xulxin, u mbagħad inżidu fergħat magħha.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Bħala riżultat, għandna ħajt wieħed li t-TCP jaċċetta u round-robin jgħaddi l-konnessjoni TPC lil ħafna ħaddiema.

F'dan il-każ, kull konnessjoni tal-klijent dejjem taħdem fuq proċessur wieħed. U dan jippermettilek li tagħmilha faċli għall-cache.

U barra minn hekk, tjiebna kemmxejn il-ġbir ta 'pakketti żgħar f'pakkett wieħed kbir sabiex ittaffi l-munzell TCP tas-sistema.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Barra minn hekk, tjiebna l-pooling transazzjonali fis-sens li Odyssey, meta kkonfigurata, tista’ tibgħat IĊĊANĊELLA u ROLLBACK fil-każ ta’ ħsara fil-konnessjoni tan-netwerk, jiġifieri jekk ħadd ma jkun qed jistenna talba, Odyssey tgħid lid-database biex ma tipprovax tagħmel. tissodisfa t-talba li tista’ taħli riżorsi prezzjużi.

U kull meta jkun possibbli, inżommu konnessjonijiet mal-istess klijent. Dan jevita li jkollok bżonn tinstalla mill-ġdid application_name_add_host. Jekk dan huwa possibbli, allura m'għandniex għalfejn irrisettja wkoll il-parametri li huma meħtieġa għad-dijanjostika.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Naħdmu fl-interessi ta 'Yandex.Cloud. U jekk tuża PostgreSQL amministrat u jkollok konnessjoni pooler installata, tista 'toħloq replikazzjoni loġika 'l barra, jiġifieri, ħallina, jekk trid, billi tuża replikazzjoni loġika. Bouncer mhux se jirrilaxxa l-fluss ta 'replikazzjoni loġika barra.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Dan huwa eżempju ta 'twaqqif ta' replikazzjoni loġika.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Barra minn hekk, għandna appoġġ għal replikazzjoni fiżika 'l barra. Fil-Cloud, ovvjament, dan huwa impossibbli, għaliex allura l-cluster jagħtik wisq informazzjoni dwaru nnifsu. Iżda fl-installazzjonijiet tiegħek, jekk għandek bżonn replikazzjoni fiżika permezz tal-pooler tal-konnessjoni f'Odyssey, dan huwa possibbli.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Odyssey għandha monitoraġġ kompletament kompatibbli ma 'PgBouncer. Għandna l-istess console li tmexxi kważi l-istess kmandi kollha. Jekk xi ħaġa tkun nieqsa, ibgħat talba għall-ġibda, jew għall-inqas kwistjoni fuq GitHub, u aħna nlestu l-kmandi meħtieġa. Imma diġà għandna l-funzjonalità ewlenija tal-console PgBouncer.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

U, ovvjament, għandna twassil tal-iżbalji. Aħna se nirritornaw l-iżball irrappurtat mid-database. Inti ser tirċievi informazzjoni dwar għaliex m'intix inkluż fid-database, u mhux biss li m'intix inkluż fiha.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Din il-karatteristika hija diżattivata f'każ li għandek bżonn kompatibilità ta '100% ma' PgBouncer. Nistgħu nġibu ruħna bl-istess mod bħal Bouncer, biss biex inkunu fuq in-naħa sigura.

Żvilupp

Ftit kliem dwar il-kodiċi tas-sors Odyssey.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

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

Pereżempju, hemm kmandi "Pause / Resume". Normalment jintużaw biex jaġġornaw id-database. Jekk għandek bżonn taġġorna Postgres, allura tista 'twaqqafha fil-pooler tal-konnessjoni, tagħmel pg_upgrade, imbagħad terġa' tkompli. U min-naħa tal-klijent se tidher bħallikieku d-database kienet sempliċement qed tonqos. Din il-funzjonalità ġiet ippreżentata lilna minn nies mill-komunità. Għadha mhix iffriżata, iżda dalwaqt se jkun kollox. (Diġà ffriżat)

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

https://github.com/yandex/odyssey/pull/73 - diġà ffriżat

Barra minn hekk, waħda mill-karatteristiċi ġodda f'PgBouncer hija l-appoġġ għall-Awtentikazzjoni SCRAM, li nġiebet lilna wkoll minn persuna li ma taħdimx f'Yandex.Cloud. It-tnejn huma funzjonalità kumplessa u importanti.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Għalhekk, nixtieq ngħidlek minn xiex hija magħmula Odyssey, f'każ li inti wkoll trid tikteb ftit kodiċi issa.

Għandek il-bażi tas-sors Odyssey, li tiddependi fuq żewġ libreriji ewlenin. Il-librerija Kiwi hija implimentazzjoni tal-protokoll tal-messaġġi Postgres. Jiġifieri, proto nattiv 3 ta 'Postgres huwa messaġġi standard li front-ends u back-ends jistgħu jiskambjaw. Huma implimentati fil-librerija tal-Kiwi.

Il-librerija Machinarium hija librerija ta 'implimentazzjoni tal-ħajt. Framment żgħir ta’ dan il-Maquinarium huwa miktub bil-lingwaġġ tal-assemblaġġ. Imma toqgħodx allarmat, hemm biss 15-il linja.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

arkitettura Odyssey. Hemm magna ewlenija li fuqha qed jaħdmu l-coroutines. Din il-magna timplimenta taċċetta konnessjonijiet TCP deħlin u tqassamhom fost il-ħaddiema.

Maniġer għal diversi klijenti jista' jaħdem fi ħdan ħaddiem wieħed. Il-ħajt ewlieni jmexxi wkoll il-console u l-ipproċessar tal-kompiti tal-crone biex iħassar konnessjonijiet li m'għadhomx meħtieġa fil-pool.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Odyssey hija ttestjata bl-użu tal-suite standard tat-test Postgres. Aħna biss imexxu install-check permezz ta' Bouncer u permezz ta' Odyssey, ikollna div null. Hemm diversi testijiet relatati mal-ifformattjar tad-data li ma jgħaddux eżattament l-istess f'Bouncer u f'Odyssey.

Barra minn hekk, hemm ħafna sewwieqa li għandhom l-ittestjar tagħhom stess. U nużaw it-testijiet tagħhom biex nittestjaw l-Odyssey.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Barra minn hekk, minħabba l-konfigurazzjoni tal-kaskata tagħna, irridu nittestjaw diversi qatet: Postgres + Odyssey, PgBouncer + Odyssey, Odyssey + Odyssey sabiex inkunu ċerti li jekk Odyssey spiċċat f'xi waħda mill-partijiet fil-kaskata, xorta taħdem ukoll kif nistennew.

Rake

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Aħna nużaw Odyssey fil-produzzjoni. U ma jkunx ġust jekk ngħid li kollox jaħdem biss. Le, jiġifieri, iva, iżda mhux dejjem. Pereżempju, fil-produzzjoni kollox ħadem biss, imbagħad ġew il-ħbieb tagħna minn PostgreSQL Professional u qalu li kellna tnixxija tal-memorja. Kienu tassew, ikkoreġejnahom. Imma kien sempliċi.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Imbagħad skoprejna li l-pooler tal-konnessjoni għandu konnessjonijiet TLS deħlin u konnessjonijiet TLS ħerġin. U l-konnessjonijiet jeħtieġu ċertifikati tal-klijent u ċertifikati tas-server.

Iċ-ċertifikati tas-server Bouncer u Odyssey jinqraw mill-ġdid mill-pcache tagħhom, iżda ċ-ċertifikati tal-klijenti m'għandhomx għalfejn jinqraw mill-ġdid mill-pcache, minħabba li l-Odyssey skalabbli tagħna fl-aħħar mill-aħħar tidħol fil-prestazzjoni tas-sistema tal-qari ta 'dan iċ-ċertifikat. Din kienet sorpriża għalina, għax ma damux biex jirreżisti. Għall-ewwel żdied b'mod lineari, iżda wara 20 konnessjoni simultanja deħlin din il-problema wriet ruħha.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Metodu ta 'Awtentikazzjoni Pluggable huwa l-abbiltà li jawtentikaw bl-użu ta' għodod integrati ta 'Lunux. F'PgBouncer huwa implimentat b'tali mod li jkun hemm ħajta separata biex tistenna rispons minn PAM u hemm ħajta PgBouncer prinċipali li sservi l-konnessjoni kurrenti u tista 'titlobhom biex jgħixu fil-ħajta PAM.

Aħna ma implimentajniex dan għal raġuni waħda sempliċi. Għandna ħafna ħjut. Għaliex għandna bżonn dan?

Dan fl-aħħar mill-aħħar jista 'joħloq problemi peress li jekk għandek awtentikazzjoni PAM u awtentikazzjoni mhux PAM, allura mewġa kbira ta' awtentikazzjoni PAM tista 'tdewwem b'mod sinifikanti l-awtentikazzjoni mhux PAM. Din hija waħda minn dawk l-affarijiet li aħna ma rranġajniex. Imma jekk trid tirranġaha, tista 'tagħmel dan.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Rake ieħor kien li għandna ħajta waħda li taċċetta l-konnessjonijiet kollha deħlin. U mbagħad jiġu trasferiti għall-grupp tal-ħaddiema, fejn se jseħħ il-handshake TLS.

Bottom line, jekk għandek mewġa koerenti ta 'konnessjonijiet tan-netwerk 20, dawn se jiġu aċċettati kollha. U min-naħa tal-klijent libpq se jibda jirrapporta timeouts. B'mod awtomatiku jidher li huwa 000 sekondi.

Jekk kollha ma jistgħux jidħlu fid-database fl-istess ħin, allura ma jistgħux jidħlu fid-database, għaliex dan kollu jista 'jiġi kopert b'prova mill-ġdid mhux esponenzjali.

Wasalna għall-konklużjoni li kkuppjajna l-iskema minn PgBouncer hawn bil-fatt li għandna throttling in-numru ta 'konnessjonijiet TCP li naċċettaw għalihom.

Jekk naraw li qed naċċettaw konnessjonijiet, iżda fl-aħħar mill-aħħar ma jkollhomx ħin biex jaqsmu l-idejn, inpoġġuhom fi kju sabiex ma jaħlux riżorsi tas-CPU. Dan iwassal għall-fatt li handshake simultanju jista' ma jsirx għall-konnessjonijiet kollha li jkunu waslu. Iżda mill-inqas xi ħadd jidħol fid-database, anki jekk it-tagħbija hija pjuttost tqila.

Pjan Direzzjonali

X'tixtieq tara fil-futur f'Odyssey? X’lesti niżviluppaw lilna nfusna u x’nistennew mill-komunità?

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Minn Awwissu 2019.

Hekk deher il-pjan direzzjonali Odyssey f'Awwissu:

  • Ridna awtentikazzjoni SCRAM u PAM.
  • Ridna ngħaddu t-talbiet għall-qari lil standby.
  • Nixtieq bidu mill-ġdid onlajn.
  • U l-abbiltà li nieqaf fuq is-server.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Nofs dan il-pjan direzzjonali tlesta, u mhux minna. U dan huwa tajjeb. Mela ejja niddiskutu dak li fadal u nżidu aktar.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Rigward il-quddiem mistoqsijiet li jinqraw biss għal standby? Għandna repliki li sempliċement isaħħnu l-arja mingħajr ma jeżegwixxu talbiet. Għandna bżonnhom biex jipprovdu failover u switchover. F'każ ta 'problemi f'wieħed miċ-ċentri tad-dejta, nixtieq nokkupahom b'xi xogħol utli. Minħabba li ma nistgħux nikkonfiguraw l-istess proċessuri ċentrali, l-istess memorja b'mod differenti, għax inkella r-replikazzjoni ma taħdimx.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Fil-prinċipju, f'Postgres, li jibda minn 10, huwa possibbli li jiġu speċifikati session_attrs meta tikkonnettja. Tista' telenka l-hosts tad-database kollha fil-konnessjoni u tgħid għaliex sejjer fid-database: ikteb jew aqra biss. U s-sewwieq innifsu jagħżel l-ewwel ospitanti fil-lista li jħobb l-aktar, li jissodisfa r-rekwiżiti ta 'session_attrs.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Iżda l-problema b'dan l-approċċ hija li ma jikkontrollax id-dewmien tar-replikazzjoni. Jista 'jkollok xi replika li baqgħet lura għal ammont ta' żmien inaċċettabbli għas-servizz tiegħek. Sabiex nippermettu l-eżekuzzjoni sħiħa tal-mistoqsijiet tal-qari fuq replika, essenzjalment irridu nappoġġaw il-kapaċità ta 'Odyssey li ma taħdimx meta ma tkunx tista' tinqara.

Odyssey trid tmur fid-database minn żmien għal żmien u titlob id-distanza tar-replikazzjoni mill-primarja. U jekk laħqet il-valur tal-limitu, tħallix talbiet ġodda fid-database, għid lill-klijent li jeħtieġ li jerġa 'jibda konnessjonijiet u, possibilment, agħżel host ieħor biex jesegwixxi t-talbiet. Dan se jippermetti lid-database biex terġa 'lura malajr id-dewmien tar-replikazzjoni u terġa' lura biex twieġeb b'talba.

Huwa diffiċli li tagħti qafas ta 'żmien għall-implimentazzjoni, minħabba li huwa sors miftuħ. Imma, nittama, mhux 2,5 snin bħall-kollegi tiegħi minn PgBouncer. Din hija l-karatteristika li nixtieq nara fl-Odyssey.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Fil-komunità, in-nies staqsew dwar l-appoġġ għad-dikjarazzjoni ppreparata. Issa tista 'toħloq dikjarazzjoni ppreparata f'żewġ modi. L-ewwel, tista 'tesegwixxi l-kmand SQL, jiġifieri "ppreparat". Sabiex nifhmu dan il-kmand SQL, għandna bżonn nitgħallmu nifhmu l-SQL fuq in-naħa tal-Bouncer. Dan ikun overkill, għaliex huwa overkill, peress li għandna bżonn l-parser kollu. Ma nistgħux inparse kull kmand SQL.

Iżda hemm dikjarazzjoni ppreparata fil-livell tal-protokoll tal-messaġġ fuq proto3. U dan huwa l-post meta l-informazzjoni li qed tinħoloq dikjarazzjoni ppreparata tiġi f'forma strutturata. U nistgħu nappoġġjaw il-fehim li fuq xi konnessjoni tas-server il-klijent talab biex joħloq dikjarazzjonijiet ippreparati. U anki jekk it-tranżazzjoni tkun magħluqa, xorta għandna bżonn inżommu l-konnettività bejn is-server u l-klijent.

Iżda hawnhekk tqum diskrepanza fid-djalogu, għax xi ħadd jgħid li trid tifhem x'tip ta 'dikjarazzjonijiet ippreparati ħoloq il-klijent u jaqsam il-konnessjoni tas-server bejn il-klijenti kollha li ħolqu din il-konnessjoni tas-server, jiġifieri, min ħoloq tali dikjarazzjoni ppreparata.

Andres Freund qal li jekk jiġi għandek klijent li diġà ħoloq tali dikjarazzjoni ppreparata f'konnessjoni oħra ta 'server, allura oħloq għalih. Iżda jidher ftit ħażin li tesegwixxi mistoqsijiet fid-database minflok il-klijent, iżda mill-perspettiva tal-iżviluppatur li jikteb il-protokoll għall-interazzjoni mad-database, ikun konvenjenti jekk sempliċement jingħata konnessjoni tan-netwerk li fiha hemm tali mistoqsija ppreparata.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

U karatteristika oħra li rridu nimplimentaw. Issa għandna monitoraġġ kompatibbli ma 'PgBouncer. Nistgħu nirritornaw il-ħin medju tal-eżekuzzjoni tal-mistoqsija. Iżda l-ħin medju huwa t-temperatura medja fl-isptar: xi wħud huma kesħin, xi wħud huma sħan - bħala medja, kulħadd huwa b'saħħtu. Mhuwiex veru.

Irridu nimplimentaw appoġġ għall-perċentili li jindikaw li hemm mistoqsijiet bil-mod li qed jaħlu r-riżorsi u jagħmlu l-monitoraġġ aktar aċċettabbli.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

L-iktar ħaġa importanti hija li nixtieq verżjoni 1.0 (Verżjoni 1.1 diġà ġiet rilaxxata). Il-fatt hu li Odyssey issa tinsab fil-verżjoni 1.0rc, jiġifieri kandidat għar-rilaxx. U l-problemi kollha li elenkajt ġew iffissati eżattament bl-istess verżjoni, ħlief għat-tnixxija tal-memorja.

X'se tfisser għalina l-verżjoni 1.0? Qegħdin inwasslu l-Odyssey għall-bażijiet tagħna. Diġà qed jaħdem fuq id-databases tagħna, iżda meta jilħaq il-punt ta '1 talba kull sekonda, allura nistgħu ngħidu li din hija l-verżjoni tar-rilaxx u din hija verżjoni li tista' tissejjaħ 000.

Diversi nies fil-komunità talbu li l-verżjoni 1.0 tinkludi pause u SCRAM. Iżda dan se jfisser li ser ikollna bżonn li toħroġ il-verżjoni li jmiss għall-produzzjoni, għaliex la SCRAM u lanqas pawsa għadhom inqatlu. Iżda, x'aktarx, din il-kwistjoni se tiġi solvuta pjuttost malajr.

Pjan direzzjonali Odyssey: x'irridu aktar minn konnessjoni pooler. Andrey Borodin (2019)

Qed nistenna t-talba tal-ġibda tiegħek. Nixtieq ukoll nisma' x'problemi għandek ma' Bouncer. Ejja niddiskutuhom. Forsi nistgħu nimplimentaw xi funzjonijiet li għandek bżonn.

Dan huwa l-aħħar tal-parti tiegħi, nixtieq nismagħkom. Grazzi!

mistoqsijiet

Jekk nissettja l-application_name tiegħi stess, se tintbagħat b'mod korrett, inkluż fil-ġbir ta' tranżazzjonijiet f'Odyssey?

Odyssey jew Bouncer?

Fl-Odissea. F'Bouncer jintefa'.

Aħna ser nagħmlu sett.

U jekk il-konnessjoni reali tiegħi taqbeż fuq konnessjonijiet oħra, se tiġi trażmessa?

Aħna se nagħmlu sett tal-parametri kollha li huma elenkati fil-lista. Ma nistax ngħid jekk application_name hux f'din il-lista. Naħseb li rajtu hemm. Aħna se nissettjaw l-istess parametri kollha. B'talba waħda, is-sett se jagħmel dak kollu li kien installat mill-klijent waqt l-istartjar.

Grazzi, Andrey, għar-rapport! Rapport tajjeb! Ninsab ferħan li Odyssey qed tiżviluppa aktar u aktar malajr kull minuta. Irrid inkompli hekk. Diġà tlabna li jkollok konnessjoni b’ħafna sorsi tad-dejta sabiex Odyssey tkun tista’ tikkonnettja ma’ databases differenti simultanjament, jiġifieri master slave, u mbagħad awtomatikament tikkonnettja ma’ master ġdid wara failover.

Iva, donnu niftakar din id-diskussjoni. Issa hemm diversi ħażniet. Iżda m'hemm l-ebda bidla bejniethom. Min-naħa tagħna, irridu nivverifikaw is-server li għadu ħaj u nifhmu li seħħ failover, li se jsejjaħ pg_recovery. Għandi mod standard kif nifhem li aħna ma wasalniex għand il-kaptan. U għandna nifhmu b'xi mod mill-iżbalji jew xiex? Jiġifieri l-idea hija interessanti, qed tiġi diskussa. Ikteb aktar kummenti. Jekk għandek ħaddiema li jafu C, allura dan huwa kbir.

Il-kwistjoni tal-iskala tar-repliki hija wkoll ta 'interess għalina, għaliex irridu nagħmlu l-adozzjoni ta' clusters replikati sempliċi kemm jista 'jkun għall-iżviluppaturi tal-applikazzjonijiet. Imma hawn nixtieq aktar kummenti, jiġifieri eżattament kif tagħmel dan, kif tagħmel tajjeb.

Il-mistoqsija hija wkoll dwar repliki. Jirriżulta li għandek kaptan u diversi repliki. U huwa ċar li jmorru għar-replika inqas spiss milli għand il-kaptan għall-konnessjonijiet, għax jista 'jkollhom differenzi. Inti għedt li d-differenza fid-dejta tista’ tkun tali li ma tissodisfax in-negozju tiegħek u ma tmurx hemm qabel ma tiġi replikata. Fl-istess ħin, jekk ma mortx hemm għal żmien twil, u mbagħad bdejt tmur, allura d-dejta li hija meħtieġa ma tkunx disponibbli immedjatament. Jiġifieri, jekk immorru kontinwament għand il-kaptan, allura l-cache hemm jissaħħan, iżda fir-replika l-cache tibqa 'ftit.

Iva huwa veru. Il-pcache mhux se jkollu l-blokki tad-dejta li trid, il-cache reali mhux se jkollu informazzjoni dwar it-tabelli li trid, il-pjanijiet mhux se jkollhom mistoqsijiet parsed, ma jkun hemm xejn.

U meta jkollok xi tip ta 'cluster, u żżid replika ġdida hemmhekk, imbagħad waqt li tibda, kollox ikun ħażin fih, jiġifieri żżid il-cache tagħha.

Sibt l-idea. L-approċċ korrett ikun li tmexxi persentaġġ żgħir ta 'mistoqsijiet fuq ir-replika l-ewwel, li jsaħħan il-cache. Bejn wieħed u ieħor, għandna kundizzjoni li rridu nibqgħu lura wara l-kaptan b'mhux aktar minn 10 sekondi. U din il-kundizzjoni mhix inkluża f'mewġa waħda, iżda bla xkiel għal xi klijenti.

Iva, żid il-piż.

Din hija idea tajba. Imma l-ewwel irridu nimplimentaw dan l-għeluq. L-ewwel irridu nitfiw, u mbagħad naħsbu dwar kif nixgħlu. Din hija karatteristika kbira biex tippermetti bla xkiel.

Nginx għandu din l-għażla slowly start fi cluster għas-server. U gradwalment iżid it-tagħbija.

Iva, idea kbira, aħna ser nippruvawha meta ngħaddu għaliha.

Sors: www.habr.com

Żid kumment