WAL-G: novaj funkcioj kaj komunuma ekspansio. Georgij Rilov

Mi sugestas vin legi la transskribon de la frua 2020-raporto de Georgy Rylov "WAL-G: novaj ŝancoj kaj ekspansio de la komunumo"

Malfermfontaj prizorgantoj alfrontas multajn defiojn dum ili kreskas. Kiel skribi pli kaj pli da postulataj funkcioj, ripari pli kaj pli da problemoj kaj sukcesi vidi pli kaj pli da tiraj petoj? Uzante WAL-G (rezerva ilo por PostgreSQL) kiel ekzemplon, mi rakontos al vi kiel ni solvis ĉi tiujn problemojn lanĉante kurson pri Malfermfonta evoluo ĉe la universitato, kion ni atingis kaj kien ni movos poste.

WAL-G: novaj funkcioj kaj komunuma ekspansio. Georgij Rilov

Всем еще раз привет! Я разработчик в Яндексе из Екатеринбурга. И сегодня я расскажу про WAL-G.

В названии доклада не было сказано, что это что-то про бэкапы. Кто-нибудь не знает, что такое WAL-G? Или все знают? Поднимите руку, кто не знает. Офигеть, вы пришли на доклад и не знаете, о чем он.

Давайте я расскажу, что сегодня будет. Так получилось, что наша команда довольно давно занимается бэкапом. И это еще один доклад в серии, где мы рассказываем о том, как мы храним данные безопасно, надежно, удобно и эффективно.

WAL-G: novaj funkcioj kaj komunuma ekspansio. Georgij Rilov

En antaŭaj serioj estis multaj raportoj de Andrej Borodin kaj Vladimir Leskov. Estis multaj el ni. Kaj ni parolas pri WAL-G dum multaj jaroj.

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

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

Этот доклад будет немножко отличаться от остальных тем, что там было в большей степени про техническую часть, а здесь я расскажу про то, как мы столкнулись с проблемами, связанными с ростом сообщества. И как придумали небольшую идею, которая нам помогает с этим справляться.

WAL-G: novaj funkcioj kaj komunuma ekspansio. Georgij Rilov

Antaŭ kelkaj jaroj, WAL-G estis sufiĉe malgranda projekto, kiun ni ricevis de Citus Data. Kaj ni nur prenis ĝin. Kaj ĝi estis evoluigita de unu persono.

Kaj nur WAL-G ne havis:

  • Бэкапа с реплики.
  • Не было инкрементальных бэкапов.
  • Ne estis sekurkopioj de WAL-Delta.
  • И еще кучи всего не было.

За эти несколько лет WAL-G сильно вырос.

WAL-G: novaj funkcioj kaj komunuma ekspansio. Georgij Rilov

Kaj ĝis 2020, ĉio ĉi-supra jam aperis. Kaj al tio aldoniĝis tio, kion ni nun havas:

  • Pli ol 1 steloj en GitHub.
  • 150 forkoj.
  • Около 15 открытых PR.
  • Kaj multaj pliaj kontribuantoj.
  • Kaj malfermaj aferoj la tutan tempon. Kaj ĉi tio malgraŭ tio, ke ni laŭvorte iras tien ĉiutage kaj faras ion pri ĝi.

WAL-G: novaj funkcioj kaj komunuma ekspansio. Georgij Rilov

И мы пришли к выводу, что этот проект требует больше нашего внимания, даже тогда, когда нам самим не требуется что-то реализовать для нашего сервиса Managed Databases в Яндексе.

И где-то осенью 2018-го года нам в голову пришла идея. Обычно у команды есть несколько способов, как пилить какие-то фичи, чинить баги, если у вас не хватает рук. Например, можно нанять еще одного разработчика и платить ему деньги. Или можно взять стажера на какое-то время и тоже платить ему какую-то зарплату. Но есть еще довольно большой пласт людей, часть из которых уже реально умеет писать код. Просто вы не всегда знаете, какого качества этот код.

Мы подумали и решили попробовать привлечь студентов. Но студенты будут участвовать у нас не во всем. Они будет делать только какую-то часть работы. И будут они, например, писать тесты, чинить баги, реализовывать фичи, которые не затрагивают основную функциональность. Основная функциональность – это создание бэкапов и восстановление бэкапов. Если допустить баг в создании бэкапа, то мы получим потерю данных. И никто этого, конечно, не хочет. Все хотят, чтобы все было очень надежно. Поэтому код, которому мы доверяем меньше, чем своему собственному, мы, конечно, туда пускать не хотим. Т. е. любой некритический код – это то, что мы бы хотели получить от наших дополнительных рабочих рук.

Sub kiuj kondiĉoj estas studenta PR akceptata?

  • Ili estas postulataj kovri sian kodon per testoj. Ĉio devus okazi en CI.
  • И также проходим 2 ревью. Одно Андрея Бородина и одно мое.
  • Kaj aldone, por kontroli, ke tio ne rompos ion en nia servo, mi aparte alŝutas la asembleon kun ĉi tiu kompromiso. Kaj ni kontrolas en fin-al-finaj testoj, ke nenio malsukcesas.

Speciala kurso pri Malferma Kodo

WAL-G: novaj funkcioj kaj komunuma ekspansio. Georgij Rilov

Чуть-чуть про то, зачем это нужно и почему это, мне кажется, клевой идеей.

Por ni, la profito estas evidenta:

  • Мы получаем дополнительные руки.
  • И ищем кандидатов в команду среди толковых студентов, которые пишут толковый код.

Какой профит для студентов?

Ili povas esti malpli evidentaj, ĉar studentoj, minimume, ne ricevas monon por la kodo, kiun ili skribas, sed nur ricevas notojn por siaj studentaj registroj.

Mi demandis ilin pri tio. Kaj en iliaj vortoj:

  • Опыт контрибьютора в Open Source.
  • Akiru linion en via CV.
  • Проявить себя и пройти собеседование в Яндекс.
  • Стать участником GSoC.
  • +1 спецкурс для тех, кто хочет писать код.

Я не буду рассказывать про то, как курс был устроен. Я только скажу, что WAL-G был основным проектом. А еще мы в этот курс включили такие проекты как Odyssey, PostgreSQL и ClickHouse.

Kaj ili donis problemojn ne nur en ĉi tiu kurso, sed ankaŭ disdonis diplomojn kaj kurslaborojn.

Kio pri la avantaĝo por uzantoj?

Теперь перейдем к части, которая интересует, скорее, вас. Какой вам от этого толк? Толк в том, что студенты починили много багов. И сделали фичи request, которые вы просили нас сделать.

Kaj mi rakontu al vi pri la aferoj, kiujn vi longe deziris kaj kiuj realiĝis.

WAL-G: novaj funkcioj kaj komunuma ekspansio. Georgij Rilov

Subteno de tabelspacoj. Tabelspacoj en WAL-G estis atenditaj verŝajne ekde la liberigo de WAL-G, ĉar WAL-G estas la posteulo de alia rezerva ilo WAL-E, kie datumbazaj sekurkopioj kun tabelspacoj estis apogitaj.

Lasu min mallonge memorigi al vi kio ĝi estas kaj kial ĝi estas ĉio bezonata. Tipe, ĉiuj viaj datumoj de Postgres okupas unu dosierujon en la dosiersistemo, nomata bazo. Kaj ĉi tiu dosierujo jam enhavas ĉiujn dosierojn kaj subdosierujojn postulatajn de Postgres.

Tablespaces являются директориями, в которых лежат данные Postgres, но они не лежат вне базовой директории. На слайде видно, что tablespac’ы находятся вне базовой директории.

WAL-G: novaj funkcioj kaj komunuma ekspansio. Georgij Rilov

Kiel ĉi tio aspektas por Postgres mem? Estas aparta subdosierujo pg_tblspc en la baza dosierujo. Kaj ĝi enhavas simbolligojn al dosierujoj, kiuj efektive enhavas Postgres-datumojn ekster la baza dosierujo.

WAL-G: novaj funkcioj kaj komunuma ekspansio. Georgij Rilov

Kiam vi uzas ĉion ĉi, tiam por vi ĉi tiuj komandoj povas aspekti kiel ĉi tio. Tio estas, vi kreas tabelon en iu specifita tabelspaco kaj vidas kie ĝi estas nun. Ĉi tiuj estas la lastaj du linioj, la lastaj du komandoj nomitaj. Kaj tie estas klare, ke ekzistas ia maniero. Sed fakte, ĉi tio ne estas la vera maniero. Ĉi tiu estas la prefiksita vojo de la baza dosierujo al tabelspaco. Kaj de tie ĝi kongruas kun simbolligo, kiu kondukas al viaj realaj datumoj.

У нас это все не используется в нашей команде, зато использовалось у многих других пользователей WAL-E, которые писали нам, что они хотят переехать на WAL-G, но это им мешало. Теперь это поддерживается.

WAL-G: novaj funkcioj kaj komunuma ekspansio. Georgij Rilov

Alia trajto, kiun nia speciala kurso alportis al ni, estas reakiro. Homoj, kiuj verŝajne laboris pli kun Oracle ol kun Postgres, scias pri reakiro.

Вкратце о том, что это такое. Как-то так может обычно выглядеть топология кластера в нашем сервисе. У нас есть мастер. Есть реплика, которая стримит с него write-ahead log. И реплика говорит мастеру на каком LSN она сейчас находится. И где-то параллельно с этим может архивироваться журнал. И кроме архивации журнала еще в облако оправляются бэкапы. И отправляются дельта-бэкапы.

Kio povus esti la problemo? Kiam vi havas sufiĉe grandan datumbazon, povas rezulti, ke via kopio komencas postresti multe malantaŭ la majstro. Kaj ŝi postrestas tiom malantaŭe, ke ŝi neniam povas atingi lin. Ĉi tiu problemo kutime devas esti solvita iel.

Kaj la plej facila maniero estas forigi la kopion kaj re-alŝuti ĝin, ĉar ĝi neniam atingos, kaj la problemo devas esti traktita. Sed ĉi tio estas sufiĉe longa, ĉar restarigo de tuta datumbaza sekurkopio de 10 TB estas tre, tre longa tempo. Kaj ni volas fari ĉion ĉi kiel eble plej rapide, se tiaj problemoj aperos. Kaj ĝuste por tio servas catchup.

Catchup permesas uzi deltajn sekurkopiojn, kiuj estas konservitaj en la nubo tiamaniere. Vi diras, pri kiu LSN estas la postreplika kopio kaj specifu ĝin en la komando catchup por krei deltan sekurkopion inter tiu LSN kaj la LSN sur kiu via areto nuntempe situas. Kaj post tio vi restarigas ĉi tiun sekurkopion al la kopio, kiu postrestis.

Другие базы

La studentoj ankaŭ alportis al ni multajn funkciojn samtempe. Ĉar ĉe Yandex ni kuiras ne nur Postgres, ni ankaŭ havas MySQL, MongoDB, Redis, ClickHouse, iam ni bezonis povi fari sekurkopiojn kun ĝustatempa reakiro por MySQL, kaj por ke estu ŝanco alŝuti. ilin al la nubo.

И хотели мы это делать каким-то похожим образом, которым делает WAL-G. И решили поэкспериментировать и посмотреть, как это все будет выглядеть.

Kaj komence, sen dividi ĉi tiun logikon iel ajn, ili skribis la kodon en la forko. Ili vidis, ke ni havas ian funkciantan modelon kaj ĝi povas flugi. Tiam ni pensis, ke nia ĉefa komunumo estas postgresistoj, ili uzas WAL-G. Kaj tial ni devas iel apartigi ĉi tiujn partojn. Tio estas, kiam ni redaktas kodon por Postgres, ni ne rompas MySQL; kiam ni redaktas MySQL, ni ne rompas Postgres.

WAL-G: novaj funkcioj kaj komunuma ekspansio. Georgij Rilov

Первой идеей о том, как это разделять, была идея использовать тот же подход, что используется в extensions PostgreSQL. И, по сути, чтобы сделать бэкап MySQL вы должны были поставить какую-то динамическую библиотеку.

Но здесь сразу видна несимметричность этого подхода. Когда вы бэкапите Postgres, то вы ставите на него нормальную бэкапелку для Postgres и все отлично. А для MySQL получается, что вы ставите бэкапелку для Postgres и еще для нее ставите динамическую библиотеку для MySQL. Звучит как-то странно. Мы тоже так подумали и решили, что это не то решение, что нам нужно.

Разные сборки для Postgres, MySQL, MongoDB, Redis

Но это позволило нам, как нам кажется, прийти к правильному решению – выделить разные сборки для разных баз. Это позволяло изолировать логику, завязанную на бэкапах различных баз данных, которые будут обращаться к общему API, которые реализует WAL-G.

WAL-G: novaj funkcioj kaj komunuma ekspansio. Georgij Rilov

Jen la parto, kiun ni mem skribis – antaŭ ol doni al la studentoj la problemojn. Tio estas, ĉi tio estas ĝuste la parto, kie ili povus fari ion malbonan, do ni decidis, ke ni pli bone faru ion tian kaj ĉio estos en ordo.

WAL-G: novaj funkcioj kaj komunuma ekspansio. Georgij Rilov

После этого мы выдали задачки. Их сразу разобрали. От студентов требовалось поддержать три базы.

Ĉi tio estas MySQL, kiun ni subtenis uzante WAL-G tiamaniere dum pli ol jaro.

И сейчас уже MongoDB приближается к production, там его напильником допиливают. По сути, каркас для всего этого написали мы. Потом студенты написали какие-то работающие вещи. И потом мы их доводим до такого состояния, которое можем принять у себя в production.

Эти задачки не выглядели так, что студентам нужно было написать цельные backup tools для каждой из этих баз. У нас такой проблемы не стояло. Наша проблема была в том, что мы хотели point-in-time recovery и мы хотели бэкапить в облако. И попросили студентов написать какой-то код, который будет это решать. Студенты воспользовались уже существующими backup tools, которые как-то снимают бэкапы, а потом уже склеивали все это с WAL-G, что переправляло это все в облако. И также к этому добавляли point-in-time recovery.

WAL-G: novaj funkcioj kaj komunuma ekspansio. Georgij Rilov

Что еще приносили студенты? Они принесли в WAL-G поддержку шифрования Libsodium.

Ni ankaŭ havas rezervajn stokadpolitikojn. Nun sekurkopioj povas esti markitaj kiel permanentaj. Kaj iel estas pli oportune por via servo aŭtomatigi la procezon de stokado de ili.

WAL-G: novaj funkcioj kaj komunuma ekspansio. Georgij Rilov

Kio estis la rezulto de ĉi tiu eksperimento?

Pli ol 100 homoj komence registriĝis por la kurso. Komence mi ne diris, ke la universitato en Jekaterinburg estas la Urala Federacia Universitato. Ni anoncis ĉion tie. 100 homoj registriĝis. En realeco, multe malpli da homoj komencis fari ion, proksimume 30 homoj.

Закрыло курс еще меньше человек, потому что там нужно было написать тесты к тем кодам, которые уже есть. А также починить какой-то баг или сделать какую-то фичу. И часть студентов все же закрыли курс.

На текущий момент за этот курс студенты починили около 14 issues, сделали 10 фич разного размера. И, как мне кажется, это полноценная замена одного-двух разработчиков.

Кроме всего прочего мы выдавали дипломы и курсовые работы. И 12 взяли дипломы. 6 из них уже защитились на «5». У оставшихся еще защиты не было, но я думаю, что у них тоже все будет хорошо.

Planoj por la estonteco

Kiajn planojn ni havas por la estonteco?

По крайней мере те фичи-requests, которые мы уже от пользователей слышали и хотим их сделать. Это:

  • Monitorante la ĝustecon de tempolinia spurado en la rezerva arkivo de HA-grupo. Vi povas fari tion per WAL-G. Kaj mi pensas, ke ni havos studentojn, kiuj traktos ĉi tiun aferon.
  • За перенос бэкапов и WAL’а между облаками у нас уже есть ответственный человек.
  • Kaj ni lastatempe publikigis ideon, ke ni povas akceli WAL-G eĉ pli malpakante pliigajn sekurkopiojn sen reverki paĝojn kaj optimumigi la arkivojn, kiujn ni sendas tien.

Vi povas dividi ilin ĉi tie

К чему был этот доклад? К тому, что сейчас, кроме нас 4-х человек, которые поддерживают этот проект, у нас есть дополнительные руки, которых довольно много. Особенно, если им писать в личку. И если вы бэкапите свои данные и делаете это с помощью WAL-G или хотели бы на WAL-G переехать, то ваши желания мы можем довольно легко учесть.

WAL-G: novaj funkcioj kaj komunuma ekspansio. Georgij Rilov

Ĉi tio estas QR-kodo kaj ligilo. Vi povas trarigardi ilin kaj skribi ĉiujn viajn dezirojn. Ekzemple, ni ne riparas iun cimon. Aŭ vi vere volas iun funkcion, sed ial ĝi ankoraŭ ne estas en neniu sekurkopio, inkluzive de la nia. Nepre skribu pri ĉi tio.

WAL-G: novaj funkcioj kaj komunuma ekspansio. Georgij Rilov

Viaj demandoj

Saluton! Dankon pro la raporto! Demando pri WAL-G, sed ne pri Postgres. WAL-G rezervas MySQL kaj vokas kroman sekurkopion. Se ni prenas modernajn instalaĵojn sur CentOS kaj se vi bone instalas MySQL, MariDB estos instalita. De versio 10.3 ekstra sekurkopio ne estas subtenata, MariDB-sekurkopio estas subtenata. Kiel vi fartas kun ĉi tio?

На данный момент мы не пытались бэкапить MariDB. У нас были запросы на поддержку FoundationDB, но в целом, если такой запрос есть, то мы можем найти людей, которые это сделают. Это не так долго и не так сложно, как мне кажется.

Bonan posttagmezon Dankon pro la raporto! Demando pri eblaj novaj funkcioj. Ĉu vi pretas igi WAL-G funkcii per glubendoj por ke vi povu sekurkopii al bendoj?

Бэкап на ленточном хранилище видимо имеется в виду?

Jes.

Estas Andreo Borodin, kiu povas respondi ĉi tiun demandon pli bone ol mi.

(Андрей) Да, спасибо за вопрос! У нас был запрос на перенос бэкапа на ленту из облачного хранилища. И для этого пилится перенос между облаками. Потому что перенос между облаками — это некоторая обобщенная версия переноса на ленту. Кроме того, у нас расширяемая архитектура в части Storages. Кстати, многие Storoges были студентами написаны. И если вы напишете Storage для ленты, то он, конечно, будет поддержан. Мы готовы рассматривать pull request. Там надо записать файл, прочитать файл. Если эти штуки сделать на Go, то обычно получается 50 строчек кода. И тогда в WAL-G будет поддержана лента.

Dankon pro la raporto! Interesa evoluprocezo. Rezervo estas serioza peco de funkcieco, kiu devus esti bone kovrita per testoj. Kiam vi efektivigis funkciecon por novaj datumbazoj, ĉu la studentoj ankaŭ skribis la testojn, aŭ ĉu vi skribis la testojn mem kaj poste donis la efektivigon al la studentoj?

Studentoj ankaŭ skribis testojn. Sed studentoj skribis pli por funkcioj kiel novaj datumbazoj. Ili skribis integrigajn testojn. Kaj ili skribis unutestojn. Se la integriĝo pasas, tio estas, nuntempe, ĉi tio estas skripto, kiun vi ekzekutas permane aŭ vi havas cron farante ĝin, ekzemple. Tio estas, la skripto tie estas tre klara.

La studentoj ne havas multe da sperto. Ĉu reviziado bezonas multan tempon?

Jes, recenzoj prenas sufiĉe da tempo. Tio estas, kutime, kiam pluraj komitatanoj venas samtempe kaj diras, ke mi faris tion, mi faris tion, tiam vi devas pensi kaj rezervi ĉirkaŭ duonan tagon por eltrovi, kion ili skribis tie. Ĉar la kodo devas esti atente legita. Ili ne havis intervjuon. Ni ne konas ilin tre bone, do necesas multe da tempo.

Dankon pro la raporto! Antaŭe, Andrey Borodin deklaris, ke archive_command en WAL-G devus esti vokita rekte. Sed en la kazo de ia grapokartoĉo, ni bezonas plian logikon por determini la nodon de kiu sendi la ŝaftojn. Kiel vi solvas ĉi tiun problemon mem?

Kio estas via problemo ĉi tie? Ni diru, ke vi havas sinkronan kopion kun kiu vi faras sekurkopion? Aŭ kio?

(Andrey) Fakte estas, ke ja WAL-G estas intencita por esti uzata sen ŝelaj skriptoj. Se io mankas, do ni aldonu la logikon, kiu devus esti ene de WAL-G. Koncerne de kie arkivado devus veni, ni kredas ke arkivado devus esti de la nuna majstro en la areto. Arkivado de kopio estas malbona ideo. Estas diversaj eblaj scenaroj kun problemoj. Aparte, problemoj kun arkivado de templinioj kaj ajnaj aldonaj informoj. Dankon pro la demando!

(Уточнение: От обвязки shell-скриптами избавились в этом issue)

Добрый вечер! Спасибо за доклад! Заинтересовала фича catchup, про которую вы рассказали. Сталкивались с ситуацией отставания реплики, которая никак не могла догнать. И я в WAL-G не нашел описания в документах этой фичи.

Catchup aperis laŭvorte la 20an de januaro 2020. La dokumentado eble bezonos plian laboron. Ni skribas ĝin mem kaj ni ne skribas ĝin tre bone. Kaj eble ni devus komenci postuli studentojn verki ĝin.

Ĉu ĝi jam estas liberigita?

La tirpeto jam mortis, t.e. mi kontrolis ĝin. Mi provis ĉi tion sur testa grupo. Ĝis nun ni ne havis situacion kie ni povus testi ĉi tion en batalekzemplo.

Kiam atendi?

Mi ne scias. Atendu monaton, ni certe kontrolos.

fonto: www.habr.com

Aldoni komenton