Soovitan tutvuda Georgi RÔlovi 2020. aasta alguses peetud ettekande "WAL-G: uued vÔimalused ja kogukonna laienemine" kokkuvÔttega
Open-source'i hooldajatele tekib kasvades palju probleeme. Kuidas kirjutada jĂ€rjest rohkem vajalikke funktsioone, parandada ĂŒha rohkem probleeme ja jĂ”uda jĂ€rjest enam pull request'ide vaatamiseni? WAL-G (PostgreSQLi varundustööriist) nĂ€itel rÀÀgin, kuidas me neid probleeme lahendasime, kĂ€ivitades avatud lĂ€htekoodiga arenduse kursuse ĂŒlikoolis, mida me saavutasime ja kuhu edasi liikuda plaanime.

Tere kÔigile veel kord! Olen arendaja Yandexis Jekaterinburgis. TÀna rÀÀgin WAL-G-st.
Ettekanne pealkirjas ei olnud öeldud, et see on seotud varundustega. Kas keegi ei tea, mis on WAL-G? Kas kÔik teavad? Palun tÔstke kÀsi, kes ei tea. JÔhkralt, te tulite ettekanne kuulama ja ei tea, millest see on.
Las ma rÀÀgin, mis tĂ€na toimub. Meie meeskond on juba mĂ”nda aega varundamisega tegelenud. See on veel ĂŒks ettekande osa seeriast, kus rÀÀgime sellest, kuidas me hoiame andmeid turvaliselt, usaldusvÀÀrselt, mugavalt ja efektiivselt.

Eelnevad osad sisaldasid palju ettekandeid Andrei Borodini ja Vladimir Leskovi poolt. Meid oli palju. Ja me kÔik oleme rÀÀkinud WAL-G-st juba palju aastaid.
clck.ru/F8ioz â
clck.ru/Ln8Qw â
See ettekanne erineb veidi teistest, kuna see keskendub rohkem tehnilisele poolele. RÀÀgin, kuidas me kohtasime probleemidega, mis olid seotud kogukonna kasvuga. Ja kuidas me mÔtlesime vÀlja vÀikese ideed, mis aitab meil sellega toime tulla.

MĂ”ned aastad tagasi oli WAL-G ĂŒsna vĂ€ike projekt, mille saime Citus Datalt. Me lihtsalt vĂ”tsime selle ĂŒle. Ja seda arendas ainult ĂŒks inimene.
Ja WAL-G-s ei olnud:
- Replikatsioonist varukoopiaid.
- Ei olnud inkrementaalset varukoopiaid.
- Ei olnud WAL-Delta varukoopiaid.
- Ja veel palju muud polnud.
Nende aastate jooksul on WAL-G tugevasti kasvanud.

Ja 2020. aastaks olid kĂ”ik ĂŒlaltoodud omadused juba olemas. Ja sellele lisandus veel see, et meil on nĂŒĂŒd:
- Rohkem kui 1 000 tÀhte GitHubis.
- 150 fork'i.
- Umbes 15 avatud PR-i.
- Ja veel palju kontribuutoreid.
- Ja avatud probleeme on pidevalt. Ja see on arvestades, et me kÀime seal sÔna otseses mÔttes iga pÀev ja teeme midagi selle nimel.

Ja jÔudsime jÀreldusele, et see projekt vajab rohkem meie tÀhelepanu, isegi siis, kui meil endil ei ole vaja midagi meie hallatavate andmebaaside teenuse jaoks Yandext rakendada.
Ja kuskil 2018. aasta sĂŒgisel tuli meile idee. Tavaliseeriti, et meeskonnal on mitmeid viise, kuidas funktsioone arendada ja vigu parandada, kui kĂ€si on puudu. NĂ€iteks vĂ”ite palgata veel ĂŒhe arendaja ja maksta talle raha. VĂ”i vĂ”ite vĂ”tta praktikandi teatud ajaks ja maksta ka talle mingit palka. Kuid on ka veel pĂ€ris suur hulk inimesi, kellest osa oskab juba tegelikult koodi kirjutada. Lihtsalt te ei tea alati, millise kvaliteediga see kood on.
Oleme mĂ”elnud ja otsustanud ĂŒritada tudengeid kaasata. Kuid tudengid ei osale meil kĂ”iges. Nad teevad ainult osa tööst. NĂ€iteks kirjutavad nad teste, parandavad vigu ja rakendavad funktsioone, mis ei mĂ”juta pĂ”hifunktsionaalsust. PĂ”hifunktsionaalsus on varukoopiate loomine ja nende taastamine. Kui lasta sisse viga varukoopia loomises, kaotame andmed. Ja keegi ei taha seda, loomulikult. KĂ”ik soovivad, et kĂ”ik oleks vĂ€ga usaldusvÀÀrne. SeetĂ”ttu ei soovi me lubada koodi, millele me ei usalda vĂ€hem kui omaenda. St iga mittetĂ€htis kood on see, mida sooviksime saada oma lisatöötajate kĂ€est.
Millistel tingimustel aktsepteeritakse tudengi PR-i
- Nad peavad katma oma koodi testidega. KÔik peab lÀbima CI.
- Ja lĂ€binud 2 ĂŒlevaatust. Ăks Andrei Borodini ja ĂŒks minu omalt.
- Lisaks, et veenduda, et see ei riku midagi meie teenuses, laadisin ma eraldi selle pĂ€ringuga ĂŒles ehituse. Ja me kontrollime end-to-end testides, et meil ei jÀÀ midagi katki.
Erikursus avatud lÀhtekoodiga

Veidi sellest, miks see vajalik on ja miks see, minu arvates, on Àge idee.
Meile on kasu ilmne:
- Me saame tÀiendavaid kÀsi.
- Ja otsime meeskonda andekaid tudengeid, kes kirjutavad head koodi.
Milline on kasu tudengitele?
See vĂ”ib olla vĂ€hem ilmne, sest tudengid, vĂ€hemalt, ei saa raha selle eest, mida nad kirjutavad, vaid saavad ainult hindesĂŒsteemi punkte.
KĂŒsin nende kĂ€est. Ja nende sĂ”nul:
- Open Source'i kontributori kogemus.
- Saada rida oma CV-sse.
- TÔestada ennast ja lÀbida vestlus Yandexis.
- Osaleda GSoCi-s.
- +1 erikursus neile, kes soovivad koodi kirjutada.
Ma ei hakka rÀÀkima, kuidas kursus oli ĂŒles ehitatud. Ătlen ainult, et WAL-G oli pĂ”hiprojekt. Lisaks sisaldas see kursus ka projekte nagu Odyssey, PostgreSQL ja ClickHouse.
Ja andsime ĂŒlesandeid mitte ainult sellel kursusel, vaid andsime vĂ€lja ka diplomeid ja kursusetöid.
Aga milline on kasu kasutajatele?
NĂŒĂŒd liigume osa juurde, mis tĂ”enĂ€oliselt huvitab teid. Mis kasu teil sellest on? Kasu on selles, et tudengid parandasid palju vigu. Ja tegid funktsioonitaotlusi, mida te soosite, et me teeksime.
Ja rÀÀgin teile asjadest, mida te olete ammu soovinud ja mis on nĂŒĂŒd ellu viidud.

Tablespace'ide tugi. Tablespace'id WAL-G-s on oodatud juba WAL-G vÀljaandmisest saadik, kuna WAL-G on WAL-E nimelise teise varundustööriista jÀreltulija, kus oli toetatud andmebaaside varukoopiad tablespace'idega.
Kordaks lĂŒhidalt, mis asi see on ja miks see vajalik on. Ăldiselt hĂ”ivavad kĂ”ik vahemĂ€lu Postgres'i andmed ĂŒhe kausta failisĂŒsteemis, mida nimetatakse baasiks. See kaust sisaldab kĂ”iki faile ja alamkaustu, mis on Postgres'ile vajalikud.
Tablespace'id on kaustad, kus asuvad Postgres'i andmed, kuid need ei asu baasikaustast vÀljas. Slidil on nÀha, et tablespace'id asuvad vÀljaspool baasi kausta.

Kuidas see Postgresâis vĂ€lja nĂ€eb? Baasikaustas on eraldi alamkaust pg_tblspc. Ja selle sees on sĂŒmboolsed lingid kaustadele, kus asuvad Postgres'i andmed vĂ€ljaspool baasikausta.

Kui te seda kĂ”ike kasutate, vĂ”ivad need kĂ€sud teie jaoks vĂ€lja nĂ€ha umbes nii. St. loote tabeli mĂ”nes mÀÀratud tablespace'is ja vaatate, kus see nĂŒĂŒd asub. Need kaks viimast rida, kaks viimast kĂ€sku. Sealt on nĂ€ha, et seal on mingi tee. Aga tegelikult â see ei ole tĂ”eline tee. See on tee, millel on eeltingimus pĂ”hikaustast tablespace'i. Ja sealt on see seotud sĂŒmboolse lingiga, mis viib teie tegelike andmeteni.
Meie tiimis seda kĂ”ike ei kasutata, kuid paljude teiste WAL-E kasutajate seas, kes kirjutasid meile, et nad soovivad ĂŒle minna WAL-G-le, oli see probleemiks. NĂŒĂŒd on see toetatud.

Teine funktsioon, mille meie spetsiaalne kursus meile tÔi, on catchup. Catchupist teavad inimesed, kes on ilmselt rohkem töötanud Oracle'iga kui Postgres'iga.
LĂŒhidalt, mis see on. Nii vĂ”ib meie teenuse klastritopoloogia vĂ€lja nĂ€ha. Meil on peamine server. On replikatsiooniserver, mis voogedastab sellest write-ahead log'i. Ja replikatsiooniserver ĂŒtleb peamisele serverile, millisel LSN-il ta praegu on. Ja samal ajal vĂ”ib log'i arhiivida. Lisaks log'i arhiivimisele saadetakse ka varukoopiad pilve. Ja saadetakse delta-varukoopiad.
Milline vĂ”ib olla probleem? Kui teil on ĂŒsna suur andmebaas, vĂ”ib juhtuda, et replikatsiooniserver jÀÀb peamisest serverist tugevalt maha. Ja ta jÀÀb nii palju maha, et ei suuda enam kunagi jĂ€rele jĂ”uda. Selle probleemi lahendamiseks tuleb tavaliselt midagi ette vĂ”tta.
Ja kĂ”ige lihtsam viis â on eemaldada replikatsiooniserver ja seadistada see uuesti, kuna ta ei suuda kunagi enam jĂ€rele jĂ”uda, aga probleemiga tuleb tegeleda. Kuid see vĂ”tab ĂŒsna kaua aega, kuna 10 TB andmebaasi taastamine on vĂ€ga, vĂ€ga aeganĂ”udev. Tahame selliseid probleeme lahendada vĂ”imalikult kiiresti. Just selleks ongi mĂ”eldud catchup.
Catchup vĂ”imaldab kasutada delta-varukoopiate tegemist, mis salvestatakse pilve sellisel viisil. Te ĂŒtlete, millisel LSN-il asub praegu mahajÀÀv replika, ja mÀÀrate selle catchup kĂ€sus, et luua delta-varukoopia nende LSN-ide vahel, kus asub teie klaster. SeejĂ€rel taastate selle varukoopia mahajÀÀvale replikale.
Teised baasid
Veel tÔid tudengid meile kohe palju funktsioone. Kuna me Yandaxis töötleme mitte ainult Postgres, meil on ka MySQL, MongoDB, Redis, ClickHouse, siis mingil hetkel vajasime, et saaksime teha varukoopiad point-in-time taastamise vÔimalusega MySQL jaoks ning et oleks vÔimalik need pilve laadida.
Ja me soovisime seda teha kuidagi sarnasel viisil nagu teeb WAL-G. Otsustasime eksperimenteerida ja vaadata, kuidas see kÔik vÀlja nÀeb.
Alguses ei jaganud me seda loogikat ja kirjutasime koodi otse forki. NĂ€gime, et meil on mingi toimiv mudel ja see vĂ”ib toimida. Hiljem mĂ”tlesime, et meie peamine kogukond on postgresâi kasutajad, kes kasutavad WAL-G-d. SeetĂ”ttu tuleb neid osi mingil viisil eraldada, st kui me parandame koodi Postgresi jaoks, ei rikku me MySQL-i, ja kui me parandame MySQL-i, ei rikku me Postgresi.

Esimene idee selle kohta, kuidas seda jagada, oli idee kasutada sama lĂ€henemist, mida kasutatakse PostgreSQL-i laiendustes. Ja pĂ”himĂ”tteliselt, et MySQL-i varundamiseks pidite paigaldama mingi dĂŒnaamilise teegi.
Kuid kohe on nĂ€ha selle lĂ€henemise asĂŒmmeetriat. Kui te varundate Postgresi, paigaldatakse sellele normaalne varundustööriist Postgresi jaoks ja kĂ”ik on suurepĂ€rane. MySQL-i puhul selgub, et te paigaldate Postgresi varundustööriista ja selle jaoks paigaldatakse veel dĂŒnaamiline teek MySQL-i jaoks. See kĂ”lab kuidagi kummaliselt. Me mĂ”tlesime ka nii ja otsustasime, et see ei ole lahendus, mida me vajame.
Erinevad kogud Postgresi, MySQL, MongoDB, Redis jaoks
Kuid see vĂ”imaldas meil, nagu me arvame, jĂ”uda Ă”igele lahendusele â eraldada erinevad kogud erinevatele andmebaasidele. See vĂ”imaldas isoleerida loogika, mis oli seotud erinevate andmebaaside varundamisega, mis pöördusid ĂŒhise API poole, mida rakendab WAL-G.

See on see osa, mille me ise kirjutasime â enne seda, kui andsime Ă”pilastele ĂŒlesandeid. St. see on just see osa, kus nad vĂ”iksid midagi valesti teha, seetĂ”ttu otsustasime, et parem on, kui teeme ise midagi Ă”igesti ja kĂ”ik lĂ€heb suurepĂ€raselt.

PĂ€rast seda meie andsime ĂŒlesandeid. Need kohe jagati Ă€ra. Ăpilastelt oodati kolme andmebaasi toetust.
See on MySQL, mida me varundame WAL-G abil juba ĂŒle aasta sellisel viisil.
Ja nĂŒĂŒd juba MongoDB lĂ€heneb produktiivsusele, seal seda lihvitakse. PĂ”himĂ”tteliselt kirjutasime kogu selle raamistiku meie. Siis kirjutasid Ă”pilased mingeid töötavaid asju. Ja seejĂ€rel viime need sellisesse seisundisse, mille me saame oma tootmises aktsepteerida.
Need ĂŒlesanded ei tundunud sellistena, et Ă”pilastelt oleks oodatud igasuguste backup-tĂ€iendite kirjutamine iga andmebaasi jaoks. Meil sellist probleemi ei olnud. Meie probleem oli see, et soovisime punkt-punkti taastumist ning et tahame varundada pilve. Ja palusime Ă”pilastel kirjutada mingit koodi, mis seda lahendaks. Ăpilased kasutasid juba olemasolevaid backup-tĂ€iendusi, mis mingil moel varundavad, ja seejĂ€rel ĂŒhendati see kĂ”ik WAL-G-ga, mis edastas selle kĂ”ik pilve. Samuti lisati sellele punkt-punkti taastamine.

Mida veel tĂ”id Ă”pilased? Nad tĂ”id WAL-G-le Libsodium krĂŒpteerimise toe.
NĂŒĂŒd on meil ka varukoopiate sĂ€ilitamise poliitikad. NĂŒĂŒd saab varukoopiad tĂ€histada pĂŒsivatena. Ja nagu kuidagi mugavam automatiseerida nende sĂ€ilitamise protsessi teie teenusele.

Mida me selle eksperimendi tulemustena saime?
Alguses registreerus kursusele enam kui 100 inimest. Ma ei öelnud alguses, et Ălikool Ekaterinburgis on Uuralite FöderaalĂŒlikool. Seal me kĂ”ik kuulutasime vĂ€lja. 100 inimest registreerus. Tegelikult hakkas reaalselt midagi tegema palju vĂ€hem, umbes 30 inimest.
Kursuse lĂ”petas veel vĂ€hem inimesi, kuna seal tuli kirjutada testid olemasolevale koodile. Samuti pidi parandama mingit viga vĂ”i tegema mingit funktsiooni. Ja osa ĂŒliĂ”pilasi lĂ”petas ikkagi kursuse.
Praeguseks on ĂŒliĂ”pilased selle kursuse raames parandanud umbes 14 probleemipunkti, teinud 10 erineva suurusega funktsiooni. Ja mulle tundub, et see on tĂ”eline asendus ĂŒhe-kahte arendajat.
KĂ”ikidest neist andsime vĂ€lja diplome ja kursusetöid. 12 vĂ”tsid diplomid. 6 neist on juba kaitsnud «5» hindega. ĂlejÀÀnud ei ole veel kaitsnud, kuid ma arvan, et neilgi lĂ€heb hĂ€sti.
Tulevikuplaanid
Millised on meie tulevikuplaanid?
KÔige vÀhem on neid funktsioonisoove, mida oleme juba kasutajatelt kuulnud ja mida tahame teostada. Need on:
- Ajaskaalal korraliku jÀlgimise tagamine HA-kliendi varukoopiate arhiivis. Selleks saame kasutada WAL-G-d. Ja ma arvan, et leidub tudengeid, kes on valmis selle tööga tegelema.
- Varukoopiate ja WAL-i ĂŒleviimise eest erinevate pilvede vahel vastutab meil juba ĂŒks inimene.
- Olemegi hiljuti avaldanud idee, et saame WAL-G-d veelgi kiiremaks muuta, kasutades inkrementaalsete varukoopiate lahtipakkimist ilma lehekĂŒlgede ĂŒlekirjutamiseta ja optimeerides arhiive, mida sinna saadame.
VÔite neid siin jagada.
Milleks see ettekande eesmĂ€rk oli? Selleks, et praegu, peale meie nelja inimese, kes seda projekti toetavad, on meil ka mitmeid lisakĂ€si. Eriti kui nendele kirjutada isiklikult. Ja kui te teete oma andmete varukoopiaid ning kasutate selleks WAL-G-d vĂ”i soovite selle peale ĂŒle minna, siis saame teie soove ĂŒsna lihtsalt arvesse vĂ”tta.

See qr-kood ja link. Nende kaudu saate minna ja kirjutada kĂ”ik oma soovid. NĂ€iteks mĂ”nda viga me ei lahenda. VĂ”i mĂ”nda funktsiooni, mida te vĂ€ga soovite, aga mis mingil pĂ”hjusel pole veel ĂŒheski varunduses, sealhulgas meie omas. Kindlasti kirjutage sellest.

KĂŒsimused
Tere! AitĂ€h ettekande eest! KĂŒsimus on WAL-G kohta, aga mitte Postgresi osas. WAL-G varundab MySQL-i ja kutsub vĂ€lja ekstra-varunduse. Kui vĂ”tta kaasaegsed installatsioonid CentOS-il ja kui teete yum install MySQL, siis installitakse MariDB. Alates versioonist 10.3 ei toetata ekstra-varundust, toetatakse MariDB varundust. Kuidas teil sellega lood on?
Praegu me ei ole ĂŒritanud varundada MariDB-d. Meil on olnud pĂ€ringud FoundationDB toe kohta, aga ĂŒldiselt, kui selline pĂ€ring on, siis saame leida inimesi, kes sellega tegeleksid. See ei ole nii pikk ja mitte nii keeruline, nagu mulle tundub.
Tere pĂ€evast! AitĂ€h ettekande eest! KĂŒsimus on potentsiaalsete uute funktsioonide kohta. Kas olete valmis sundima WAL-G tööle teipidega, et varundust teipidele teha?
Kas mÔeldakse varundust lintlao jaoks?
Jah.
Seal on Andrei Borodin, kes sellele kĂŒsimusele paremini vastata oskab.
(Andrei) Jah, aitĂ€h kĂŒsimuse eest! Meil oli taotlus varukoopia ĂŒlekandmiseks lintidele pilveteenusest. Ja selleks ĂŒlekanded pilvede vahel. Sest ĂŒlekandmine pilvede vahel on teatud ĂŒldistamine ĂŒlekandmisest lintidele. Lisaks on meie salvestuste arhitektuur laiendatav. Muide, paljusid salvestusi on kirjutanud ĂŒliĂ”pilased. Ja kui te kirjutate salvestuse lintide jaoks, siis see kindlasti saab toetust. Oleme valmis vaatama pull requeste. Seal tuleb faili kirjutada, faili lugeda. Kui need asjad teha Go-s, siis tavaliselt lĂ€heb 50 koodi rida. Ja siis toetatakse WAL-G-s linti.
AitĂ€h ettekande eest! Huvi arendamisprotsessi vastu. Varukoopia on tĂ”sine funktsionaalsus, mis peab olema hĂ€sti kaetud testidega. Kui te realiseerisite uute andmebaaside jaoks funktsionaalsust, siis kas testid kirjutasid samuti ĂŒliĂ”pilased vĂ”i kirjutasite testid ise ja andsite seejĂ€rel rakendamise ĂŒliĂ”pilastele?
Testid tegid samuti ĂŒliĂ”pilased. Kuid ĂŒliĂ”pilased tegid rohkem selliste funktsioonide jaoks, nagu uued andmebaasid. Nad tegid integratsioonitestid. Ja nad tegid unit-testid. Kui integratsioonitestid lĂ€bivad, st hetkel - see on stsenaarium, mida teete kĂ€sitsi vĂ”i teeb selle teie eest nĂ€iteks cron. See tĂ€hendab, et stsenaarium on vĂ€ga arusaadav.
ĂliĂ”pilastel pole palju kogemusi. Kui palju aega kulub ĂŒlevaatamiseks?
Jah, ĂŒlevaatamiseks kulub ĂŒsna palju aega. See tĂ€hendab, et tavaliselt, kui tuleb korraga mitu komiteerijat ja ĂŒtlevad, et ma tegin seda, ma tegin toda, siis tuleb mĂ”elda ja eraldada kuskil pool pĂ€eva, et mĂ”ista, mida nad on kirjutanud. Sest kood tuleb hoolikalt lugeda. Nad ei ole ju intervjuud lĂ€binud. Me ei tunne neid vĂ€ga hĂ€sti, seega vĂ”tab see mĂ€rkimisvÀÀrselt aega.
AitÀh ettekande eest! Varem on Andrei Borodin kinnitanud, et archive_command WAL-G-s peab olema otse kutsutud. Kuid mÔne patroonklasteri puhul vajame tÀiendavat loogikat, et mÀÀrata, millisest noodist saata vahu. Kuidas te seda probleemi enda juures lahendate?
Milles teisel teema juures probleem on? Oletame, et teil on sĂŒnkroonne koopia, millest teete varukoopia? VĂ”i mis?
(Andrei) Asi on selles, et tĂ”epoolest eeldab WAL-G shell-skriptide puudumist. Kui midagi on puudu, siis laske meil kirjutada loogika, mis peaks olema WAL-G sees. Mis puudutab arhiveerimise alguskohta, siis usume, et arhiveerimine peaks toimuma praeguselt peMasterilt klastris. Arhiveerimine koopiast on halb mĂ”te. Seal vĂ”ivad tekkida erinevad probleemiskenenaarid. EelkĂ”ige ajakava arhiveerimise ja muude lisainformatsioonidega seotud probleemid. AitĂ€h kĂŒsimuse eest!
(Selgitus: Shell-skriptide mÀhistest on loobutud )
Tere Ôhtust! AitÀh ettekande eest! Mind huvitas catchup funktsioon, millest rÀÀkisite. Olen kokku puutunud olukorraga, kus koopia jÀi maha ja ei saanud kuidagi jÀrele. Ja WAL-G-s ei leidnud ma selle funktsiooni kirjeldust dokumentatsioonis.
Catchup ilmus sĂ”na otseses mĂ”ttes 20. jaanuari paiku 2020. Ahn dokumentatsiooniga tasuks vĂ”ib-olla rohkem tööd teha. Me kirjutame seda ise ja ei kirjuta seda just super hĂ€sti. Ja vĂ”ib-olla peaksime ĂŒliĂ”pilastelt rohkem nĂ”udma, et nad seda kirjutaksid.
Kas see on juba vÀlja antud?
Pull request on juba ĂŒhendatud, st olen selle ĂŒle vaadanud. Proovisin seda testklastris. Meil pole seni olnud olukorda, kus saaksime seda tootmisnĂ€ites kontrollida.
Millal oodata?
Ma ei tea. Oodake kuu aega, siis kontrollime tÀpselt.
Allikas: habr.com
