WAL-G:新功能和社群擴展。 格奧吉·雷洛夫

我建議您閱讀 Georgy Rylov 2020 年初報告的文字記錄“WAL-G:社區的新機會和擴展”

開源維護者在成長過程中面臨許多挑戰。如何編寫越來越多的必需功能、解決越來越多的問題並設法查看越來越多的拉取請求?以WAL-G(PostgreSQL備份工具)為例,我會告訴你我們是如何透過在大學開設開源開發課程來解決這些問題的,我們取得了哪些成果以及下一步的發展方向。

WAL-G:新功能和社群擴展。 格奧吉·雷洛夫

大家好!我是來自葉卡捷琳堡的 Yandex 開發人員。今天我要談談WAL-G。

報告的標題並沒有說這是關於備份的事情。有誰知道WAL-G是什麼?或者說大家都知道嗎?不知道的請舉手。天哪,你看了報告卻不知道它在說什麼。

讓我告訴你今天會發生什麼。碰巧我們的團隊做備份已經有一段時間了。這是系列報告中的另一份報告,我們討論如何安全、可靠、方便和有效率地儲存資料。

WAL-G:新功能和社群擴展。 格奧吉·雷洛夫

在之前的系列中,安德烈·鮑羅丁(Andrei Borodin)和弗拉基米爾·列斯科夫(Vladimir Leskov)做了很多報道。我們有很多人。我們多年來一直在談論 WAL-G。

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

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

這份報告與其他報告略有不同,因為它更多地涉及技術部分,但在這裡我將討論我們如何遇到與社區成長相關的問題。以及我們如何想出一個小主意來幫助我們應對這個問題。

WAL-G:新功能和社群擴展。 格奧吉·雷洛夫

幾年前,WAL-G 是我們從 Citus Data 獲得的一個相當小的專案。我們就拿走了它。而且是一個人開發的。

只有 WAL-G 沒有:

  • 從副本備份。
  • 沒有增量備份。
  • 沒有 WAL-Delta 備份。
  • 還有很多東西缺失了。

這幾年,WAL-G成長了很多。

WAL-G:新功能和社群擴展。 格奧吉·雷洛夫

而到了2020年,以上這些都已經出現了。除此之外還加入了我們現在擁有的內容:

  • GitHub 上有超過 1 顆星。
  • 150個叉子。
  • 約 15 個開放 PR。
  • 還有更多的貢獻者。
  • 並且一直存在開放性問題。儘管事實上我們每天都會去那裡並為此做一些事情。

WAL-G:新功能和社群擴展。 格奧吉·雷洛夫

我們得出的結論是,這個專案需要我們更多的關注,即使我們自己不需要為 Yandex 中的託管資料庫服務實現任何內容。

2018 年秋天的某個時候,我們想到了一個想法。通常,如果你沒有足夠的人手,團隊有多種方法來開發某些功能或修復錯誤。例如,您可以僱用另一位開發人員並向他付錢。或者你可以聘請實習生一段時間,並支付他一些薪水。但仍然有相當多的人,其中一些已經真正懂得如何編寫程式碼。您只是並不總是知道程式碼的品質如何。

我們想了想,決定想辦法吸引學生。但學生不會和我們一起參與所有事情。他們只會做一部分工作。例如,他們將編寫測試、修復錯誤、實作不影響主要功能的功能。主要功能是建立備份和恢復備份。如果我們在建立備份時犯了錯誤,我們將會遇到資料遺失的情況。當然,沒有人想要這樣。每個人都希望一切都非常安全。因此,我們當然不想讓我們信任的程式碼比我們自己的程式碼更不信任。也就是說,任何非關鍵程式碼都是我們希望從額外工作人員收到的程式碼。

學生PR在什麼條件下被接受?

  • 他們需要透過測試來覆蓋他們的程式碼。一切都應該在 CI 中進行。
  • 我們也進行了 2 則評論。一本是安德烈·鮑羅丁(Andrey Borodin)寫的,另一本是我寫的。
  • 此外,為了檢查這不會破壞我們服務中的任何內容,我單獨上傳了帶有此提交的程序集。我們檢查端對端測試,沒有任何故障。

開源特別課程

WAL-G:新功能和社群擴展。 格奧吉·雷洛夫

稍微解釋一下為什麼需要這樣做,以及為什麼在我看來這是一個很酷的想法。

對我們來說,利潤是顯而易見的:

  • 我們得到了額外的人手。
  • 我們正在為團隊尋找編寫智慧程式碼的聰明學生的候選人。

對學生有什麼好處?

它們可能不太明顯,因為學生至少不會因為他們編寫的程式碼而獲得金錢,而只會獲得他們的學生記錄的成績。

我問過他們這件事。用他們的話來說:

  • 開源貢獻者經驗。
  • 在你的履歷中添加一行。
  • 證明自己並通過 Yandex 面試。
  • 成為 GSoC 會員。
  • +1 針對想要編寫程式碼的人的特別課程。

我不會談課程的結構。我只想說 WAL-G 是主要項目。我們在本課程中還包括了 Odyssey、PostgreSQL 和 ClickHouse 等項目。

他們不僅給了這門課的問題,也給了文憑和作業。

帶給用戶的好處又如何呢?

現在讓我們進入您最感興趣的部分。這對你有什麼好處?重點是學生修復了很多bug。我們提出了您要求我們做的請求功能。

讓我告訴你一些你一直想要並且已經實現的事情。

WAL-G:新功能和社群擴展。 格奧吉·雷洛夫

表空間支援。 WAL-G 中的表空間可能是從 WAL-G 發布以來就被期待的,因為 WAL-G 是另一個備份工具 WAL-E 的後繼者,WAL-E 支援使用表空間進行資料庫備份。

讓我簡要提醒您它是什麼以及為什麼需要它。通常,所有 Postgres 資料都會佔用檔案系統上的一個目錄,稱為「base」。而這個目錄已經包含了Postgres所需的所有檔案和子目錄。

表空間是包含 Postgres 資料的目錄,但它們不位於基本目錄之外。此投影片顯示表空間位於基本目錄之外。

WAL-G:新功能和社群擴展。 格奧吉·雷洛夫

對於 Postgres 本身來說,這是什麼樣的?基本目錄中有一個單獨的子目錄 pg_tblspc。它包含指向目錄的符號鏈接,這些目錄實際上包含基本目錄之外的 Postgres 資料。

WAL-G:新功能和社群擴展。 格奧吉·雷洛夫

當您使用所有這些時,對您來說這些命令可能看起來像這樣。也就是說,您在某個指定的表空間中建立一個表並查看它現在的位置。這是最後兩行,最後調用的兩個命令。很明顯,有某種方法。但事實上,這並不是真正的方法。這是從基底目錄到表空間的前綴路徑。從那裡它與指向您的真實數據的符號鏈接相匹配。

我們的團隊中並沒有使用所有這些,但許多其他 WAL-E 用戶使用了它,他們寫信給我們說他們想遷移到 WAL-G,但這阻止了他們。現在支持這一點。

WAL-G:新功能和社群擴展。 格奧吉·雷洛夫

我們的特色課程帶給我們的另一個特點就是追趕。與 Oracle 合作多於與 Postgres 合作的人都知道追趕。

簡單介紹一下它是什麼。我們服務中的叢集拓撲通常看起來像這樣。我們有一個師傅。有一個副本從其中串流預寫日誌。副本告訴主節點它目前所在的 LSN。與此並行的某個地方,可以對日誌進行歸檔。除了歸檔日誌之外,備份也會傳送到雲端。並發送增量備份。

可能是什麼問題呢?當您擁有相當大的資料庫時,您的副本可能會開始遠遠落後於主資料庫。而她卻遠遠落後於他,永遠追不上他。這個問題通常需要以某種方式解決。

最簡單的方法是刪除副本並重新上傳,因為它永遠不會趕上,並且需要處理問題。但這是相當長的時間,因為恢復整個 10 TB 資料庫備份是一個非常非常長的時間。如果出現此類問題,我們希望盡快完成這一切。這正是追趕的目的。

Catchup 允許您使用增量備份,增量備份以這種方式儲存在雲端。您可以指定滯後副本目前所在的 LSN,並在 catchup 指令中指定它,以便在該 LSN 和叢集目前所在的 LSN 之間建立增量備份。之後,您將此備份還原到落後的副本。

其他基地

同學們也一下子為我們帶來了很多特色。因為在 Yandex,我們不只做 Postgres,我們還有 MySQL、MongoDB、Redis、ClickHouse,在某些時候我們需要能夠透過 MySQL 的時間點復原進行備份,這樣就有機會將他們上傳到雲端。

我們希望以類似於 WAL-G 的方式來做到這一點。我們決定進行實驗,看看它會是什麼樣子。

起初,他們在沒有以任何方式共享此邏輯的情況下,在分支中編寫了程式碼。他們看到我們有某種工作模型並且它可以飛行。然後我們認為我們的主要社區是postgresists,他們使用WAL-G。因此我們需要以某種方式將這些部分分開。也就是說,當我們編輯Postgres的程式碼時,我們不會破壞MySQL;當我們編輯MySQL時,我們不會破壞Postgres。

WAL-G:新功能和社群擴展。 格奧吉·雷洛夫

關於如何分離它的第一個想法是使用 PostgreSQL 擴充功能中使用的相同方法。事實上,要進行 MySQL 備份,您必須安裝某種動態程式庫。

但這種方法的不對稱性是顯而易見的。當您備份 Postgres 時,您將 Postgres 的正常備份放在上面,一切都很好。對於 MySQL,您需要安裝 Postgres 的備份,並為其安裝 MySQL 的動態程式庫。聽起來有點奇怪。我們也這麼認為,並認為這不是我們需要的解決方案。

Postgres、MySQL、MongoDB、Redis 的各種構建

但在我們看來,這讓我們做出了正確的決定——為不同的基地分配不同的集會。這使得隔離與各種資料庫備份相關的邏輯成為可能,這些資料庫將存取 WAL-G 實現的通用 API。

WAL-G:新功能和社群擴展。 格奧吉·雷洛夫

這是我們在給學生問題之前自己寫的部分。也就是說,這正是他們可能做錯事的部分,所以我們決定最好這樣做,一切都會好起來的。

WAL-G:新功能和社群擴展。 格奧吉·雷洛夫

之後我們給了問題。他們立即被拆除。學生被要求支持三個基地。

這就是 MySQL,一年多來我們一直以這種方式使用 WAL-G 來備份。

現在 MongoDB 即將投入生產,他們正在用一個檔案來完成它。事實上,我們為這一切編寫了框架。然後學生寫了一些可行的東西。然後我們將它們帶到我們可以在生產中接受的狀態。

這些問題看起來學生不需要為每個資料庫編寫完整的備份工具。我們沒有這樣的問題。我們的問題是我們想要時間點恢復並且我們想要備份到雲端。他們要求學生編寫一些程式碼來解決這個問題。學生使用現有的備份工具,以某種方式備份,然後將其與 WAL-G 粘合在一起,然後將其全部轉發到雲端。他們還為此添加了時間點恢復。

WAL-G:新功能和社群擴展。 格奧吉·雷洛夫

同學們還帶來了什麼?他們為 WAL-G 帶來了 Libsodium 加密支援。

我們還有備份儲存策略。現在備份可以標記為永久。不知何故,讓您的服務自動化儲存它們的過程會更方便。

WAL-G:新功能和社群擴展。 格奧吉·雷洛夫

這個實驗的結果是什麼?

最初有 100 多人報名參加課程。起初我並沒有說葉卡捷琳堡的大學是烏拉爾聯邦大學。我們在那裡宣布了一切。 100人報名。事實上,開始做某件事的人要少得多,大約有 30 人。

完成該課程的人甚至更少,因為有必要為已經存在的程式碼編寫測試。並修復一些錯誤或添加一些功能。還有一些學生仍然關閉了課程。

目前,在本課程中,學生已修復了約 14 個問題並製作了 10 個不同大小的功能。而且,在我看來,這是對一兩個開發人員的全面替代。

除此之外,我們也頒發了文憑和課程作業。 12人獲得畢業證書。其中6人已經為自己辯護為「5」。留下來的人還沒有得到保護,但我想他們也會一切順利。

Планынабудущее

我們對未來有什麼計畫?

至少我們已經從用戶那裡聽到了那些我們想要做的功能請求。這:

  • 監控 HA 叢集備份存檔中時間軸追蹤的正確性。您可以使用 WAL-G 來做到這一點。我認為我們會有學生來處理這個問題。
  • 我們已經有專人負責在雲端之間傳輸備份和 WAL。
  • 我們最近發布了一個想法,即透過解壓縮增量備份而無需重寫頁面並優化我們發送到那裡的存檔,我們可以進一步加快 WAL-G 的速度。

您可以在這裡分享它們

這份報告是用來做什麼的?而且,現在除了支持這個計畫的4個人之外,我們還有額外的人手,數量還不少。特別是如果您以個人資訊的形式寫信給他們。如果您備份資料並使用 WAL-G 進行備份或希望遷移到 WAL-G,那麼我們可以輕鬆滿足您的願望。

WAL-G:新功能和社群擴展。 格奧吉·雷洛夫

這是一個二維碼和一個連結。您可以瀏覽它們並寫下您所有的願望。例如,我們沒有修復某些錯誤。或者您確實想要某些功能,但由於某種原因它尚未出現在任何備份中,包括我們的備份。一定要寫下這一點。

WAL-G:新功能和社群擴展。 格奧吉·雷洛夫

問題

你好!感謝您的報告!關於 WAL-G 的問題,但不是關於 Postgres 的問題。 WAL-G 備份 MySQL 並呼叫額外備份。如果我們在 CentOS 上進行現代安裝,並且您執行 yum install MySQL,則將安裝 MariDB。從10.3版本開始不支援額外備份,支援MariDB備份。你現在怎麼樣?

目前我們還沒有嘗試備份 MariDB。我們已經收到了 FoundationDB 支援的請求,但總的來說,如果有這樣的請求,那麼我們可以找到願意這樣做的人。它並不像我想像的那麼長或那麼困難。

午安感謝您的報告!關於潛在新功能的問題。您準備好讓 WAL-G 與磁帶配合使用以便可以備份到磁帶嗎?

磁帶儲存上的備份顯然意味著什麼?

是。

安德烈·鮑羅丁(Andrei Borodin)比我更能回答這個問題。

(安德烈)是的,謝謝你的提問!我們請求將備份從雲端儲存傳輸到磁帶。而為此 鋸切 雲之間的傳輸。因為雲到雲傳輸是磁帶傳輸的通用版本。此外,我們在儲存方面有一個可擴展的架構。順便說一句,許多 Storoges 都是學生寫的。如果您為磁帶編寫存儲,那麼它當然會受到支援。我們準備考慮拉取請求。在那裡你需要寫入一個文件,讀取一個文件。如果您在 Go 中執行這些操作,通常會得到 50 行程式碼。然後WAL-G將支援磁帶。

感謝您的報告!有趣的開發流程。備份是一項重要的功能,應該透過測試來很好地涵蓋。當您為新資料庫實現功能時,學生也編寫測試,還是您自己編寫測試,然後將實作交給學生?

學生們也寫了測驗。但學生們為新資料庫等功能編寫了更多內容。他們編寫了整合測試。他們編寫了單元測試。如果整合通過,也就是說,此時,這是您手動執行的腳本,或者例如讓 cron 執行它。也就是說,那裡的劇本非常清楚。

學生沒有太多經驗。審核需要很多時間嗎?

是的,評論需要相當多的時間。也就是說,通常,當幾個提交者同時過來說我做了這個,我做了那個,那麼你需要思考並留出大約半天的時間來弄清楚他們在那裡寫了什麼。因為代碼必須仔細閱讀。他們沒有接受採訪。我們對他們不太了解,因此需要花費大量時間。

感謝您的報告!先前,Andrey Borodin 表示,應該直接呼叫 WAL-G 中的 archive_command。但在某種集群盒的情況下,我們需要額外的邏輯來決定發送軸的節點。你自己如何解決這個問題?

你這裡有什麼問題嗎?假設您有一個用於進行備份的同步副本?或者是什麼?

(Andrey) 事實上,WAL-G 確實是打算在沒有 shell 腳本的情況下使用。如果缺少某些內容,那麼讓我們加入應該位於 WAL-G 內部的邏輯。至於歸檔應該從哪裡來,我們認為歸檔應該來自集群中當前的master。從副本存檔是一個壞主意。有多種可能出現問題的情況。特別是歸檔時間表和任何附加資訊的問題。謝謝你的提問!

(澄清:我們擺脫了 shell 腳本 在這個問題上)

晚安!感謝您的報告!我對你提到的追趕功能很感興趣。我們面臨複製品落後、追不上的情況。而且我在WAL-G文件中沒有找到這個功能的描述。

Catchup 確實是在 20 年 2020 月 XNUMX 日出現的。該文件可能需要更多工作。我們自己寫,但寫得不太好。也許我們應該開始要求學生寫它。

已經發布了嗎?

拉取請求已經死了,即我檢查了它。我在測試集群上嘗試過這個。到目前為止,我們還沒有遇到可以在戰鬥範例中測試這一點的情況。

預計什麼時候?

我不知道。等一個月吧,我們會檢查一下。

來源: www.habr.com

添加評論