Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

Savā runā Andrejs Borodins pastāstÄ«s, kā viņi ņēma vērā PgBouncer mērogoÅ”anas pieredzi, veidojot savienojumu pÅ«lētāju. Odyssey, kā viņi to ieviesa ražoÅ”anā. Turklāt mēs pārrunāsim, kādas pÅ«les funkcijas mēs vēlētos redzēt jaunajās versijās: mums ir svarÄ«gi ne tikai segt savas vajadzÄ«bas, bet arÄ« attÄ«stÄ«t lietotāju kopienu ŠžŠ“ŠøссŠµŃ.

Video:

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

Sveiki visiem! Mani sauc Endrjū.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

Yandex es izstrādāju atvērtā koda datu bāzes. Un Å”odien mums ir tēma par savienojumu pÅ«les savienojumiem.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

Yandex ir Postgres. Daudzi Yandex pakalpojumi atrodas Yandex.Cloud. Un mums ir vairāki petabaiti datu, kas Postgres ģenerē vismaz miljonu pieprasījumu sekundē.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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ā.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

Kāds ir savienojuma apkopotāja galvenais mērķis?

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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 pgpool Šø KraukŔķīgs starpniekserveris.

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

Un uz mūsu slodzes - tā ir taisnība. Taču ir vairākas problēmas.Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

Å 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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

Turklāt Bouncer nevar ierobežot vienu pūlu, t.i., datu bāzes savienojumu skaitu vienam lietotājam vienā datu bāzē.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

Protams, mēs uzrakstÄ«jām nelielu ielāpu Bouncer, kas pievienoja Å”o iestatÄ«jumu, t.i., ierobežoja klientus lÄ«dz pÅ«lam.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

To būtu iespējams izdarīt Postgres pusē, t.i., ierobežot lomas datu bāzē ar savienojumu skaitu.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

Noteiktā brīdī jūs skatāties lietojumprogrammas grafikus un redzat, ka programma nedarbojas.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

Mēs esam nonākuÅ”i pie secinājuma, ka mums ir nepiecieÅ”ams vairāk PgBouncers.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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

Bouncer ir nedaudz aizlāpīts.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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?

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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Ä«.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

Å eit ir 16 PgBouncers piemērs, kas 16% ielādē 100 kodolus.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

Å 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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

Å Ä·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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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

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

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

Å is ir loÄ£iskās replikācijas iestatÄ«Å”anas piemērs.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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ā.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

Å Ä« 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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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

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)

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

https://github.com/yandex/odyssey/pull/73 - 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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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 ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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ā.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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?

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

Par tikai lasāmu vaicājumu pārsÅ«tÄ«Å”anu gaidstāves režīmā? Mums ir kopijas, kas, neizpildot pieprasÄ«jumus, vienkārÅ”i uzsildÄ«s gaisu. Mums tie ir nepiecieÅ”ami, lai nodroÅ”inātu kļūmju pārslēgÅ”anu un pārslēgÅ”anu. Ja kādā no datu centriem rodas problēmas, vēlos tos aizņemt ar kādu noderÄ«gu darbu. Tā kā mēs nevaram konfigurēt vienus un tos paÅ”us centrālos procesorus, to paÅ”u atmiņu savādāk, jo citādi replikācija nedarbosies.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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ā.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

SabiedrÄ«bā cilvēki jautāja par sagatavoto paziņojumu atbalstu. Tagad sagatavotu paziņojumu varat izveidot divos veidos. Pirmkārt, jÅ«s varat izpildÄ«t SQL komandu, proti, "sagatavots". Lai saprastu Å”o SQL komandu, mums jāiemācās saprast SQL Bouncer pusē. Tas bÅ«tu pārspÄ«lēti, jo tas ir pārāk daudz, jo mums ir nepiecieÅ”ams viss parsētājs. Mēs nevaram parsēt katru SQL komandu.

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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.

Odisejas ceļvedis: ko vēl mēs vēlamies no savienojumu apvienotāja. Andrejs Borodins (2019)

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

Pievieno komentāru