Pakun tutvuda 2020. aasta jaanuaris Georgi Rylovi ettekandega "WAL-G: uued vÔimalused ja kogukonna laienemine"
Open-source'i hoidjatel tekivad mitmeid probleeme nende kasvu kĂ€igus. Kuidas kirjutada ĂŒha rohkem vajalikke funktsioone, parandada ĂŒha rohkem issues'e ja jĂ”uda vaadata ĂŒha rohkem pull request'e? WAL-G (backup-tööriist PostgreSQL jaoks) nĂ€itel rÀÀgin, kuidas me neid probleeme lahendasime, kĂ€ivitades open-source arenduse kursuse ĂŒlikoolis, mida me saavutasime ja kuhu me edasi liigume.

Tere jÀlle kÔigile! Olen Yandexes arendaja ja tulen Jekaterinburgist. TÀna rÀÀgin WAL-G-st.
Ettekande pealkirjas ei olnud öeldud, et see on midagi varundamist. Kas keegi ei tea, mis on WAL-G? VÔi kas kÔik teavad? Palun tÔstke kÀsi, kes ei tea. Oi, tulite ettekandele ja ei tea, millest see on.
Lase mul rÀÀkida, mis tĂ€na toimuma hakkab. Juhtub, et meie meeskond on juba pikka aega varundamisega tegelenud. Ja see on veel ĂŒks ettekande sari, kus rÀÀgime sellest, kuidas me andmeid turvaliselt, usaldusvÀÀrselt, mugavalt ja tĂ”husalt salvestame.

Eelmistel sarjadel oli palju ettekandeid Andreist Borodini ja Vladimir Leskovi poolt. Meid oli palju. Ja me kÔik oleme juba aastaid rÀÀkinud WAL-G-st.
clck.ru/F8ioz â
clck.ru/Ln8Qw â
See ettekande erineb natuke teistest, sest seal rÀÀgiti rohkem tehnilisest osast, aga siin rÀÀgin, kuidas me silmitsi seisme kogukonna kasvu probleemidega. Ja kuidas me tuli meelde mÔni vÀike idee, mis aitab meil sellega toime tulla.

MĂ”ned aastat tagasi oli WAL-G ĂŒsna vĂ€ike projekt, mille saime Citus Data'lt. Ja me lihtsalt vĂ”tsime selle ĂŒle. Ja seda arendas ĂŒks inimene.
Ja ainult WAL-G-s polnud:
- Repliigilt varundamist.
- Ei olnud inkrementaalseid varundusi.
- Ei olnud WAL-Delta varundusi.
- Ja veel palju asju polnud.
MÔne aasta jooksul on WAL-G tugevalt kasvanud.

Ja 2020. aastaks oli kĂ”ik eespool loetletud juba olemas. Ja lisaks sellele on meil nĂŒĂŒd:
- Rohkem kui 1 000 tÀhte GitHub'is.
- 150 hargnemist.
- Umbes 15 avatud PR-d.
- Ja veel palju kaastöölisi.
- Ja pidevalt avatud issues. Ja see, et me lÀheme sinna sÔna otseses mÔttes igapÀevaselt sisse ja teeme sellega midagi.

Ja me jÔudsime jÀreldusele, et see projekt vajab rohkem meie tÀhelepanu, isegi siis, kui meile endale ei ole vaja midagi meie haldusteenuste jaotuses Yandexis ellu viia.
Ja ja ĂŒks sĂŒgisel 2018. aastal tuli meile mĂ”te. Tavaliselt on meeskonnal mitu viisi, kuidas funktsioone arendada, vigu parandada, kui kĂ€ed on vĂ€he. NĂ€iteks vĂ”ib koondada ĂŒhe uue arendaja ning maksta talle palka. VĂ”i vĂ”ite vĂ”tta praktikandi mingiks ajaks ja maksta ka temale mingit palka. Kuid on veel ĂŒsna suur hulk inimesi, kellest osa oskab juba tĂ”eliselt koodi kirjutada. Lihtsalt te ei pruugi alati teada, milline on selle koodi kvaliteet.
Me mĂ”tlesime ja otsustasime proovida kaasata tudengeid. Kuid tudengid ei osale meie juures kĂ”iges. Nad teevad ainult osa tööst. NĂ€iteks kirjutavad nad teste, parandavad vigu, rakendavad funktsioone, mis ei mĂ”juta pĂ”hifunktsionaalsust. PĂ”hifunktsionaalsus on varukoopiate loomine ja varukoopiate taastamine. Kui lasta lĂ€bi viga varukoopia loomisel, saame me andmete kaotuse. Ja seda ei soovi keegi. KĂ”ik soovivad, et kĂ”ik oleks vĂ€ga usaldusvÀÀrne. SeetĂ”ttu ei soovi me lasta vĂ€hese usaldusvÀÀrsusega koodi meie sĂŒsteemi. Ehk iga mitte-kriitiline kood on see, mida me tahaksime saada meie tĂ€iendavatelt töötaja kĂ€elt.
Millistel tingimustel aktsepteeritakse tudengi PR-i
- Nad peavad katma oma koodi testidega. KÔik peab lÀbima CI.
- Ja lĂ€bime samuti 2 ĂŒlevaatust. Ăks Andrei Borodinilt ja ĂŒks minult.
- Lisaks, et kontrollida, et see ei rikuks meie teenuses midagi, laadime ma eraldi versiooni selle commitiga. Ja me kontrollime end-to-end testides, et meil ei lendaks midagi kokku.
Erikursus Open Source'i kohta

Veidi selle kohta, miks see on vajalik ja miks see, minu arvates, on lahe idee.
Meie jaoks on kasu ilmselge:
- Saame tÀiendavad kÀed.
- Ja otsime meie meeskonda asjatundlikke tudengeid, kes kirjutavad head koodi.
Mis on tudengite kasu?
Need vÔivad olla vÀhem ilmsed, sest tudengid ei saa vÀhemalt raha selle koodi eest, mida nad kirjutavad, vaid saavad ainult hindeid oma Ôpikus.
KĂŒsin neilt selle kohta ja nende sĂ”nul:
- Kogemus Open Source'i kaastöölisena.
- Saada rida CV-sse.
- Oma oskuste nÀitamine ja vestlusel lÀbimine Yandexis.
- Osaleda GSoC-is.
- +1 erikursus neile, kes soovivad koodi kirjutada.
Ma ei hakka rÀÀkima, kuidas kursus oli korraldatud. Ătlen vaid, et WAL-G oli peamine projekt. Samuti hĂ”lmasime kursusel selliseid projekte nagu Odyssey, PostgreSQL ja ClickHouse.
Ja ĂŒlesandeid anti mitte ainult sellel kursusel, vaid samuti jagati diplome ja kursusetöid.
Aga mis on sellest kasu kasutajatele?
NĂŒĂŒd liigume osa juurde, mis teie jaoks on ilmselt huvitavam. Mis kasu te sellest saate? Kasu on selles, et Ă”pilased parandavad palju vigu. Ja nad tegid teie palutud funktsioonide pĂ€ringud.
Ja rÀÀkigem asjadest, mida olete ammu soovinud ja mis on nĂŒĂŒd ellu viidud.

Tablespace'ide toetus. Tablespace'id WAL-G-s olid oodatud ilmselt alates WAL-G vÀljalaskmisest, kuna WAL-G on teise varundustööriista WAL-E jÀrglane, kus olid toetatud andmebaaside varukoopiad tablespace'idega.
KokkuvĂ”tteks meenutan, mis see on ja miks see kĂ”ik vajalik on. Tavaliselt asuvad kĂ”ik teie Postgres andmed ĂŒhises kataloogis failisĂŒsteemis, mida nimetatakse pĂ”hikataloogiks. Ja see kataloog sisaldab juba kĂ”iki faile ja alamkatalooge, mida Postgres vajab.
Tablespace'id on kataloogid, kus asuvad Postgres andmed, kuid need ei asu pÔhikataloogist vÀljaspool. Esitluses on nÀha, et tablespace'id asuvad vÀljaspool pÔhikatalooge.

Kuidas see Postgrese jaoks vĂ€lja nĂ€eb? PĂ”hikataloogis on eraldi alamkataloog pg_tblspc. Ja selles on sĂŒmboolsed lingid kataloogidele, kus tegelikult asuvad Postgres andmed vĂ€ljaspool pĂ”hikatalooge.

Kui te seda kĂ”ike kasutate, vĂ”ivad need kĂ€sud teie jaoks vĂ€lja nĂ€ha umbes nii. St. te loote tabeli mĂ”nes kindlas tablespace'is ja vaatate, kus see nĂŒĂŒd asub. Need kaks viimast rida, kaks viimati vĂ€lja kutsutud kĂ€sku. Ja seal on nĂ€ha, et on mingi tee. Kuid tegelikult â see ei ole tĂ”eline tee. See on tee, millel on pĂ”hikatalooge eeltoodud prefiks ja tablespace. Ja sealt edasi on see ĂŒhendatud sĂŒmboolse lingiga, mis suunab teie tegelikele andmetele.
Meie tiimis seda ei kasutata, aga paljusid teisi WAL-E kasutajaid, kes kirjutasid meile, et nad tahavad ĂŒle minna WAL-G-le, hĂ€iris see. NĂŒĂŒd on see toetatud.

Teine funktsioon, mille meie erikursus meile tÔi, on catchup. Catchup'ist teavad inimesed, kes on ilmselt rohkem töötanud Oracle'iga kui Postgresega.
LĂŒhidalt sellest, mis see on. Nii vĂ”ib meie teenuse klastritopoloogia vĂ€lja nĂ€ha. Meil on peamine server. On ka replikant, mis voogedastab kirjutamislogi. Ja replikant ĂŒtleb peamisele serverile, millisel LSN-l ta parasjagu asub. Ja samal ajal vĂ”ib logi arhiivida. Lisaks ajakohastatakse ka varukoopiaid pilve.
Milline vÔib olla probleem? Kui teil on suhteliselt suur andmebaas, vÔib juhtuda, et replikant hakkab peamisest serverist oluliselt maha jÀÀma. Ja jÀÀb nii palju maha, et tal ei Ônnestu enam kunagi jÀrgi jÔuda. Seda probleemi tuleb tavaliselt lahendada.
Ja kĂ”ige lihtsam viis on replikant eemaldada ja see uuesti installida, sest ta ei suuda kunagi jĂ€rgi jĂ”uda ning probleemiga tuleb tegeleda. Kuid see vĂ”tab ĂŒsna kaua aega, kuna 10 TB suuruse andmebaasi tĂ€is varukoopia taastamine on vĂ€ga-vĂ€ga aeganĂ”udev. Ja me tahame selle kĂ”ik vĂ”imalikult kiiresti Ă€ra teha, kui sellised probleemid tekivad. Ja just selleks on mĂ”eldud catchup.
Catchup vĂ”imaldab kasutada delta-varukoopiaid, mis on pilves salvestatud. Te ĂŒtlete, millisel LSN-l on praegu maha jÀÀnud replikant ja mĂ€rkite selle catchup kĂ€sus, et luua delta-varukoopia selle LSN-i vahel ja LSN-i, kus teie klaster praegu asub. Ja seejĂ€rel taastate selle varukoopia replikantile, mis jĂ€i maha.
Teised andmebaasid
Samuti tĂ”id ĂŒliĂ”pilased meile kohe palju funktsioone. Kuna me Yandexis töötleme mitte ainult Postgres'i, vaid ka MySQL, MongoDB, Redis, ClickHouse, siis tekkis mingil hetkel vajadus, et saaksime teha varukoopiaid ajapunkti taastamise vĂ”imalusega MySQL'ist ja et oleks vĂ”imalus neid pilve laadida.
Ja me tahtsime seda teha sarnasel viisil, nagu WAL-G teeb. Otsustasime katsetada ja vaadata, kuidas see kÔik vÀlja nÀeb.
Alguses ei eraldanud me seda loogikat haru sees, vaid kirjutasime koodi. NÀgime, et meil on mingisugune toimiv mudel ja see vÔib toimida. SeejÀrel mÔtlesime, et meie peamine kogukond on postgres'i kasutajad, kes kasutavad WAL-G-d. SeetÔttu tuleb need osad kuidagi eraldada. See tÀhendab, et kui me parandame koodi Postgres'i jaoks, ei sega me MySQL-i ja kui me parandame MySQL-i, ei sega me Postgres'i.

Esimene idee, kuidas seda jagada, oli kasutada sama lĂ€henemist, mida kasutatakse PostgreSQL laiendustes. Sisuliselt, et teha MySQL varukoopia, pidite paigaldama mingi dĂŒnaamilise teegi.
Aga siin on kohe nĂ€ha selle lĂ€henemise asĂŒmmeetria. Kui te varundate Postgres'i, paigaldatakse sellele normaalne varundustööriist, ja kĂ”ik on suurepĂ€rane. Aga MySQL puhul kĂ€ib see nii, et paigaldate Postgres'i varundustööriista ja selle jaoks paigaldatakse veel dĂŒnaamiline teek MySQL jaoks. See kĂ”lab kuidagi kummaliselt. Me mĂ”tlesime ka nii ja otsustasime, et see ei ole see lahendus, mida vajame.
Erinevad paketid Postgres'i, MySQL, MongoDB, Redis jaoks
Aga see vĂ”imaldas meil, nagu me arvame, jĂ”uda Ă”ige lahenduseni â eristada erinevaid pakette erinevate andmebaaside jaoks. See vĂ”imaldas isoleerida loogikat, mis on seotud erinevate andmebaaside varukoopiate tegemisega, mis pöörduvad ĂŒhise API poole, mida rakendab WAL-G.

See on see osa, mille me ise kirjutasime â enne, kui andsime tudengitele ĂŒlesanded. TeisisĂ”nu, see on just see osa, kus nad vĂ”isid midagi valesti teha, seega otsustasime, et teeme midagi ise ja kĂ”ik on suurepĂ€rane.

PĂ€rast seda andsime ĂŒlesanded. Need viidati kohe lĂ€bi. Tudengitelt oodati, et nad toetavad kolme andmebaasi.
See on MySQL, mida me oleme juba rohkem kui aasta varundanud pideva WAL-G abiga.
Ja praegu lÀheneb ka MongoDB tootmisfaasile, seal tÀiustatakse seda veel. Sisuliselt kirjutasime selle jaoks raami. Hiljem kirjutasid tudengid mÔned funktsionaalsed lahendused. Ja siis viime need sellisesse seisundsesse, mida saame oma tootmises aktsepteerida.
Need ĂŒlesanded ei nĂ€inud vĂ€lja sellised, et tudengid pidid kirjutama tĂ€ielikke varundustööriistu iga andmebaasi jaoks. Meie probleem ei seisnud selles. Meie probleem oli selles, et soovisime punkt-punkti taastamist ja soovisime varundada pilve. Palusime tudengitel kirjutada mingit koodi, mis selle lahendaks. Tudengid kasutasid juba olemasolevaid varundustööriistu, mis kuidagi teevad varukoopiaid, ja seejĂ€rel sidusid nad selle kĂ”ik WAL-G-ga, mis edastas kĂ”ik pilve. Samuti lisasid nad punkt-punkti taastamise.

Mida veel tĂ”id tudengid? Nad tĂ”id WAL-G-sse Libsodium'i krĂŒpteerimise toe.
Samuti on meil nĂŒĂŒd varukoopiate sĂ€ilitamise poliitikad. NĂŒĂŒd saab varukoopiaid mĂ€rkida pĂŒsivateks. Ja selle teenuse jaoks on mugavam automatiseerida nende sĂ€ilitamise protsessi.

Mis tulemuseks sai selle eksperimendi kÀigus?
Kursusele registreerus algselt rohkem kui 100 inimest. Ma ei öelnud alguses, et ĂŒlikool Jekaterinburgis on Uuralite FöderaalĂŒlikool. Seal kuulutasime me kĂ”ik vĂ€lja. 100 inimest registreerus. Tegelikult hakkas midagi tegema palju vĂ€hem, umbes 30 inimest.
Kursuse lĂ”petas veel vĂ€hem inimesi, sest seal pidi kirjutama teste juba olemasolevale koodile. Samuti pidime mĂ”ne bug'i parandama vĂ”i mingit funktsiooni tegema. Ja osa ĂŒliĂ”pilastest suudsid siiski kursuse lĂ”petada.
Praeguseks on ĂŒliĂ”pilased selle kursuse kĂ€igus parandanud umbes 14 probleemi, teinud 10 erineva suurusega funktsiooni. Ja minu arvates on see tĂ€ieĂ”iguslik asendus ĂŒhe vĂ”i kahe arendaja jaoks.
Lisaks sellel anname vĂ€lja diplome ja kursustöid. 12 inimest vĂ”tsid diplomi. 6 neist on juba kaitsnud «5» peale. ĂlejÀÀnud ei ole veel kaitsnud, kuid arvan, et ka neil lĂ€heb kĂ”ik hĂ€sti.
Tulevikuplaanid
Millised on meie tuleviku plaanid?
Igatahes need funktsioonide pÀringud, mida me juba kasutajatelt kuulnud oleme ja mida tahame teha. Need on:
- Ajaskaalade tÀpsuse jÀlgimine HA-kliendi varukoopia arhivis. WAL-G abil saab seda teha. Ja ma arvan, et leiame tudengeid, kes sellega tegelema hakkavad.
- Varukoopiate ja WAL-i ĂŒlekande eest pilvedes on meil juba vastutav isik.
- Ja me avaldasime hiljuti idee, et saame WAL-G-d veel rohkem kiirendada, kasutades inkrementaalsete varukoopiate lahtipakkimist ilma lehekĂŒlgede kirjutamiseta ja arhiveerimise optimeerimist, mida me sinna saadame.
Saate neid siin jagada
Milleks oli see ettekande? Selleks, et praegu, peale meid nelja inimest, kes seda projekti toetavad, on meil palju abikĂ€si. Eriti, kui neile isiklikult kirjutada. Ja kui varundate oma andmeid ja teete seda WAL-G abil vĂ”i soovite ĂŒle minna WAL-G-le, siis saame teie soove ĂŒsna kergesti arvesse vĂ”tta.

See on qr-kood ja link. Saate neid kasutada, et minna ja kirjutada kĂ”ik oma soovid. NĂ€iteks me ei paranda mĂ”nda bug'i. VĂ”i mĂ”nda funktsiooni, mida soovite vĂ€ga, kuid mikski pĂ€rast pole see veel ĂŒheski varundusteenuses, sealhulgas ka meie omas. Kirjutage sellest kindlasti.

KĂŒsimused
Tere! AitĂ€h ettekande eest! KĂŒsimus WAL-G kohta, aga mitte Postgresest. WAL-G varundab MySQL-i ja kutsub esile ekstrapĂ€eviku. Kui vĂ”tta kaasaegsed paigaldused CentOS-is ja kui teete yum install MySQL, installitakse MariDB. Alates versioonist 10.3 ei toetata ekstrapĂ€evikut, toetatakse MariDB varundust. Kuidas teil sellega on?
Praegu ei ole me pĂŒĂŒdnud MariDB-d varundada. Meil on olnud taotlusi FoundationDB toe kohta, kuid ĂŒldiselt, kui selline taotlus on, saame leida inimesi, kes selle teevad. See ei ole nii pikk ega keeruline, nagu mulle tundub.
Tere pĂ€evast! AitĂ€h ettekande eest! KĂŒsimus potentsiaalselt uute funktsioonide kohta. Kas olete valmis saama WAL-G tööle lintide jaoks, et saaks varundust teha lintidele?
Kas lintide salvestamiseks mÔeldud varundus on ilmselt see, mis silmas peetakse?
Jah.
Seal on Andrej Borodin, kes vĂ”ib sellele kĂŒsimusele paremini vastata.
(Andrej) Jah, aitĂ€h kĂŒsimuse eest! Meil oli taotlus varunduse edastamiseks lintidele pilvesalvestusest. Ja selle jaoks edastus pilvede vahel. Sest edastus pilvede vahel on mingisugune ĂŒldine versioon edastamisest lintidele. Lisaks on meil laienev arhitektuur salvestusruumide osas. Muide, paljud salvestusruumid on kirjutatud tudengite poolt. Ja kui te kirjutate salvestusruumi lintide jaoks, siis see toetatakse kindlasti. Oleme valmis vaatama sissevedu. Seal tuleb faili kirjutada, faili lugeda. Kui need asjad teha Go keeles, siis saab tavaliselt 50 rida koodi. Ja siis toetatakse WAL-G-s linti.
AitÀh ettekande eest! Huvitav arendusprotsess. Varundamine on tÔsine funktsionaalsuse osa, mis peab olema hÀsti katetud testidega. Kui te realiseerisite uusi andmebaase, kas ka testid kirjutasid tudengid vÔi kirjutesite testid ise ja andsite seejÀrel rakenduse tudengitele?
Testid kirjutasid samuti tudengid. Kuid tudengid kirjutasid rohkem selliste funktsioonide jaoks, nagu uued andmebaasid. Nad kirjutasid integratsioonitestid. Ja nad kirjutasid ĂŒksusteste. Kui integratsioonitestid lĂ€bivad, st praegu â see stsenaarium, mida te tĂ€idate kĂ€sitsi vĂ”i teeb seda nĂ€iteks cron. St stsenaarium on ĂŒsna arusaadav.
Tudengitel ei ole eriti palju kogemusi. Kui palju aega ĂŒlevaatusele kulub?
Jah, ĂŒlevaatamiseks kulub tĂ”esti ĂŒsna palju aega. Ehkki tavaliselt, kui tuleb mitu arendajat korraga ja ĂŒtlevad, et olen teinud seda ja seda, tuleb mĂ”elda ja leida kuskil pool pĂ€eva, et aru saada, mida nad seal kirjutasid. Sest koodi peab hoolikalt lugema. Nad ju ei lĂ€binud vestlust. Me ei tunne neid vĂ€ga hĂ€sti, seetĂ”ttu vĂ”tab see mĂ€rkimisvÀÀrselt aega.
AitÀh ettekande eest! Varem on Andrei Borodin öelnud, et archive_command WAL-G-is peaks olema kutsutud otse. Kuid mingisuguse patroni klastriga vajame me lisaloogikat, et mÀÀrata node, kellele saata WAL-e. Kuidas teie seda probleemi lahendate?
Milline probleem teil siin tekib? Kas teil on nĂ€iteks sĂŒnkroonne replikatsioon, kust te teete varukoopia? VĂ”i mis?
(Andrei) Asi on selles, et WAL-G eeldab tĂ”epoolest kasutamist ilma shell-skriptide sidumiseta. Kui millestki jÀÀb puudu, siis kirjutame loogikaga juurde, mis peaks olema WAL-G sees. Kui rÀÀkida sellest, kust arhiveerimine peaks toimuma, siis usume, et arhiveerimine peaks toimuma klastris olevast praegusest peast. Replikatsioonist arhiveerimine on halb idee. Seal vĂ”ivad tekkida erinevad stsenaariumid probleemidega. EelkĂ”ige ajajoone ja muude lisainfo arhiveerimise probleemid. AitĂ€h kĂŒsimuse eest!
(TĂ€psustus: Shell-skriptide sidumine on eemaldatud) )
Tere Ôhtust! AitÀh ettekande eest! Mind huvitab catchup-funktsioon, millest rÀÀkisite. Olite silmitsi olukorraga, kus replikatsioon jÀi maha, mis ei suutnud kuidagi jÀrgi jÔuda. Ja ma ei leidnud WAL-G-ist selle funktsiooni kirjeldust dokumentatsioonis.
Catchup ilmus sĂ”na otseses mĂ”ttes 2020. aasta jaanuari 20. pĂ€evadel. Dokumentatsiooniga vĂ”ib-olla tasuks natuke paremini töötada. Me ise kirjutame seda ja kirjutame seda mitte just superhĂ€sti. Ja vĂ”ib-olla peaksime ĂŒliĂ”pilastelt nĂ”udma, et nad seda kirjutaksid.
Kas see on juba vÀlja antud?
Pull request on juba ĂŒhendatud, s.t. ma olen selle kontrollinud. Proovisin seda testklastris. Praegu ei ole meil olnud olukorda, kus saaksime seda tootmisnĂ€itel katsetada.
Millal oodata?
Ma ei tea. Oodake kuud, me kindlasti kontrollime.
Allikas: habr.com
