Jag vill att ni ska ta del av sammanfattningen av Georgy Rylovs rapport frÄn början av 2020 "WAL-G: nya möjligheter och samhÀllsutveckling"
Under open-source underhÄllet uppstÄr mÄnga problem nÀr man vÀxer. Hur skriver man fler efterfrÄgade funktioner, fixar fler issues och hinner se fler pull requestar? Genom exemplet WAL-G (backup-verktyg för PostgreSQL) kommer jag att berÀtta hur vi löste dessa problem genom att starta en kurs i Open-source utveckling pÄ universitetet, vad vi har uppnÄtt och vart vi ska gÄ hÀrnÀst.

Hej alla igen! Jag Àr utvecklare pÄ Yandex frÄn Jekaterinburg. Och idag kommer jag att berÀtta om WAL-G.
I titeln pÄ rapporten stod det inte att det handlade om backuper. Finns det nÄgon som inte vet vad WAL-G Àr? Eller vet alla? RÀck upp handen om ni inte vet. Wow, ni kom till förelÀsningen utan att veta vad den handlar om.
LÄt mig berÀtta vad som kommer hÀnda idag. Det har blivit sÄ att vÄrt team har arbetat med backuper ett tag nu. Och det hÀr Àr ytterligare en förelÀsning i serien dÀr vi berÀttar om hur vi lagrar data sÀkert, pÄlitligt, bekvÀmt och effektivt.

I tidigare avsnitt har det varit mÄnga förelÀsningar av Andrey Borodin, Vladimir Leskov. Vi har varit mÄnga. Och vi har alla pratat om WAL-G i mÄnga Är.
clck.ru/F8ioz â
clck.ru/Ln8Qw â
Den hÀr förelÀsningen kommer att skilja sig lite frÄn de andra, för hÀr handlar det mer om den tekniska delen, och hÀr kommer jag att berÀtta om hur vi stött pÄ problem relaterade till tillvÀxten av samhÀllet. Och hur vi kom pÄ en liten idé som hjÀlper oss att hantera detta.

För nÄgra Är sedan var WAL-G ett ganska litet projekt som vi fÄtt frÄn Citus Data. Och vi tog just över det. Det utvecklades av en person.
Och i WAL-G fanns det inte:
- Backup frÄn replik.
- Det fanns inga inkrementella backuper.
- Det fanns inga WAL-Delta backuper.
- Och massor av saker saknades.
Under dessa Är har WAL-G vÀxt mycket.

Och vid 2020 hade allt detta nÀmnda redan dykt upp. Dessutom har vi nu:
- Ăver 1 000 stjĂ€rnor pĂ„ GitHub.
- 150 forkningar.
- Cirka 15 öppna PR.
- Och mycket fler bidragsgivare.
- Och öppna issues hela tiden. Och detta trots att vi bokstavligen gÄr in dÀr varje dag för att göra nÄgot med det.

Och vi kom fram till att det hÀr projektet krÀver mer av vÄr uppmÀrksamhet, Àven nÀr vi sjÀlva inte behöver implementera nÄgot för vÄr tjÀnst Managed Databases i Yandex.
Och nÄgonstans hösten 2018 kom vi pÄ en idé. Vanligtvis har teamet nÄgra sÀtt att utveckla funktioner eller ÄtgÀrda buggar om ni har ont om resurser. Till exempel kan man anstÀlla en ytterligare utvecklare och betala denne. Eller man kan ta in en praktikant under en tid och betala denne en lön. Men det finns ocksÄ en ganska stor grupp mÀnniskor, en del av vilken faktiskt kan skriva kod. Problemet Àr bara att ni inte alltid vet vilken kvalitet den koden har.
Vi funderade och bestÀmde oss för att försöka involvera studenter. Men studenterna kommer inte att delta i allt. De kommer att göra endast en del av arbetet. De kommer till exempel att skriva tester, fixa buggar och implementera funktioner som inte berör den huvudsakliga funktionaliteten. Den huvudsakliga funktionaliteten Àr att skapa sÀkerhetskopior och ÄterstÀlla dessa. Om man tillÄter en bugg i skapandet av en sÀkerhetskopia kommer vi att förlora data. Och ingen vill förstÄs det. Alla vill att allt ska vara mycket pÄlitligt. DÀrför vill vi sjÀlvklart inte slÀppa in nÄgon kod som vi har mindre förtroende för Àn vÄr egen. Det vill sÀga, all icke-kritisk kod Àr vad vi skulle vilja fÄ frÄn vÄra extra arbetskrafter.
Under vilka förhÄllanden accepteras studenternas PR?
- De Àr skyldiga att tÀcka sin kod med tester. Allt mÄste passerar i CI.
- Och vi genomgÄr ocksÄ 2 granskningar. En av Andrej Borodin och en av mig.
- Och för att ytterligare kontrollera att detta inte bryter nÄgot i vÄr tjÀnst laddar jag upp en version med denna commit. Och vi kontrollerar i end-to-end tester att ingenting faller.
Specialkurs om Open Source

Lite om varför detta Àr viktigt och varför jag tror att det Àr en cool idé.
För oss Àr vinsten uppenbar:
- Vi fÄr extra hÀnder.
- Och vi söker kandidater till teamet bland duktiga studenter som skriver bra kod.
Vad Àr vinsten för studenterna?
De kan vara mindre uppenbara, eftersom studenterna Ätminstone inte fÄr pengar för den kod de skriver, utan fÄr endast betyg i sin studieprotokoll.
Jag frÄgade dem om detta. Och enligt deras ord:
- Erfarenhet som bidragsgivare i Open Source.
- FĂ„ en rad i CV:t.
- Visa sig och gÄ igenom en intervju hos Yandex.
- Bli deltagare i GSoC.
- +1 specialkurs för dem som vill skriva kod.
Jag kommer inte att prata om hur kursen var strukturerad. Jag kan bara sÀga att WAL-G var det huvudsakliga projektet. Vi inkluderade ocksÄ sÄdana projekt som Odyssey, PostgreSQL och ClickHouse i denna kurs.
Och vi gav uppgifter inte bara pÄ denna kurs, utan delade ocksÄ ut diplom och projektarbeten.
Och vad Àr vinsten för anvÀndarna?
Nu gÄr vi vidare till den del som förmodligen intresserar er. Vad fÄr ni ut av detta? Vinsten Àr att studenterna har ÄtgÀrdat mÄnga buggar. Och de har gjort funktionsförfrÄgningar som ni bad oss att genomföra.
LÄt mig berÀtta om de saker som ni lÀnge har velat ha och som nu har implementerats.

Stöd för tablespaces. Stöd för tablespaces i WAL-G har nog efterfrÄgats sedan WAL-G slÀpptes, eftersom WAL-G Àr eftertrÀdaren till ett annat backupverktyg, WAL-E, dÀr databackuper med tablespaces stödjades.
Jag pÄminner kort om vad det Àr och varför det behövs. Vanligtvis tar all Postgres-data upp en katalog i filsystemet som kallas basen. Och den hÀr katalogen innehÄller redan alla filer och underkataloger som Postgres behöver.
Tablespaces Àr kataloger dÀr Postgres-data ligger, men de ligger inte utanför basen. PÄ bilden kan man se att tablespaces ligger utanför basen.

Hur ser detta ut för sjÀlva Postgres? I basen finns en separat underkatalog pg_tblspc. Och dÀr ligger symlÀnkar till kataloger dÀr Postgres-data faktiskt ligger utanför basen.

NĂ€r ni anvĂ€nder allt detta kan dessa kommandon se ut som följande. Det vill sĂ€ga, ni skapar en tabell i en specificerad tablespace och ser var den ligger nu. De tvĂ„ sista raderna, de sista kallelserna. DĂ€r kan man se att det finns nĂ„gon vĂ€g. Men i sjĂ€lva verket â det Ă€r inte en riktig vĂ€g. Det Ă€r en vĂ€g med prefix frĂ„n basen till tablespace. Och dĂ€rifrĂ„n Ă€r den kopplad via en symlink som leder till era verkliga data.
Vi anvÀnder inte detta i vÄrt team, men det har anvÀnts av mÄnga andra anvÀndare av WAL-E som har berÀttat för oss att de ville migrera till WAL-G, men detta hindrade dem. Nu stöds det.

En annan funktion som vÄrt specialkurs har gett oss Àr catchup. De som har arbetat mer med Oracle Àn med Postgres kÀnner till catchup.
Kort om vad det handlar om. En sÄdan hÀr kan vanligtvis se ut i topologin av vÄrt kluster. Vi har en master. Det finns en replika som strömmar frÄn den en write-ahead log. Och replikan sÀger till mastern pÄ vilken LSN den nu befinner sig. Och parallellt kan loggen arkiveras. Utöver arkiveringen skickas Àven sÀkerhetskopior till molnet. Delta-sÀkerhetskopior skickas ocksÄ.
Vilket problem kan uppstÄ? NÀr ni har en ganska stor databas kan det hÀnda att replikan börjar halka efter mastern dramatiskt. Och den halkar efter sÄ mycket att den aldrig kan ta ikapp. Detta problem behöver i regel lösas pÄ nÄgot sÀtt.
Det enklaste sÀttet Àr att ta bort replikan och installera om den, eftersom den aldrig kommer att ta ikapp, och problemet mÄste ÄtgÀrdas. Men detta tar ganska lÄng tid, eftersom det Àr mycket, mycket tidskrÀvande att ÄterstÀlla en fullstÀndig sÀkerhetskopia av en databas pÄ 10 TB. Vi vill gÀrna göra detta sÄ snabbt som möjligt om sÄdana problem uppstÄr. Det Àr just dÀrför catchup Àr avsett.
Catchup möjliggör anvÀndning av delta-sÀkerhetskopior som lagras i molnet pÄ detta sÀtt. Ni anger vilken LSN den efterhÀngande replikan befinner sig pÄ och anger det i catchup-kommandot för att skapa en delta-sÀkerhetskopia mellan den LSN och LSN dÀr ert kluster för nÀrvarande befinner sig. DÀrefter ÄterstÀller ni denna sÀkerhetskopia pÄ den replika som hÀngde efter.
Andra databaser
Dessutom har vÄra studenter tagit med sig mÄnga funktioner. Eftersom vi pÄ Yandex arbetar med mer Àn bara Postgres, har vi ocksÄ MySQL, MongoDB, Redis och ClickHouse, sÄ fick vi vid nÄgot tillfÀlle behovet av att kunna göra sÀkerhetskopior med point-in-time recovery för MySQL och att kunna ladda upp dem till molnet.
Och vi ville göra detta pÄ ett sÀtt som liknar det som WAL-G gör. Vi bestÀmde oss för att experimentera och se hur allt skulle se ut.
I början separerade vi inte denna logik i en fork och skrev kod. Vi sÄg att vi hade en slags fungerande modell och att det kunde fungera. Sedan tÀnkte vi att vÄrt huvudcommunity Àr postgres-anvÀndare och de anvÀnder WAL-G. DÀrför mÄste vi pÄ nÄgot sÀtt separera dessa delar. Det vill sÀga nÀr vi justerar koden för Postgres fÄr vi inte krossa MySQL, och nÀr vi justerar MySQL fÄr vi inte krossa Postgres.

Den första idén om hur man skulle separera detta var att anvÀnda samma tillvÀgagÄngssÀtt som anvÀnds i PostgreSQL-tillÀgg. Och i sjÀlva verket, för att göra en backup av MySQL mÄste du installera ett slags dynamiskt bibliotek.
Men hÀr syns genast asymmetrin i detta tillvÀgagÄngssÀtt. NÀr du sÀkerhetskopierar Postgres installerar du en vanlig backup-lösning för Postgres och allt fungerar utmÀrkt. Men för MySQL blir det sÄ att du installerar en backup-lösning för Postgres och dessutom lÀgger till ett dynamiskt bibliotek för MySQL. Det lÄter lite konstigt. Vi tÀnkte ocksÄ sÄ och beslutade att detta inte var den lösningen som vi behövde.
Olika lösningar för Postgres, MySQL, MongoDB, Redis
Men det gjorde att vi, som vi kĂ€nner, kom till den rĂ€tta lösningen â att utarbeta olika lösningar för olika databaser. Det tillĂ€t att isolera logiken knuten till sĂ€kerhetskopior av olika databaser, som skulle anvĂ€nda ett gemensamt API som implementeras av WAL-G.

Detta Ă€r den delen som vi skrev sjĂ€lva â innan vi gav studenterna uppgifterna. Det betyder att detta Ă€r den del dĂ€r de kunde göra nĂ„got fel, sĂ„ vi beslutade att det var bĂ€ttre att göra nĂ„got sjĂ€lva sĂ„ att allt skulle bli bra.

Efter detta gav vi ut uppgifterna. De togs omedelbart itu med. Studenterna krÀvdes att stödja tre databaser.
Det handlar om MySQL, som vi har sÀkerhetskopierat med hjÀlp av WAL-G pÄ detta sÀtt i över ett Är.
Och nu nÀrmar sig MongoDB produktion, det finslipas dÀr en del. I sjÀlva verket byggde vi grundstrukturen för allt detta. Sedan skrev studenterna nÄgra fungerande delar. Och vi förde dem till ett tillstÄnd dÀr vi kan ta emot dem i vÄr produktion.
Dessa uppgifter sÄg inte ut som att studenterna behövde skriva kompletta backupverktyg för var och en av dessa databaser. Vi hade inte det problemet. VÄr frÄga var att vi ville ha point-in-time recovery och vi ville sÀkerhetskopiera till molnet. Vi bad studenterna att skriva nÄgon kod som skulle lösa detta. Studenterna anvÀnde befintliga backupverktyg som pÄ nÄgot sÀtt gör sÀkerhetskopior och sedan sammanfogade de allt detta med WAL-G, vilket överförde det hela till molnet. De lade ocksÄ till point-in-time recovery.

Vad mer bidrog studenterna med? De tillförde stöd för kryptering med Libsodium till WAL-G.
Vi har ocksÄ fÄtt backupbevarande policys. Nu kan sÀkerhetskopior mÀrkas som permanenta. Det Àr ocksÄ mer praktiskt för din tjÀnst att automatisera processen för deras lagring.

Vad blev resultatet av detta experiment?
Ursprungligen registrerade sig över 100 personer pÄ kursen. Jag nÀmnde inte frÄn början att universitetet i Jekaterinburg Àr Ural Federal University. DÀr tillkÀnnagav vi allt. 100 personer registrerade sig. Faktiskt började betydligt fÀrre göra nÄgot, ungefÀr 30 personer.
Ănnu fĂ€rre personer avslutade kursen, eftersom det krĂ€vdes att skriva tester för de redan existerande koderna. Dessutom behövdes antingen fixa en bugg eller skapa en funktion. En del studenter avslutade Ă€ndĂ„ kursen.
Vid den hÀr tidpunkten har studenterna reparerat cirka 14 frÄgor för denna kurs och skapat 10 funktioner av olika storlekar. Och enligt mig Àr detta en fullgod ersÀttning för en eller tvÄ utvecklare.
Förutom allt detta delade vi ut diplom och kursarbeten. 12 tog emot diplom. 6 av dem har redan gÄtt igenom försvarsarbetet med betyget "5". De övriga har Ànnu inte haft sina försvar, men jag tror att de ocksÄ kommer att klara sig bra.
Framtidsplaner
Vad har vi för planer för framtiden?
à tminstone de funktionsförfrÄgningar som vi redan har hört frÄn anvÀndare och vill genomföra. Det handlar om:
- Ăvervakning av korrektheten vid spĂ„rning av tidslinjen i arkivet för HA-klustrets sĂ€kerhetskopior. Med hjĂ€lp av WAL-G gĂ„r det att göra detta. Och jag tror att vi hittar studenter som kan ta sig an detta.
- Vi har redan en ansvarig person för att överföra sÀkerhetskopior och WAL mellan moln.
- Och vi publicerade nyligen idén om att vi kan snabba upp WAL-G Ànnu mer genom att packa upp inkrementella sÀkerhetskopior utan att skriva över sidor och optimera arkiven som vi skickar dit.
Ni kan dela dem hÀr
Vad var syftet med detta föredrag? Att just nu, förutom fyra av oss som stödjer detta projekt, har vi mÄnga extra hÀnder. SÀrskilt om de kontaktar oss privat. Och om ni sÀkerhetskopierar era data och gör det med WAL-G eller skulle vilja övergÄ till WAL-G, sÄ kan vi ganska lÀtt ta hÀnsyn till era önskemÄl.

Detta Àr QR-koden och lÀnken. Ni kan gÄ dit och skriva alla era önskemÄl. Till exempel, om vi inte ÄtgÀrdar nÄgon bugg. Eller en funktion som ni verkligen vill ha, men av nÄgon anledning finns den Ànnu inte i nÄgon sÀkerhetskopiering, inklusive vÄr. Var noga med att skriva om det.

FrÄgor
Hej! Tack för presentationen! Jag har en frÄga om WAL-G, men inte om Postgres. WAL-G sÀkerhetskopierar MySQL och utför en extra backup. Om vi tar moderna installationer pÄ CentOS, och om du gör en yum install MySQL, sÄ kommer MariaDB att installeras. FrÄn version 10.3 stöds ingen extra backup, utan MariaDB-backup stöds. Hur ser det ut med er?
Just nu har vi inte försökt sÀkerhetskopiera MariaDB. Vi har fÄtt förfrÄgningar om stöd för FoundationDB, men generellt sett, om det finns en sÄdan förfrÄgan, kan vi hitta personer som kan göra det. Det tar inte sÄ lÄng tid och Àr inte sÄ svÄrt som jag tror.
God dag! Tack för presentationen! FrĂ„gan handlar om potentiellt nya funktioner. Ăr ni redo att fĂ„ WAL-G att fungera med band, sĂ„ att man kan göra backup till band?
Menar du backup till bandlagring, antar jag?
Ja.
Det finns Andrey Borodin dÀr, som kan svara pÄ den hÀr frÄgan bÀttre Àn jag.
(Andrey) Ja, tack för frÄgan! Vi har fÄtt en förfrÄgan om att flytta backup till band frÄn molnlagring. Och för detta överföring mellan moln. Eftersom överföring mellan moln Àr en slags generell version av överföring till band. Dessutom har vi en skalbar arkitektur nÀr det gÀller lagringslösningar. Förresten, mÄnga av lagringarna skrevs av studenter. Om du skriver en lagring för band, sÄ kommer den sjÀlvklart att stödjas. Vi Àr redo att övervÀga pull requests. Man mÄste skriva en fil, lÀsa en fil. Om man gör dessa saker i Go, brukar det vanligtvis bli cirka 50 rader kod. DÄ kommer band att stödjas i WAL-G.
Tack för presentationen! En intressant utvecklingsprocess. Backup Àr en viktig del av funktionaliteten, som bör vara vÀl tÀckt av tester. NÀr ni implementerade funktionalitet för nya databaser, var det ocksÄ studenter som skrev testerna eller skrev ni testerna sjÀlva och lÀt studenterna göra implementationen senare?
Tester skrevs ocksĂ„ av studenter. Men studenterna skrev mer för funktioner som nya databaser. De skrev integrationstester. Och de skrev enhetstester. Om integrationstesterna gĂ„r igenom, dvs just nu â det Ă€r ett scenario som ni utför manuellt eller som görs av cron, till exempel. Dvs dĂ€r Ă€r scenariot vĂ€ldigt tydligt.
Studenterna har inte sÄ mycket erfarenhet. Hur mycket tid gÄr Ät till granskning?
Ja, det gÄr ganska mycket tid Ät till recensionerna. Det vill sÀga, vanligtvis nÀr flera committers kommer och sÀger att jag har gjort det och jag har gjort det, behöver man tÀnka och avsÀtta en halv dag för att förstÄ vad de har skrivit. För koden mÄste man lÀsa noggrant. De har ju inte genomgÄtt en intervju. Vi kÀnner dem inte sÄ vÀl, dÀrför tar det en betydande tid.
Tack för presentationen! Tidigare har Andrey Borodin sagt att archive_command i WAL-G bör anropas direkt. Men i fallet med en patronkluster behövs det ytterligare logik för att bestÀmma vilken nod som ska skicka loggar. Hur löser ni detta problem?
Vilket problem har ni hÀr? Har ni en synkron replika frÄn vilken ni tar backup? Eller vad?
(Andrey) Saken Àr att WAL-G verkligen Àr tÀnkt att anvÀndas utan inbÀddning av shell-skript. Om nÄgot saknas, lÄt oss dÄ skriva den logik som behöver finnas i WAL-G. NÀr det gÀller varifrÄn arkiveringen ska göras, sÄ anser vi att arkiveringen bör ske frÄn den nuvarande mastern i klustret. Arkivering frÄn replica Àr en dÄlig idé. DÀr kan det uppstÄ olika scenarier med problem. Specifikt problem med arkivering av tidslinjer och all typ av tillÀggsinformation. Tack för frÄgan!
(Förtydligande: Vi har gjort oss av med inbÀddningen av shell-skript) )
God kvÀll! Tack för presentationen! Jag blev intresserad av funktionen catchup, som du nÀmnde. Har ni stött pÄ situationer dÀr replikan har fallit efter och som inte kunde ikapp?
Catchup dök upp bokstavligen i slutet av januari 2020. Med dokumentationen kan det vara bra att jobba lite mer. Vi skriver den sjÀlva och vi skriver inte sÄ superbra. Och kanske bör vi krÀva att studenterna skriver den.
Ăr den redan i release?
Pull request har redan blivit merge:ad, det vill sĂ€ga jag har kontrollerat den. Jag testade detta pĂ„ ett testkluster. Ăn sĂ„ lĂ€nge har vi inte haft en situation dĂ€r vi kunde kontrollera detta pĂ„ ett produktionsfall.
NÀr ska vi förvÀnta oss det?
Jag vet inte. VÀnta en mÄnad, dÄ har vi det sÀkert.
KĂ€lla: habr.com
