WAL-G: nowe funkcje i rozwój społeczności. Georgy Ryłow

Sugeruję przeczytanie transkrypcji raportu z początku 2020 roku autorstwa Georgy'ego Rylova „WAL-G: nowe możliwości i rozwój społeczności”

W miarę rozwoju opiekunowie oprogramowania open source stają przed wieloma wyzwaniami. Jak pisać coraz więcej wymaganych funkcji, naprawiać coraz więcej problemów i zarządzać przeglądaniem coraz większej liczby pull requestów? Na przykładzie WAL-G (narzędzia do tworzenia kopii zapasowych dla PostgreSQL) opowiem Ci, jak rozwiązaliśmy te problemy, uruchamiając na uniwersytecie kurs dotyczący rozwoju Open Source, co osiągnęliśmy i dokąd zmierzamy dalej.

WAL-G: nowe funkcje i rozwój społeczności. Georgy Ryłow

Witam ponownie wszystkich! Jestem programistą Yandex z Jekaterynburga. A dzisiaj opowiem o WAL-G.

Tytuł raportu nie mówił, że chodzi o kopie zapasowe. Czy ktoś wie co to jest WAL-G? A może wszyscy wiedzą? Podnieś rękę, jeśli nie wiesz. Kurczę, przyszedłeś na raport i nie wiesz o co chodzi.

Pozwólcie, że opowiem wam, co się dzisiaj stanie. Tak się składa, że ​​nasz zespół od dłuższego czasu zajmuje się tworzeniem kopii zapasowych. To kolejny raport z serii, w którym mówimy o tym, jak bezpiecznie, bezpiecznie, wygodnie i efektywnie przechowujemy dane.

WAL-G: nowe funkcje i rozwój społeczności. Georgy Ryłow

W poprzednich seriach było wiele reportaży Andrieja Borodina i Władimira Leskowa. Było nas wielu. A o WAL-G mówimy od wielu lat.

clck.ru/F8ioz — https://www.highload.ru/moscow/2018/abstracts/3964

clck.ru/Ln8Qw — https://www.highload.ru/moscow/2019/abstracts/5981

Ten raport będzie trochę różnił się od pozostałych tym, że dotyczył bardziej części technicznej, ale tutaj opowiem o tym, jak napotkaliśmy problemy związane z rozwojem społeczności. I jak wpadliśmy na mały pomysł, który pomaga nam sobie z tym poradzić.

WAL-G: nowe funkcje i rozwój społeczności. Georgy Ryłow

Kilka lat temu WAL-G był dość małym projektem, który otrzymaliśmy od Citus Data. I po prostu to wzięliśmy. A opracowała go jedna osoba.

I tylko WAL-G nie miał:

  • Kopia zapasowa z repliki.
  • Nie było żadnych przyrostowych kopii zapasowych.
  • Nie było żadnych kopii zapasowych WAL-Delta.
  • A jeszcze sporo brakowało.

W ciągu tych kilku lat firma WAL-G bardzo się rozwinęła.

WAL-G: nowe funkcje i rozwój społeczności. Georgy Ryłow

A do 2020 roku wszystkie powyższe już się pojawiły. A do tego dodano to co mamy teraz:

  • Ponad 1 gwiazdek na GitHubie.
  • 150 widelców.
  • Około 15 otwartych PR.
  • I wielu innych autorów.
  • I cały czas otwarte tematy. I to pomimo tego, że dosłownie codziennie tam chodzimy i coś z tym robimy.

WAL-G: nowe funkcje i rozwój społeczności. Georgy Ryłow

I doszliśmy do wniosku, że ten projekt wymaga więcej naszej uwagi, nawet jeśli sami nie musimy niczego wdrażać dla naszej usługi Managed Databases w Yandex.

I gdzieś jesienią 2018 roku przyszedł nam do głowy pewien pomysł. Zwykle zespół ma kilka sposobów na rozwinięcie niektórych funkcji lub naprawienie błędów, jeśli nie masz wystarczającej liczby rąk. Możesz na przykład zatrudnić innego programistę i zapłacić mu pieniądze. Możesz też przyjąć stażystę na jakiś czas i jednocześnie wypłacić mu wynagrodzenie. Ale nadal istnieje dość duża grupa ludzi, z których część już naprawdę wie, jak pisać kod. Po prostu nie zawsze wiesz, jakiej jakości jest kod.

Pomyśleliśmy o tym i postanowiliśmy spróbować przyciągnąć studentów. Ale studenci nie będą z nami uczestniczyć we wszystkim. Wykonają tylko część prac. I będą na przykład pisać testy, naprawiać błędy, wdrażać funkcje, które nie wpływają na główną funkcjonalność. Główną funkcjonalnością jest tworzenie kopii zapasowych i przywracanie kopii zapasowych. Jeśli popełnimy błąd podczas tworzenia kopii zapasowej, grozi nam utrata danych. I nikt tego oczywiście nie chce. Każdy chce, żeby wszystko było bardzo bezpieczne. Dlatego oczywiście nie chcemy udostępniać kodu, któremu ufamy mniej niż naszemu własnemu. Oznacza to, że każdy niekrytyczny kod jest tym, co chcielibyśmy otrzymać od naszych dodatkowych pracowników.

Na jakich warunkach akceptowany jest PR studencki?

  • Są zobowiązani do pokrycia swojego kodu testami. Wszystko powinno odbywać się w CI.
  • Przechodzimy także przez 2 recenzje. Jeden autorstwa Andrieja Borodina i jeden mojego autorstwa.
  • Dodatkowo, aby sprawdzić, czy nie zepsuje to niczego w naszym serwisie, osobno przesyłam zestaw z tym zatwierdzeniem. I sprawdzamy w kompleksowych testach, czy nic nie zawodzi.

Specjalny kurs na temat Open Source

WAL-G: nowe funkcje i rozwój społeczności. Georgy Ryłow

Trochę o tym, dlaczego jest to potrzebne i dlaczego, moim zdaniem, jest to fajny pomysł.

Dla nas zysk jest oczywisty:

  • Dostajemy dodatkowe ręce.
  • A kandydatów do zespołu szukamy wśród inteligentnych studentów, którzy piszą inteligentny kod.

Jaka jest korzyść dla studentów?

Mogą być mniej oczywiste, ponieważ studenci przynajmniej nie otrzymują pieniędzy za napisany przez siebie kod, a jedynie oceny za swoje akta.

Zapytałem ich o to. I ich słowami:

  • Doświadczenie twórcy w zakresie Open Source.
  • Znajdź linię w swoim CV.
  • Udowodnij, że jesteś i przejdź rozmowę kwalifikacyjną w Yandex.
  • Zostań członkiem GSoC.
  • +1 specjalny kurs dla tych, którzy chcą pisać kod.

Nie będę mówić o strukturze kursu. Powiem tylko, że głównym projektem był WAL-G. W tym kursie uwzględniliśmy także takie projekty jak Odyssey, PostgreSQL i ClickHouse.

I sprawiali problemy nie tylko na tym kursie, ale także rozdawali dyplomy i zajęcia.

A co z korzyściami dla użytkowników?

Przejdźmy teraz do części, która najbardziej Cię interesuje. Co ci to da? Rzecz w tym, że studenci naprawili wiele błędów. Stworzyliśmy także funkcje żądań, o które nas prosiłeś.

I pozwól, że opowiem Ci o rzeczach, których od dawna chciałeś i które udało Ci się zrealizować.

WAL-G: nowe funkcje i rozwój społeczności. Georgy Ryłow

Obsługa obszarów tabel. Przestrzeni tabel w WAL-G oczekiwano prawdopodobnie od czasu wydania WAL-G, ponieważ WAL-G jest następcą innego narzędzia do tworzenia kopii zapasowych WAL-E, w którym obsługiwane były kopie zapasowe baz danych z obszarami tabel.

Przypomnę krótko, co to jest i dlaczego jest to potrzebne. Zazwyczaj wszystkie dane Postgres zajmują jeden katalog w systemie plików, zwany bazą. Ten katalog zawiera już wszystkie pliki i podkatalogi wymagane przez Postgres.

Przestrzenie tabel to katalogi zawierające dane Postgres, ale nie znajdujące się poza katalogiem podstawowym. Slajd pokazuje, że obszary tabel znajdują się poza katalogiem podstawowym.

WAL-G: nowe funkcje i rozwój społeczności. Georgy Ryłow

Jak to wygląda w przypadku samego Postgresa? W katalogu podstawowym znajduje się oddzielny podkatalog pg_tblspc. Zawiera także dowiązania symboliczne do katalogów, które faktycznie zawierają dane Postgres poza katalogiem podstawowym.

WAL-G: nowe funkcje i rozwój społeczności. Georgy Ryłow

Kiedy użyjesz tego wszystkiego, dla ciebie te polecenia mogą wyglądać mniej więcej tak. Oznacza to, że tworzysz tabelę w określonym obszarze tabel i sprawdzasz, gdzie ona się teraz znajduje. To są dwie ostatnie linie, wywoływane są dwie ostatnie komendy. I tam jest jasne, że jest jakiś sposób. Ale w rzeczywistości nie jest to prawdziwy sposób. Jest to ścieżka z prefiksem z katalogu podstawowego do obszaru tabel. Stamtąd jest dopasowywany do dowiązania symbolicznego, które prowadzi do prawdziwych danych.

Nie używamy tego wszystkiego w naszym zespole, ale korzystało z tego wielu innych użytkowników WAL-E, którzy pisali do nas, że chcieli przejść na WAL-G, ale to ich powstrzymywało. To jest teraz obsługiwane.

WAL-G: nowe funkcje i rozwój społeczności. Georgy Ryłow

Kolejną cechą, którą przyniósł nam nasz specjalny kurs, jest nadrabianie zaległości. Osoby, które prawdopodobnie więcej pracowały z Oracle niż z Postgres, wiedzą o nadrabianiu zaległości.

Krótko o tym, co to jest. Topologia klastrów w naszym serwisie może zazwyczaj wyglądać mniej więcej tak. Mamy mistrza. Istnieje replika, która przesyła z niej dziennik zapisu z wyprzedzeniem. Replika informuje urządzenie główne, w której sieci LSN aktualnie się znajduje. Równolegle z tym można archiwizować dziennik. Oprócz archiwizacji logu do chmury przesyłane są także kopie zapasowe. Wysyłane są kopie zapasowe delta.

Jaki może być problem? Gdy dysponujesz już dość dużą bazą danych, może się okazać, że Twoja replika zacznie odstawać daleko od wzorca. A ona pozostaje tak daleko w tyle, że nigdy nie jest w stanie go dogonić. Ten problem zwykle trzeba jakoś rozwiązać.

A najłatwiej jest usunąć replikę i wgrać ją ponownie, bo i tak nie nadrobi zaległości, a problem trzeba uporać. Jest to jednak dość długi czas, ponieważ przywracanie całej kopii zapasowej bazy danych o rozmiarze 10 TB to bardzo, bardzo długi czas. A my chcemy to wszystko zrobić jak najszybciej, jeśli pojawią się takie problemy. I właśnie po to jest nadrabianie zaległości.

Catchup pozwala na korzystanie z kopii zapasowych delta, które w ten sposób przechowywane są w chmurze. Należy określić, w którym sieci LSN znajduje się aktualnie opóźniona replika, i określić ją w poleceniu catchup w celu utworzenia kopii zapasowej delta pomiędzy tą siecią LSN a siecią LSN, na której aktualnie znajduje się klaster. Następnie przywrócisz tę kopię zapasową do repliki, która była opóźniona.

Inne bazy

Studenci przynieśli nam także wiele funkcji na raz. Ponieważ w Yandex gotujemy nie tylko Postgres, mamy także MySQL, MongoDB, Redis, ClickHouse, w pewnym momencie potrzebowaliśmy możliwości tworzenia kopii zapasowych z odzyskiwaniem MySQL w określonym momencie, aby była możliwość przesłania je do chmury.

Chcieliśmy to zrobić w sposób podobny do tego, co robi WAL-G. Postanowiliśmy poeksperymentować i zobaczyć, jak to wszystko będzie wyglądać.

I na początku, nie dzieląc się w żaden sposób tą logiką, napisali kod w forku. Widzieli, że mamy jakiś działający model, który potrafi latać. Wtedy pomyśleliśmy, że naszą główną społecznością są postgresiści, którzy używają WAL-G. Dlatego musimy jakoś oddzielić te części. Oznacza to, że edytując kod Postgres, nie łamiemy MySQL; edytując MySQL nie łamiemy Postgres.

WAL-G: nowe funkcje i rozwój społeczności. Georgy Ryłow

Pierwszym pomysłem, jak to rozdzielić, był pomysł zastosowania tego samego podejścia, które jest stosowane w rozszerzeniach PostgreSQL. I tak naprawdę, aby wykonać kopię zapasową MySQL, trzeba było zainstalować jakąś bibliotekę dynamiczną.

Ale tutaj asymetria tego podejścia jest natychmiast widoczna. Kiedy tworzysz kopię zapasową Postgres, umieszczasz na niej normalną kopię zapasową Postgres i wszystko jest w porządku. A w przypadku MySQL okazuje się, że instalujesz kopię zapasową Postgres, a także instalujesz dla niej bibliotekę dynamiczną dla MySQL. To brzmi trochę dziwnie. Też tak myśleliśmy i zdecydowaliśmy, że to nie jest rozwiązanie, którego potrzebowaliśmy.

Różne kompilacje dla Postgres, MySQL, MongoDB, Redis

Ale to pozwoliło nam, jak nam się wydaje, podjąć właściwą decyzję - przydzielić różne zespoły dla różnych baz. Umożliwiło to wyizolowanie logiki powiązanej z kopiami zapasowymi różnych baz danych, które będą miały dostęp do wspólnego API implementowanego przez WAL-G.

WAL-G: nowe funkcje i rozwój społeczności. Georgy Ryłow

To jest część, którą sami napisaliśmy – zanim zadaliśmy uczniom problemy. Oznacza to, że jest to dokładnie ta część, w której mogą zrobić coś złego, więc zdecydowaliśmy, że lepiej zrobimy coś takiego i wszystko będzie dobrze.

WAL-G: nowe funkcje i rozwój społeczności. Georgy Ryłow

Potem daliśmy sobie problemy. Natychmiast je zdemontowano. Studenci musieli wspierać trzy bazy.

To jest MySQL, którego kopię zapasową tworzymy przy użyciu WAL-G od ponad roku.

A teraz MongoDB zbliża się do produkcji, gdzie kończy ją plikiem. Właściwie napisaliśmy ramy dla tego wszystkiego. Następnie uczniowie napisali kilka praktycznych rzeczy. A potem doprowadzamy je do stanu, który jesteśmy w stanie zaakceptować w produkcji.

Problemy te nie wskazywały na potrzebę napisania przez studentów kompletnych narzędzi do tworzenia kopii zapasowych dla każdej z tych baz danych. U nas nie było takiego problemu. Nasz problem polegał na tym, że chcieliśmy odzyskać dane w określonym momencie i utworzyć kopię zapasową w chmurze. Poprosili uczniów o napisanie kodu, który rozwiązałby ten problem. Studenci wykorzystali już istniejące narzędzia do tworzenia kopii zapasowych, które w jakiś sposób pobierają kopie zapasowe, a następnie sklejali to wszystko w całość za pomocą WAL-G, który przesyłał to wszystko do chmury. Dodali do tego także odzyskiwanie w określonym momencie.

WAL-G: nowe funkcje i rozwój społeczności. Georgy Ryłow

Co jeszcze przywieźli uczniowie? Wprowadzili obsługę szyfrowania Libsodium do WAL-G.

Mamy również zasady dotyczące przechowywania kopii zapasowych. Teraz kopie zapasowe można oznaczyć jako trwałe. I w jakiś sposób wygodniej jest dla Twojej usługi zautomatyzować proces ich przechowywania.

WAL-G: nowe funkcje i rozwój społeczności. Georgy Ryłow

Jaki był wynik tego eksperymentu?

Na kurs zapisało się początkowo ponad 100 osób. Na początku nie mówiłem, że uniwersytet w Jekaterynburgu to Uralski Uniwersytet Federalny. Ogłosiliśmy tam wszystko. Zarejestrowało się 100 osób. W rzeczywistości znacznie mniej osób zaczęło coś robić, około 30 osób.

Jeszcze mniej osób ukończyło kurs, gdyż konieczne było napisanie testów dla już istniejących kodów. A także napraw jakiś błąd lub dodaj jakąś funkcję. Niektórzy studenci i tak zamknęli kurs.

Obecnie w trakcie tego kursu studenci naprawili około 14 zagadnień i stworzyli 10 obiektów o różnej wielkości. I wydaje mi się, że jest to pełnoprawna wymiana jednego lub dwóch programistów.

Wydawaliśmy między innymi dyplomy i zaliczenia. A 12 otrzymało dyplomy. 6 z nich obroniło się już na „5”. Ci, którzy pozostali, nie mieli jeszcze ochrony, ale myślę, że i dla nich wszystko będzie dobrze.

Plany na przyszłość

Jakie mamy plany na przyszłość?

Przynajmniej te prośby o funkcje, które usłyszeliśmy już od użytkowników i które chcemy zrealizować. Ten:

  • Monitorowanie poprawności śledzenia osi czasu w archiwum kopii zapasowych klastra HA. Można to zrobić za pomocą WAL-G. I myślę, że będziemy mieli studentów, którzy zajmą się tą sprawą.
  • Mamy już osobę odpowiedzialną za przenoszenie kopii zapasowych i WAL pomiędzy chmurami.
  • Niedawno opublikowaliśmy pomysł, że możemy jeszcze bardziej przyspieszyć WAL-G, rozpakowując przyrostowe kopie zapasowe bez przepisywania stron i optymalizując wysyłane tam archiwa.

Możesz je udostępnić tutaj

Po co był ten raport? Co więcej, teraz oprócz 4 osób, które wspierają ten projekt, mamy dodatkowe ręce, których jest całkiem sporo. Zwłaszcza jeśli napiszesz do nich w wiadomości prywatnej. A jeśli tworzysz kopię zapasową danych i robisz to za pomocą WAL-G lub chciałbyś przejść na WAL-G, z łatwością możemy spełnić Twoje życzenia.

WAL-G: nowe funkcje i rozwój społeczności. Georgy Ryłow

To jest kod QR i link. Możesz je przejrzeć i napisać wszystkie swoje życzenia. Na przykład nie naprawiamy jakiegoś błędu. Albo naprawdę potrzebujesz jakiejś funkcji, ale z jakiegoś powodu nie ma jej jeszcze w żadnej kopii zapasowej, w tym w naszej. Koniecznie napisz o tym.

WAL-G: nowe funkcje i rozwój społeczności. Georgy Ryłow

pytania

Cześć! Dziękujemy za raport! Pytanie o WAL-G, ale nie o Postgres. WAL-G tworzy kopię zapasową MySQL i wywołuje dodatkową kopię zapasową. Jeśli weźmiemy nowoczesne instalacje na CentOS i jeśli tak, zainstalujesz MySQL, MariDB zostanie zainstalowana. Od wersji 10.3 dodatkowa kopia zapasowa nie jest obsługiwana, obsługiwana jest kopia zapasowa MariDB. Jak sobie z tym radzisz?

W tej chwili nie próbowaliśmy wykonać kopii zapasowej MariDB. Mieliśmy prośby o wsparcie FoundationDB, ale ogólnie rzecz biorąc, jeśli jest taka prośba, to możemy znaleźć osoby, które to zrobią. To nie jest tak długie i trudne, jak myślę.

Dzień dobry Dziękujemy za raport! Pytanie dotyczące potencjalnych nowych funkcji. Czy jesteś gotowy, aby WAL-G współpracował z taśmami, aby móc tworzyć kopie zapasowe na taśmach?

Kopia zapasowa na taśmie najwyraźniej oznacza?

Tak.

Jest Andriej Borodin, który potrafi odpowiedzieć na to pytanie lepiej ode mnie.

(Andrey) Tak, dziękuję za pytanie! Otrzymaliśmy prośbę o przeniesienie kopii zapasowej na taśmę z magazynu w chmurze. I za to piłowanie transfer między chmurami. Ponieważ transfer z chmury do chmury jest uogólnioną wersją transferu taśmowego. Ponadto dysponujemy rozszerzalną architekturą w zakresie pamięci masowych. Nawiasem mówiąc, wiele Storogów zostało napisanych przez studentów. A jeśli napiszesz Pamięć na taśmę, to oczywiście będzie obsługiwana. Jesteśmy gotowi rozważyć pull requesty. Tam musisz napisać plik, przeczytać plik. Jeśli zrobisz te rzeczy w Go, zwykle otrzymasz 50 linii kodu. I wtedy taśma będzie obsługiwana w WAL-G.

Dziękujemy za raport! Ciekawy proces rozwoju. Kopia zapasowa to poważna funkcjonalność, która powinna zostać dobrze uwzględniona w testach. Czy wdrażając funkcjonalność dla nowych baz danych, uczniowie również pisali testy, czy też sami pisaliście testy, a następnie przekazywaliście im implementację?

Studenci pisali także testy. Ale studenci napisali więcej na temat takich funkcji, jak nowe bazy danych. Napisali testy integracyjne. I napisali testy jednostkowe. Jeśli integracja się powiedzie, czyli w tej chwili jest to skrypt, który wykonujesz ręcznie lub robisz to np. za pomocą crona. Oznacza to, że scenariusz jest bardzo przejrzysty.

Studenci nie mają dużego doświadczenia. Czy sprawdzanie zajmuje dużo czasu?

Tak, recenzje zajmują sporo czasu. To znaczy zazwyczaj, gdy kilku autorów przychodzi na raz i mówi, że zrobiłem to, zrobiłem tamto, wtedy trzeba pomyśleć i zarezerwować około pół dnia, aby dowiedzieć się, co tam napisali. Ponieważ kod należy czytać uważnie. Nie odbyli wywiadu. Nie znamy ich zbyt dobrze, więc zajmuje to sporo czasu.

Dziękujemy za raport! Wcześniej Andrey Borodin stwierdził, że polecenie Archive_command w WAL-G powinno być wywoływane bezpośrednio. Ale w przypadku jakiegoś wkładu klastrowego potrzebujemy dodatkowej logiki, aby określić węzeł, z którego wysyłane są wały. Jak samodzielnie rozwiązać ten problem?

Jaki jest twój problem? Załóżmy, że masz replikę synchroniczną, za pomocą której tworzysz kopię zapasową? Albo co?

(Andrey) Faktem jest, że rzeczywiście WAL-G jest przeznaczony do stosowania bez skryptów powłoki. Jeśli czegoś brakuje, to dodajmy logikę, która powinna znajdować się w WAL-G. Jeśli chodzi o to, skąd powinna pochodzić archiwizacja, uważamy, że archiwizacja powinna pochodzić od bieżącego wzorca w klastrze. Archiwizacja z repliki to zły pomysł. Istnieją różne możliwe scenariusze problemów. W szczególności problemy z archiwizacją terminów i wszelkich informacji dodatkowych. Dziękuję za pytanie!

(Wyjaśnienie: pozbyliśmy się skryptów powłoki w tym przypadku)

Dobry wieczór! Dziękujemy za raport! Interesuje mnie funkcja catchup, o której mówiłeś. Mieliśmy sytuację, w której replika pozostawała w tyle i nie mogła dogonić. I nie znalazłem opisu tej funkcji w dokumentach WAL-G.

Catchup pojawił się dosłownie 20 stycznia 2020 roku. Dokumentacja może wymagać więcej pracy. Sami to piszemy i nie piszemy tego super dobrze. I może powinniśmy zacząć wymagać od uczniów, aby to napisali.

Czy jest już wydany?

Żądanie ściągnięcia jest już martwe, tj. Sprawdziłem to. Wypróbowałem to na klastrze testowym. Jak dotąd nie mieliśmy sytuacji, w której moglibyśmy przetestować to na przykładzie bojowym.

Kiedy się spodziewać?

Nie wiem. Poczekaj miesiąc, sprawdzimy na pewno.

Źródło: www.habr.com

Dodaj komentarz