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 的后继者,后者支持使用表空间进行数据库备份。

让我简要提醒您它是什么以及为什么需要它。 通常,所有 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 日出现的。 该文档可能需要更多工作。 我们自己写,但写得不太好。 也许我们应该开始要求学生写它。

已经发布了吗?

拉取请求已经死了,即我检查了它。 我在测试集群上尝试过这个。 到目前为止,我们还没有遇到可以在战斗示例中测试这一点的情况。

预计什么时候?

我不知道。 等一个月吧,我们会检查一下。

来源: habr.com

添加评论