SavÄ runÄ Andrejs Borodins pastÄstÄ«s, kÄ viÅi ÅÄma vÄrÄ PgBouncer mÄrogoÅ”anas pieredzi, veidojot savienojumu pÅ«lÄtÄju.
Video:
Sveiki visiem! Mani sauc Endrjū.
Yandex es izstrÄdÄju atvÄrtÄ koda datu bÄzes. Un Å”odien mums ir tÄma par savienojumu pÅ«les savienojumiem.
Ja zini kÄ piezvanÄ«t pieslÄgumu pulerim krieviski, tad pastÄsti. Es ļoti vÄlos atrast labu tehnisko terminu, kas bÅ«tu jÄiekļauj tehniskajÄ literatÅ«rÄ.
TÄma ir diezgan sarežģīta, jo daudzÄs datu bÄzÄs ir iebÅ«vÄts savienojumu pÅ«lÄtÄjs, un jums par to pat nav jÄzina. Daži iestatÄ«jumi, protams, ir visur, taÄu programmÄ Postgres tas nedarbojas. Un paralÄli (pie HighLoad++ 2019) ir Nikolaja Samokhvalova ziÅojums par vaicÄjumu iestatÄ«Å”anu Postgres. Un es saprotu, ka Å”eit ir nÄkuÅ”i cilvÄki, kuri jau ir perfekti konfigurÄjuÅ”i pieprasÄ«jumus, un tie ir cilvÄki, kas saskaras ar retÄkÄm sistÄmas problÄmÄm, kas saistÄ«tas ar tÄ«klu, resursu izmantoÅ”anu. Un dažviet tas var bÅ«t diezgan grÅ«ti tÄdÄ ziÅÄ, ka problÄmas nav acÄ«mredzamas.
Yandex ir Postgres. Daudzi Yandex pakalpojumi atrodas Yandex.Cloud. Un mums ir vairÄki petabaiti datu, kas Postgres Ä£enerÄ vismaz miljonu pieprasÄ«jumu sekundÄ.
Un mÄs nodroÅ”inÄm diezgan tipisku kopu visiem pakalpojumiem - tas ir mezgla galvenais primÄrais mezgls, parastÄs divas kopijas (sinhronÄ un asinhronÄ), dublÄÅ”ana, lasÄ«Å”anas pieprasÄ«jumu mÄrogoÅ”ana replikÄ.
Katrs klastera mezgls ir Postgres, kurÄ papildus Postgres un uzraudzÄ«bas sistÄmÄm ir uzstÄdÄ«ts arÄ« savienojumu pÅ«lÄtÄjs. Connection pooler tiek izmantots žogam un tÄ galvenajam mÄrÄ·im.
KÄds ir savienojuma apkopotÄja galvenais mÄrÄ·is?
Postgres pieÅem procesa modeli darbam ar datu bÄzi. Tas nozÄ«mÄ, ka viens savienojums ir viens process, viena Postgres aizmugursistÄma. Un Å”ajÄ aizmugursistÄmÄ ir daudz dažÄdu keÅ”atmiÅu, kuras ir diezgan dÄrgas, lai tÄs bÅ«tu atŔķirÄ«gas dažÄdiem savienojumiem.
TurklÄt Postgres kodÄ ir masÄ«vs, ko sauc par procArray. TajÄ ir ietverti pamata dati par tÄ«kla savienojumiem. Un gandrÄ«z visiem procArray apstrÄdes algoritmiem ir lineÄra sarežģītÄ«ba, tie darbojas visÄ tÄ«kla savienojumu klÄstÄ. Tas ir diezgan Ätrs cikls, taÄu, palielinoties ienÄkoÅ”ajam tÄ«kla savienojumam, lietas kļūst nedaudz dÄrgÄkas. Un, kad lietas kļūst nedaudz dÄrgÄkas, jÅ«s galu galÄ maksÄjat ļoti augstu cenu par lielu skaitu tÄ«kla savienojumu.
Ir 3 iespÄjamÄs pieejas:
- Pieteikuma pusÄ.
- Datu bÄzes pusÄ.
- Un starp, tas ir, visas iespÄjamÄs kombinÄcijas.
DiemžÄl iebÅ«vÄtais baseins paÅ”laik tiek izstrÄdÄts. PÄrsvarÄ to dara PostgreSQL Professional draugi. Kad tas parÄdÄ«sies, ir grÅ«ti paredzÄt. Un patiesÄ«bÄ mums ir divi risinÄjumi arhitekta izvÄlei. Tie ir lietojumprogrammas pÅ«ls un starpniekservera pÅ«ls.
Lietojumprogrammas puses baseins ir vienkÄrÅ”Äkais veids. Un gandrÄ«z visi klientu draiveri sniedz jums iespÄju: kodÄ attÄlot miljoniem savienojumu kÄ dažus desmitus savienojumu ar datu bÄzi.
ProblÄma ir ar to, ka noteiktÄ brÄ«dÄ« vÄlaties mÄrogot aizmugursistÄmu, vÄlaties to izvietot daudzÄs virtuÄlajÄs maŔīnÄs.
Tad jÅ«s joprojÄm saprotat, ka jums ir vÄl vairÄkas pieejamÄ«bas zonas, vairÄki datu centri. Un klienta puses apvienoÅ”anas pieeja rada lielus skaitļus. Lielie ir aptuveni 10 000 savienojumu. Å Ä« ir mala, kas var darboties labi.
Ja mÄs runÄjam par starpniekserveriem, tad ir divi apvienotÄji, kas var paveikt daudzas lietas. ViÅi nav tikai pÅ«lnieki. Tie ir pooleri + vÄl forÅ”Äka funkcionalitÄte. Å is
Bet diemžÄl ne visiem Ŕī papildu funkcionalitÄte ir nepiecieÅ”ama. Un tas noved pie tÄ, ka pÅ«leri atbalsta tikai sesiju apvienoÅ”anu, t.i., vienu ienÄkoÅ”o klientu, vienu izejoÅ”o klientu datu bÄzÄ.
Tas nav Ä«paÅ”i piemÄrots mÅ«su uzdevumiem, tÄpÄc mÄs izmantojam PgBouncer, kas realizÄ transakciju apvienoÅ”anu, t.i., servera savienojumi tiek kartÄti uz klientu savienojumiem tikai uz darÄ«juma laiku.
Un uz mÅ«su slodzes - tÄ ir taisnÄ«ba. TaÄu ir vairÄkas problÄmas.
ProblÄmas sÄkas, kad vÄlaties diagnosticÄt sesiju, jo visi ienÄkoÅ”ie savienojumi ir lokÄli. Visi ieradÄs ar cilpu, un kaut kÄ kļūst grÅ«ti izsekot sesijai.
Protams, varat izmantot application_name_add_host. Å is ir Bouncer sÄnu veids, kÄ pievienot IP adresi lietojumprogrammas_nosaukumam. Bet lietojumprogrammas_nosaukums tiek iestatÄ«ts ar papildu savienojumu.
Å ajÄ diagrammÄ, kur dzeltenÄ lÄ«nija ir reÄli pieprasÄ«jumi, bet zilÄ lÄ«nija ir pieprasÄ«jumi, kas ieplÅ«st datu bÄzÄ. Un Ŕī atŔķirÄ«ba ir tieÅ”i aplikÄcijas_nosaukums iestatÄ«jums, kas nepiecieÅ”ams tikai izsekoÅ”anai, taÄu tas nebÅ«t nav bezmaksas.
TurklÄt Bouncer nevar ierobežot vienu pÅ«lu, t.i., datu bÄzes savienojumu skaitu vienam lietotÄjam vienÄ datu bÄzÄ.
Pie kÄ tas noved? Jums ir ielÄdÄts pakalpojums, kas rakstÄ«ts C ++ valodÄ, un kaut kur tuvumÄ neliels serviss mezglÄ, kas neko sliktu nedara ar bÄzi, bet tÄ draiveris kļūst traks. Tas atver 20 000 savienojumu, un viss pÄrÄjais gaidÄ«s. Pat jÅ«su kods ir pareizs.
Protams, mÄs uzrakstÄ«jÄm nelielu ielÄpu Bouncer, kas pievienoja Å”o iestatÄ«jumu, t.i., ierobežoja klientus lÄ«dz pÅ«lam.
To bÅ«tu iespÄjams izdarÄ«t Postgres pusÄ, t.i., ierobežot lomas datu bÄzÄ ar savienojumu skaitu.
Bet tad jÅ«s zaudÄjat spÄju saprast, kÄpÄc jums nav savienojumu ar serveri. PgBouncer neizmet savienojuma kļūdu, tas vienmÄr atgriež vienu un to paÅ”u informÄciju. Un jÅ«s nevarat saprast: varbÅ«t jÅ«su parole ir mainÄ«jusies, varbÅ«t datu bÄze vienkÄrÅ”i pazuda, varbÅ«t kaut kas nav kÄrtÄ«bÄ. Bet diagnozes nav. Ja sesiju nevar izveidot, jÅ«s nezinÄt, kÄpÄc to nevar izdarÄ«t.
NoteiktÄ brÄ«dÄ« jÅ«s skatÄties lietojumprogrammas grafikus un redzat, ka programma nedarbojas.
Paskatieties uz augÅ”daļu un redziet, ka Bouncer ir viena vÄ«tne. Å is ir pagrieziena punkts pakalpojuma dzÄ«vÄ. JÅ«s saprotat, ka gatavojÄties mÄrogot datubÄzi pusotra gada laikÄ, un jums ir jÄmÄro apkopotÄjs.
MÄs esam nonÄkuÅ”i pie secinÄjuma, ka mums ir nepiecieÅ”ams vairÄk PgBouncers.
Bouncer ir nedaudz aizlÄpÄ«ts.
Un viÅi to panÄca tÄ, ka, atkÄrtoti izmantojot TCP portu, var palielinÄt vairÄkus atlÄcÄjus. Un jau operÄtÄjsistÄma automÄtiski pÄrsÅ«ta ienÄkoÅ”os TCP savienojumus starp tiem, izmantojot round-robin'om.
Klientiem tas ir pÄrskatÄms, t.i., Ŕķiet, ka jums ir viens izlÄcÄjs, taÄu jums ir sadrumstaloti dÄ«kstÄves savienojumi starp palaistiem atlÄcÄjiem.
Un kÄdÄ brÄ«dÄ« jÅ«s varat pamanÄ«t, ka Å”ie 3 atlÄcÄji katrs apÄd savu kodolu par 100%. Jums vajag diezgan daudz Bouncers. KÄpÄc?
Jo jums ir TLS. Jums ir Å”ifrÄts savienojums. Ja salÄ«dzinÄsiet Postgres ar un bez TLS, jÅ«s atklÄsiet, ka izveidoto savienojumu skaits samazinÄs gandrÄ«z par divÄm kÄrtÄm, ja ir iespÄjota Å”ifrÄÅ”ana, jo TLS rokasspiediens patÄrÄ CPU resursus.
Un augÅ”pusÄ jÅ«s varat redzÄt diezgan daudz kriptogrÄfijas funkciju, kas tiek izpildÄ«tas ienÄkoÅ”o savienojumu viļÅa laikÄ. TÄ kÄ mÅ«su primÄrais var pÄrslÄgties starp pieejamÄ«bas zonÄm, ienÄkoÅ”o savienojumu vilnis ir diezgan tipiska situÄcija. Tas ir, kaut kÄdu iemeslu dÄļ vecais primÄrais nebija pieejams, visa slodze tika nosÅ«tÄ«ta uz citu datu centru. ViÅi visi vienlaikus ieradÄ«sies sveikt TLS.
Un liels skaits TLS rokasspiedienu var jau nesasveicinÄties ar Bouncer, bet saspiest viÅam rÄ«kli. IenÄkoÅ”o savienojumu vilnis var kļūt neslÄpÄts taimauta dÄļ. Ja jums ir atkÄrtots mÄÄ£inÄjums uz bÄzi bez eksponenciÄlas atkÄpÅ”anÄs, tie neatgriezÄ«sies atkal un atkal saskaÅotÄ vilnÄ«.
Å eit ir 16 PgBouncers piemÄrs, kas 16% ielÄdÄ 100 kodolus.
Esam nonÄkuÅ”i pie kaskÄdes PgBouncer. Å Ä« ir labÄkÄ konfigurÄcija, ko varam sasniegt ar mÅ«su Bouncer slodzi. MÅ«su ÄrÄjie atlÄcÄji kalpo TCP rokasspiedienam, un iekÅ”Äjie atlÄcÄji kalpo reÄlai apvienoÅ”anai, lai bÅ«tiski nesadrumstalotu ÄrÄjos savienojumus.
Å ajÄ konfigurÄcijÄ ir iespÄjama mÄ«ksta restartÄÅ”ana. Varat restartÄt visus Å”os 18 izlÄcÄjus pa vienam. Bet Å”Ädas konfigurÄcijas uzturÄÅ”ana ir diezgan sarežģīta. SistÄmas administratori, DevOps un cilvÄki, kas patieÅ”Äm ir atbildÄ«gi par Å”o serveri, nebÅ«s ļoti apmierinÄti ar Å”o shÄmu.
Å Ä·iet, ka visus mÅ«su uzlabojumus var reklamÄt atklÄtÄ pirmkodÄ, taÄu Bouncer neatbalsta ļoti labi. PiemÄram, iespÄja palaist vairÄkus PgBouncers vienÄ portÄ tika nodroÅ”inÄta pirms mÄneÅ”a. IzvilkÅ”anas pieprasÄ«jums ar Å”o funkciju tika iesniegts pirms dažiem gadiem.
Vai vÄl viens piemÄrs. ProgrammÄ Postgres varat atcelt darbojoÅ”os pieprasÄ«jumu, nosÅ«tot noslÄpumu citam savienojumam bez papildu autentifikÄcijas. Bet daži klienti vienkÄrÅ”i nosÅ«ta TCP atiestatÄ«Å”anu, t.i., viÅi pÄrtrauc tÄ«kla savienojumu. Ko Bouncer ar to darÄ«s? ViÅÅ” neko nedarÄ«s. Tas turpinÄs izpildÄ«t pieprasÄ«jumu. Ja esat saÅÄmis milzÄ«gu skaitu savienojumu, kas ir likuÅ”i pamatu ar nelieliem pieprasÄ«jumiem, tad ar vienkÄrÅ”u savienojuma atvienoÅ”anu no Bouncer nepietiks, jums ir jÄaizpilda arÄ« tie pieprasÄ«jumi, kas darbojas datu bÄzÄ.
Tas ir izlabots, un problÄma joprojÄm nav apvienota ar Bouncer augÅ”Äjo straumi.
Un tÄ arÄ« nonÄcÄm pie secinÄjuma, ka mums ir nepiecieÅ”ams savs pieslÄgumu pÅ«leris, kurÅ” tiks izstrÄdÄts, ielÄpÄ«ts, kurÄ bÅ«s iespÄjams Ätri novÄrst problÄmas un kuram, protams, jÄbÅ«t daudzpavedienu.
KÄ galveno uzdevumu mÄs uzstÄdÄ«jÄm vairÄku pavedienu izmantoÅ”anu. Mums ir jÄspÄj labi pÄrvaldÄ«t ienÄkoÅ”o TLS savienojumu vilni.
Lai to izdarÄ«tu, mums bija jÄizstrÄdÄ atseviŔķa bibliotÄka ar nosaukumu Machinarium, kas ir paredzÄta, lai aprakstÄ«tu tÄ«kla savienojuma maŔīnas stÄvokļus kÄ sÄrijas kodu. Ja skatÄties uz libpq avota kodu, jÅ«s redzÄsit diezgan sarežģītus zvanus, kas var atgriezt jums rezultÄtu un teikt: "Piezvaniet man nedaudz vÄlÄk. PaÅ”laik man ir IO, bet, kad IO pÄriet, man ir slodze uz procesoru. Un Ŕī ir daudzlÄ«meÅu shÄma. TÄ«kla mijiedarbÄ«bu parasti apraksta stÄvokļa maŔīna. Ä»oti daudz noteikumu, piemÄram, "Ja iepriekÅ” saÅÄmu N izmÄra paketes galveni, tad tagad gaidu N baitus", "Ja nosÅ«tÄ«ju SYNC paketi, tad tagad gaidu paketi ar rezultÄtu metadatiem." RezultÄts ir diezgan sarežģīts pretintuitÄ«vs kods, it kÄ labirints tiktu pÄrveidots par lÄ«niju skenÄÅ”anu. MÄs izveidojÄm tÄ, ka stÄvokļa maŔīnas vietÄ programmÄtÄjs apraksta galveno mijiedarbÄ«bas ceļu parasta imperatÄ«va koda veidÄ. Tikai Å”ajÄ obligÄtajÄ kodÄ ir jÄievieto vietas, kur izpildes secÄ«ba ir jÄpÄrtrauc, gaidot datus no tÄ«kla, izpildes kontekstu nododot citai korutÄ«nai (zaļajam pavedienam). Å Ä« pieeja ir lÄ«dzÄ«ga tam, ka mÄs pÄc kÄrtas pierakstÄm gaidÄ«tÄko ceļu labirintÄ un pÄc tam pievienojam tam zarus.
RezultÄtÄ mums ir viens pavediens, kas liek TCP pieÅemt, un TPC savienojums tiek nodots daudziem darbiniekiem.
Å ajÄ gadÄ«jumÄ katrs klienta savienojums vienmÄr darbojas vienÄ procesorÄ. Un tas ļauj to padarÄ«t draudzÄ«gu keÅ”atmiÅai.
TurklÄt mÄs esam nedaudz uzlabojuÅ”i mazo pakeÅ”u apkopoÅ”anu vienÄ lielÄ paketÄ, lai izkrautu sistÄmas TCP steku.
TurklÄt mÄs esam uzlabojuÅ”i transakciju apvienoÅ”anu tÄdÄ ziÅÄ, ka Odyssey, kad tas ir konfigurÄts, var nosÅ«tÄ«t CANCEL un ROLLBACK tÄ«kla savienojuma kļūmes gadÄ«jumÄ, t.i., ja neviens negaida pieprasÄ«jumu, Odyssey liks datubÄzei nemÄÄ£inÄt to izpildÄ«t. pieprasÄ«jums, kas var izŔķÄrdÄt vÄrtÄ«gos resursus.
Un, kad vien iespÄjams, mÄs uzturam savienojumus ar vienu un to paÅ”u klientu. Tas ļauj izvairÄ«ties no nepiecieÅ”amÄ«bas atkÄrtoti instalÄt application_name_add_host. Ja iespÄjams, tad mums nav papildu diagnostikai nepiecieÅ”amo parametru atiestatÄ«Å”anas.
MÄs strÄdÄjam Yandex.Cloud interesÄs. Un, ja izmantojat pÄrvaldÄ«tu PostgreSQL un jums ir instalÄts savienojumu pÅ«lÄtÄjs, varat izveidot loÄ£isko replikÄciju uz Äru, t.i., atstÄt mÅ«s, ja vÄlaties, izmantojot loÄ£isko replikÄciju. Bouncer Ärpus plÅ«smas loÄ£iskÄs replikÄcijas nedos.
Å is ir loÄ£iskÄs replikÄcijas iestatÄ«Å”anas piemÄrs.
TurklÄt mums ir atbalsts fiziskai replikÄcijai uz Äru. MÄkonÄ« tas, protams, nav iespÄjams, jo tad klasteris sniegs pÄrÄk daudz informÄcijas par sevi. Bet jÅ«su instalÄcijÄs tas ir iespÄjams, ja jums ir nepiecieÅ”ama fiziska replikÄcija, izmantojot Odyssey savienojumu pÅ«lÄtÄju.
Odyssey ir pilnÄ«bÄ saderÄ«gs monitorings ar PgBouncer. Mums ir tÄ pati konsole, kas izpilda gandrÄ«z visas tÄs paÅ”as komandas. Ja kaut kÄ trÅ«kst, nosÅ«tiet izvilkÅ”anas pieprasÄ«jumu vai vismaz GitHub problÄma, mÄs izpildÄ«sim nepiecieÅ”amÄs komandas. Bet mums jau ir galvenÄ PgBouncer konsoles funkcionalitÄte.
Un, protams, mums ir kļūdu pÄrsÅ«tÄ«Å”ana. MÄs atgriezÄ«sim kļūdu, par kuru ziÅo bÄze. IegÅ«si informÄciju, kÄpÄc neesi bÄzÄ, ne tikai to, ka neesi tajÄ.
Å Ä« funkcija ir atspÄjota, ja jums ir nepiecieÅ”ama 100% saderÄ«ba ar PgBouncer. MÄs varam uzvesties kÄ Bouncer, katram gadÄ«jumam.
Attīstība
Daži vÄrdi par Odyssey pirmkodu.
PiemÄram, ir komandas "Pauze / AtsÄkt". Tos parasti izmanto datu bÄzes atjauninÄÅ”anai. Ja nepiecieÅ”ams jauninÄt Postgres, varat to apturÄt savienojuma pÅ«lÄ, veikt pg_upgrade un pÄc tam atsÄkt. Un no klienta puses izskatÄ«sies, ka datubÄze tikai palÄninÄjÄs. Å o funkcionalitÄti mums piedÄvÄja cilvÄki no kopienas. ViÅa vÄl nav mirusi, bet drÄ«z viss bÅ«s. (jau miris)
TurklÄt viena no jaunajÄm PgBouncer funkcijÄm ir SCRAM Authentication atbalsts, ko mums arÄ« atnesa cilvÄks, kurÅ” nestrÄdÄ Yandex.Cloud. Abas ir sarežģītas funkcionalitÄtes un svarÄ«gas.
TÄpÄc vÄlos pastÄstÄ«t, no kÄ ir izgatavots Odisejs, ja nu gadÄ«jumÄ arÄ« tu tagad vÄlies uzrakstÄ«t kÄdu kodu.
Jums ir oriÄ£inÄlÄ Odyssey bÄze, kas balstÄs uz divÄm galvenajÄm bibliotÄkÄm. Kiwi bibliotÄka ir Postgres ziÅojumu protokola ievieÅ”ana. Tas nozÄ«mÄ, ka Postgres vietÄjais proto 3 ir standarta ziÅojumi, ar kuriem var apmainÄ«ties frontends un backends. Tie tiek Ä«stenoti Kiwi bibliotÄkÄ.
Machinarium bibliotÄka ir pavedienu ievieÅ”anas bibliotÄka. Neliels Ŕī Machinarium fragments ir uzrakstÄ«ts montÄžas programmÄ. Bet neuztraucieties, ir tikai 15 rindas.
Odisejas arhitektÅ«ra. Ir galvenÄ maŔīna, kurÄ darbojas korutÄ«nas. Å Ä« iekÄrta nodroÅ”ina ienÄkoÅ”o TCP savienojumu pieÅemÅ”anu un sadali starp darbiniekiem.
Viena darbinieka ietvaros var strÄdÄt apdarinÄtÄjs vairÄkiem klientiem. Un arÄ« galvenajÄ pavedienÄ griežas konsole un crone uzdevumu apstrÄde, lai noÅemtu savienojumus, kas vairs nav vajadzÄ«gi baseinÄ.
Odyssey tiek pÄrbaudÄ«ts, izmantojot standarta Postgres testu komplektu. MÄs vienkÄrÅ”i palaižam instalÄÅ”anas pÄrbaudi, izmantojot Bouncer un Odyssey, mÄs iegÅ«stam null div. Ir vairÄki ar datuma formatÄÅ”anu saistÄ«ti testi, kas neizdodas tieÅ”i tÄpat kÄ programmÄs Bouncer un Odyssey.
TurklÄt ir daudz draiveru, kuriem ir sava pÄrbaude. Un mÄs izmantojam viÅu testus, lai pÄrbaudÄ«tu Odiseju.
TurklÄt, pateicoties mÅ«su kaskÄdes konfigurÄcijai, mums ir jÄpÄrbauda dažÄdi komplekti: Postgres + Odyssey, PgBouncer + Odyssey, Odyssey + Odyssey, lai pÄrliecinÄtos, ka, ja Odyssey atrodas kÄdÄ no kaskÄdes daļÄm, tas arÄ« joprojÄm darbojas, kÄ paredzÄts. .
GrÄbeklis
RažoÅ”anÄ izmantojam Odiseju. Un nebÅ«tu godÄ«gi, ja es teiktu, ka viss vienkÄrÅ”i darbojas. NÄ, t.i., jÄ, bet ne vienmÄr. PiemÄram, ražoÅ”anÄ viss vienkÄrÅ”i strÄdÄja, tad atnÄca mÅ«su draugi no PostgreSQL Professional un teica, ka mums ir atmiÅas noplÅ«de. Tie tieÅ”Äm bija, mÄs tos salabojÄm. Bet tas bija vienkÄrÅ”i.
PÄc tam mÄs noskaidrojÄm, ka savienojumu pÅ«lÄtÄjam ir ienÄkoÅ”ie TLS savienojumi un izejoÅ”ie TLS savienojumi. Un savienojumiem ir nepiecieÅ”ami klienta sertifikÄti un servera sertifikÄti.
Bouncer un Odyssey servera sertifikÄti tiek atkÄrtoti nolasÄ«ti, izmantojot keÅ”atmiÅu, taÄu klientu sertifikÄti nav atkÄrtoti jÄlasa no keÅ”atmiÅas, jo mÅ«su mÄrogojamais Odyssey galu galÄ balstÄs uz sistÄmas veiktspÄju, nolasot Å”o sertifikÄtu. Tas mums bija pÄrsteigums, jo viÅÅ” uzreiz neatpÅ«tÄs. SÄkumÄ tÄ mÄrogoja lineÄri, un pÄc 20 000 ienÄkoÅ”iem vienlaicÄ«giem savienojumiem Ŕī problÄma izpaudÄs.
Pluggable Authentication Method ir iespÄja autentificÄties, izmantojot iebÅ«vÄtos lunux rÄ«kus. ProgrammÄ PgBouncer tas ir ieviests tÄ, ka ir atseviŔķs pavediens, kas gaida atbildi no PAM, un ir galvenais PgBouncer pavediens, kas apkalpo paÅ”reizÄjo savienojumu un var lÅ«gt viÅiem dzÄ«vot PAM pavedienÄ.
MÄs to neieviesÄm viena vienkÄrÅ”a iemesla dÄļ. Mums ir daudz straumju. KÄpÄc mums tas ir vajadzÄ«gs?
RezultÄtÄ tas var radÄ«t problÄmas, jo, ja jums ir PAM autentifikÄcija un ne-PAM autentifikÄcija, tad liels PAM autentifikÄcijas vilnis var ievÄrojami aizkavÄt ne-PAM autentifikÄciju. TÄ ir viena no lietÄm, ko neesam labojuÅ”i. Bet, ja vÄlaties to labot, varat to izdarÄ«t.
VÄl viens grÄbeklis bija ar to, ka mums ir viens pavediens, kas pieÅem visus ienÄkoÅ”os savienojumus. Un tad viÅi tiek pÄrvietoti uz darbinieku kopu, kur notiks TLS rokasspiediens.
RezultÄtÄ, ja jums ir saskaÅots 20 000 tÄ«kla savienojumu vilnis, tie visi tiks pieÅemti. Un klienta pusÄ libpq sÄks ziÅot par taimautiem. PÄc noklusÄjuma tas ir apmÄram 3 sekundes.
Ja viÅi visi nevar iekļūt bÄzÄ vienlaikus, tad viÅi nevar iekļūt bÄzÄ, jo to visu var segt ar neeksponenciÄlu atkÄrtotu mÄÄ£inÄjumu.
MÄs nokopÄjÄm PgBouncer shÄmu Å”eit, lai mÄs ierobežotu pieÅemamo TCP savienojumu skaitu.
Ja redzam, ka pieÅemam savienojumus, bet viÅiem beigÄs nav laika sarokot, ieliekam tos rindÄ, lai tie nepatÄrÄ CPU resursus. Tas noved pie tÄ, ka vienlaicÄ«gs rokasspiediens var netikt veikts visiem izveidotajiem savienojumiem. Bet vismaz kÄds iekļūs datu bÄzÄ, pat ja slodze bÅ«s pietiekami spÄcÄ«ga.
Ceļvedis
Ko jÅ«s vÄlÄtos redzÄt nÄkotnÄ OdisijÄ? Ko esam gatavi paÅ”i attÄ«stÄ«t un ko sagaidÄm no sabiedrÄ«bas?
Par 2019. gada augustu.
Å Ädi izskatÄ«jÄs Odisejas ceļvedis augustÄ:
- MÄs vÄlÄjÄmies SCRAM un PAM autentifikÄciju.
- MÄs vÄlÄjÄmies pÄrsÅ«tÄ«t lasÄ«Å”anas pieprasÄ«jumus uz gaidÄ«Å”anas režīmu.
- Es vÄlos restartÄt tieÅ”saistÄ.
- Un iespÄja pauzÄt uz servera.
Puse no Ŕī ceļveža ir izveidota, nevis mÄs. Un tas ir labi. TÄpÄc apspriedÄ«sim, kas ir palicis, un pievienosim vÄl.
PrincipÄ Postgres, sÄkot no 10, pieslÄdzoties var norÄdÄ«t session_attrs. Varat uzskaitÄ«t visus savienojumÄ esoÅ”os datu bÄzes resursdatorus un pateikt, kÄpÄc jÅ«s dodaties uz datu bÄzi: rakstiet vai tikai lasÄt. Un pats draiveris izvÄlÄsies pirmo resursdatoru no saraksta, kas viÅam vislabÄk patÄ«k un kas atbilst session_attrs prasÄ«bÄm.
TaÄu Ŕīs pieejas problÄma ir tÄ, ka tÄ nekontrolÄ replikÄcijas kavÄÅ”anos. IespÄjams, jums ir kÄda veida kopija, kas ir aizkavÄjusies jÅ«su pakalpojuma sniegÅ”anai nepieÅemamÄ laikÄ. Lai nodroÅ”inÄtu pilnvÄrtÄ«gu lasÄ«Å”anas pieprasÄ«jumu izpildi replikÄ, patiesÄ«bÄ mums Odyssey ir jÄatbalsta iespÄja nedarboties, ja to nav iespÄjams nolasÄ«t.
Odisejai ik pa laikam jÄiet uz datu bÄzi un jÄprasa replikÄcijas attÄlums no primÄrÄ. Un, ja tas ir sasniedzis ierobežojumu, neielaidiet jaunus pieprasÄ«jumus datu bÄzÄ, pastÄstiet klientam, ka jums ir atkÄrtoti jÄuzsÄk savienojumi un, iespÄjams, atlasiet citu resursdatoru, lai izpildÄ«tu pieprasÄ«jumus. Tas ļaus datu bÄzei Ätri atjaunot replikÄcijas kavÄÅ”anos un atgriezties vÄlreiz, lai atbildÄtu ar vaicÄjumu.
Ir grÅ«ti nosaukt ievieÅ”anas datumus, jo tas ir atvÄrtÄ koda. Bet, ceru, ne 2,5 gadus kÄ kolÄÄ£i no PgBouncer. Å Ä« ir iezÄ«me, ko es vÄlÄtos redzÄt OdisijÄ.
Bet ir sagatavots paziÅojums ziÅojuma protokola lÄ«menÄ« uz proto3. Un Ŕī ir vieta, kad informÄcija, ka tiek veidots sagatavotais paziÅojums, nonÄk strukturÄtÄ veidÄ. Un mÄs varÄtu atbalstÄ«t izpratni, ka kÄdÄ servera savienojumÄ klients lÅ«dza izveidot sagatavotus paziÅojumus. Un pat tad, ja darÄ«jums ir slÄgts, mums joprojÄm ir jÄsaglabÄ savienojums ar serveri un klientu.
Bet Å”eit ir nesakritÄ«ba dialogÄ, jo kÄds saka, ka ir jÄsaprot, kÄdus sagatavotos izrakstus klients izveidoja un jÄsadala servera savienojums starp visiem klientiem, kas izveidoja Å”o servera savienojumu, t.i., kas izveidoja Å”Ädu sagatavotu izrakstu.
Andress Freunds teica, ja pie jums ieradÄs klients, kurÅ” jau ir izveidojis Å”Ädu sagatavotu paziÅojumu citÄ servera savienojumÄ, tad izveidojiet to viÅam. Bet Ŕķiet, ka ir nedaudz nepareizi izpildÄ«t vaicÄjumus datu bÄzÄ klienta vietÄ, taÄu no izstrÄdÄtÄja viedokļa, kurÅ” raksta protokolu mijiedarbÄ«bai ar datu bÄzi, bÅ«tu Ärti, ja viÅam vienkÄrÅ”i tiktu pieŔķirts tÄ«kla savienojums kam ir Å”Äds sagatavots pieprasÄ«jums.
Un vÄl viena funkcija, kas mums jÄievieÅ”. Tagad mums ir pÄrraudzÄ«ba, kas ir saderÄ«ga ar PgBouncer. MÄs varam atgriezt vidÄjo vaicÄjuma izpildes laiku. Bet vidÄjais laiks ir vidÄjÄ temperatÅ«ra slimnÄ«cÄ: kÄdam ir auksti, kÄdam silti - vidÄji visi ir veseli. TÄ nav patiesÄ«ba.
JÄievieÅ” atbalsts procentilÄm, kas liecinÄtu, ka ir lÄni pieprasÄ«jumi, kas patÄrÄ resursus un padarÄ«tu uzraudzÄ«bu pieÅemamÄku.
VissvarÄ«gÄkais ir tas, ka es gribu versiju 1.0 (versija 1.1 jau ir izlaista). Fakts ir tÄds, ka tagad Odyssey ir versija 1.0rc, t.i., izlaiduma kandidÄts. Un viss grÄbeklis, ko es uzskaitÄ«ju, tika salabots tieÅ”i ar to paÅ”u versiju, izÅemot atmiÅas noplÅ«di.
Ko mums nozÄ«mÄs versija 1.0? MÄs izvelkam Odiseju uz mÅ«su bÄzÄm. Tas jau darbojas mÅ«su datu bÄzÄs, bet, kad tas sasniedz 1 000 000 pieprasÄ«jumu sekundÄ, tad mÄs varam teikt, ka Ŕī ir izlaiduma versija un Ŕī ir versija, kuru var saukt par 1.0.
VairÄki cilvÄki kopienÄ ir lÅ«guÅ”i vairÄk pauzes un SCRAM versijÄ 1.0. Bet tas nozÄ«mÄs, ka mums bÅ«s jÄizlaiž nÄkamÄ versija ražoÅ”anai, jo ne SCRAM, ne pauze vÄl nav apvienoti. Bet, visticamÄk, Ŕī problÄma tiks atrisinÄta diezgan Ätri.
Es gaidu jÅ«su izvilkÅ”anas pieprasÄ«jumu. Un es arÄ« gribÄtu dzirdÄt, kÄdas problÄmas jums ir ar Bouncer. ApspriedÄ«sim tos. VarbÅ«t varam ieviest kÄdas Jums nepiecieÅ”amÄs funkcijas.
Ar to mana daļa ir beigusies, es vÄlÄtos dzirdÄt no jums. Paldies!
jautÄjumi
Ja es ievietoÅ”u savu aplikÄcijas_nosaukumu, vai tas tiks pareizi izmests, tostarp Odyssey transakciju apvienoÅ”anÄ?
Odiseja vai Bouncer?
OdisijÄ. AtlÄcÄjs tiek izmests.
MÄs izveidosim komplektu.
Un, ja mans Ä«stais savienojums pÄriet pÄri citiem savienojumiem, vai tas tiks pÄrraidÄ«ts?
MÄs izveidosim visu uzskaitÄ«to parametru kopu. Es nevaru pateikt, vai lietojumprogrammas_nosaukums ir Å”ajÄ sarakstÄ. Å Ä·iet, ka viÅÅ” viÅu tur redzÄja. MÄs iestatÄ«sim visus tos paÅ”us parametrus. Ar vienu pieprasÄ«jumu komplekts darÄ«s visu, ko klients instalÄja palaiÅ”anas laikÄ.
Paldies Andrejam par ziÅojumu! Labs ziÅojums! PriecÄjos, ka Odiseja ar katru minÅ«ti attÄ«stÄs arvien ÄtrÄk. Es gribÄtu turpinÄt to paÅ”u. MÄs jau esam lÅ«guÅ”i jums izveidot vairÄku datu avotu savienojumu, lai Odyssey varÄtu vienlaikus izveidot savienojumu ar dažÄdÄm datu bÄzÄm, t.i., vergu galveno, un pÄc tam pÄc kļūmjpÄrlÄces automÄtiski izveidot savienojumu ar jauno galveno.
JÄ, Ŕķiet, es atceros to diskusiju. Tagad ir vairÄkas noliktavas. Bet pÄrslÄgÅ”anÄs starp tÄm nav iespÄjama. No mÅ«su puses mums ir jÄjautÄ serverim, ka tas joprojÄm ir dzÄ«vs, un jÄsaprot, ka ir notikusi kļūmjpÄrlÄce, kurÅ” izsauks pg_recovery. Man ir standarta veids, kÄ saprast, ka mÄs netikÄm pie meistara. Un mums kaut kÄ jÄsaprot no kļūdÄm vai kÄ? RespektÄ«vi, ideja ir interesanta, par to tiek runÄts. Rakstiet vairÄk komentÄru. Ja jums ir darba rokas, kas zina C, tad tas parasti ir lieliski.
MÄrogoÅ”anas problÄma starp replikÄm arÄ« mÅ«s interesÄ, jo mÄs vÄlamies lietojumprogrammu izstrÄdÄtÄjiem padarÄ«t replicÄtu klasteru pieÅemÅ”anu pÄc iespÄjas vienkÄrÅ”Äku. Bet Å”eit es gribÄtu vairÄk komentÄru, tas ir, kÄ to izdarÄ«t, kÄ to izdarÄ«t labi.
JautÄjums ir arÄ« par replikÄm. IzrÄdÄs, ka jums ir meistars un vairÄkas kopijas. Un ir skaidrs, ka viÅi retÄk dodas uz repliku nekÄ pie kapteiÅa pÄc savienojumiem, jo āāviÅiem var bÅ«t atŔķirÄ«ba. JÅ«s teicÄt, ka datu atŔķirÄ«ba var bÅ«t tÄda, ka jÅ«su bizness neapmierinÄs un jÅ«s nedosieties tur, kamÄr tas netiks pavairots. TajÄ paÅ”Ä laikÄ, ja jÅ«s ilgu laiku tur neesat devies un pÄc tam sÄkÄt doties, tad nepiecieÅ”amie dati nebÅ«s uzreiz pieejami. Tas ir, ja mÄs pastÄvÄ«gi ejam pie galvenÄ, tad keÅ”atmiÅa tur tiek iesildÄ«ta, un keÅ”atmiÅa ir nedaudz atpalikusi replikÄ.
JÄ tÄ ir taisnÄ«ba. Pcache nebÅ«s datu bloku, kurus vÄlaties, reÄlajÄ keÅ”atmiÅÄ nebÅ«s informÄcijas par tabulÄm, kuras vÄlaties, plÄnos nebÅ«s parsÄtu vaicÄjumu, vispÄr nekÄ.
Un, kad jums ir kÄda veida klasteris un jÅ«s tur pievienojat jaunu repliku, tad, kamÄr tas sÄkas, tajÄ viss ir slikti, t.i., tas palielina keÅ”atmiÅu.
Es sapratu ideju. PareizÄ pieeja bÅ«tu vispirms veikt nelielu daļu vaicÄjumu replikÄ, kas iesildÄ«tu keÅ”atmiÅu. Rupji runÄjot, mums ir nosacÄ«jums, ka jÄatpaliek no meistara ne vairÄk kÄ 10 sekundes. Un Å”is nosacÄ«jums nav jÄiekļauj vienÄ vilnÄ«, bet raiti dažiem klientiem.
JÄ, palielinÄt svaru.
Å Ä« ir laba ideja. Bet vispirms jums ir jÄÄ«steno Ŕī izslÄgÅ”ana. Vispirms mums ir jÄizslÄdz, un tad mÄs domÄsim, kÄ ieslÄgt. Å Ä« ir lieliska funkcija, lai vienmÄrÄ«gi ieslÄgtos.
nginx ir Ŕī iespÄja slowly start
servera klasterÄ«. Un viÅÅ” pamazÄm palielina slodzi.
JÄ, lieliska ideja, mÄs to izmÄÄ£inÄsim, kad tiksim pie tÄ.
Avots: www.habr.com