天灾易躲,人祸难防|渡渡鸟复兴会战队

TiDB 深谙应对各种灾难,但俗话说“天灾易隐,人祸难防”。各种误操作、Bug、写错数据,甚至删除数据库跑路,都没有解决办法。我们的项目最初也是为了处理这些“意外”事件而设计的。该项目的原名是 TiDB Flashback。后来觉得名字太差,体现不出项目内容的优越性。后来干脆改成了“MVCC Time Machine”。——渡渡鸟修复队

在 TiDB Hackathon 2021 活动中,Dodo Renaissance 团队的作品《MVCC Time Machine》充分利用 MVCC 的特性,增强了 MVCC 数据的查询、组织和恢复能力,提高了问题处理的效率,荣获“三”的事件。奖品”。

一个非常智能轻量级的实现,效果非常好,期待尽快发布。——冯广普评委 本项目是运维同学在某些时候的救命功能。通过SQL很好的解决了运维的操作问题。更棒的是,项目引入了多安全点机制,即可以定期为 TiDB 集群做一些全局快照,实现快速轻量级的逻辑备份。——刘唐法官

关于该项目

天灾易隐,人祸难防

作为分布式数据库,完善的高可用和容灾机制可以说是 TiDB 的核心特性。然而,在生产中,理论上和现实中的灾难恢复可能会有很大的不同。自然灾害造成的不可预知的硬件故障、断网、停电固然可怕,但将生产环境当成测试环境的误操作、黑客利用漏洞攻击、业务漏洞写入不良数据可能是更频繁的事故。

团队成员之一@disking曾在一家游戏公司工作,对这个“人为错误”深有感触:业务同事编写的代码中的一个bug在发布后的几个小时内就被别有用心的玩家利用的版本。收益不当,此时需要进行回滚操作,将游戏数据返回到特定时间点,而需要实现的是类似于“时光机”的功能。手动回滚,数据丢失造成的损失会给团队带来很多麻烦。

目前 TiDB 已经提供了物理故障处理的解决方案flash 打字母游戏的控制范围的代码,比如 BR 工具和多中心解决方案在两个地方,但是这句`rm -rf /*`,或者“实习生误操作”导致的错误数据写入的风险是更不可控,这也是 TiDB 缺失的一大块拼图。

让 MVCC 再次伟大!

由于 TiDB 的事务是基于 MVCC 的,所以旧版本可以使用一段时间。理论上,上述人为灾难是可以人工恢复的。但现有和计划中的功能相对较弱:

因此,充分利用 MVCC 的特性,增强 MVCC 数据的查询、组织和恢复能力,可以提高问题处理的效率。MVCC 不仅可以用来临时处理事务隔离,还可以作为冷备份。与外部备份相比,具有节省空间、恢复数据更方便快捷的优势。

@disking 实际上早在第二次 Hackathon 时就有这个想法,灵感来自 Oracle 的 Flashback 功能。当时他把这个想法放到了研发的讨论组里却没有得到回应,而且当时他也没有足够的精力组建自己的团队。虽然不是说我担心,但是这样一个有趣又好用的想法当然要找机会实现,这次Hackathon就是一个实现想法的好机会。

渡渡鸟复兴就此开始。

团队演示了20个渡渡鸟对话场景

关于游戏

如何制作时光机?

谁掌握了过去,谁就掌握了未来;谁控制了现在,谁就控制了过去。——乔治·奥威尔,《1984》

总的来说,一些看起来很花哨(乍一看)的操作都是围绕 TiDB 的 MVCC 机制进行的,比如查询表中记录的 MVCC 历史记录、篡改 MVCC 记录、执行瞬时版本回滚(闪回操作)基于 MVCC 记录。

整个项目的核心,或者说比较实用的一点,就是GC SavePoint和Flashback功能的结合。通过设置定时快照备份,利用 TiDB MVCC 的机制实现 TiDB 存储内部的“冷备份”,关键时刻还是有的。救命的效果,毕竟只用一条SQL就可以实现整个表数据的Flashback。

整个项目分为三个相对独立的模块:

1. SQL 中的 MVCC 查询 -> 操作过去

下面是一个demo,看看我们可以查询各种pose的MVCC记录!

你甚至可以篡改某个 MVCC 记录。

2. GC 保存点 -> 掌握当下

添加 gc_savepoint 系统表,可以通过 SQL CRUD 管理。

GC进行时,需要将gc_savepoint表中的数据与原来的gc_safepoint一起存储在PD中。

修改 GC 逻辑,在回收数据时考虑 gc_savepoint。因为有两种GC,传统GC和compaction GC,时间关系只能是一种。

在设置 gc_save_point_interval = ‘5m’ 之后,在 gc_safe_point 之前,将被回收的 MVCC 记录每 5 分钟保留一个版本。

3. 亚秒级闪回 -> 展望未来

添加闪回表ts SQL语句,指定表进行数据恢复。意思是将表恢复到不比ts时间戳指定的版本旧的版本。

将时间范围写入表模式并触发 DDL 操作。DDL同步完成后,操作返回成功。

图片[1]-天灾易躲,人祸难防|渡渡鸟复兴会战队-老王博客

TiDB 请求 TiKV 时,需要在请求中放入需要忽略的 ts 间隔,发送给 TiKV。

修改MVCC读取逻辑,按照指定的时间间隔跳过对应的版本。

当 ts 间隔超过 GC 范围时,需要进行清理。

结合上面的MVCC查询,我们可以看到表数据中的“change dodo”在某个时间节点之前还是一个“time dodo”。通过闪回操作,我们成功地将数据变回原来的样子,回调了“时间渡渡鸟”。

在实际的容灾场景中,如果我们不小心误修改了一张表的几条数据,甚至误删了整张表,我们可以通过闪回SQL一键恢复到任意MVCC记录版本。

未来展望

目前的实现只是基于TableScan for Demo,还没有进行IndexScan和点查询的一些适配工作;一些 TiDB 生态工具跨 SQL 层进行数据查询,这方面的兼容性也是接下来需要考虑的问题。.

另外,如果可以扩展Flashback操作和MVCC Query的组合,可以实现更多的功能,比如查看Flashback记录、取消Flashback操作、修改Flashback记录等等。

关于球员

你是怎么来到 TiDB 的世界的?

@JmPotato 刚刚完成学生生涯,现在是 PingCAP 研发工程师。@RinChanNOW,他的本科室友,也加入了这个项目。他们的另一位室友也是字节跳动分布式系统研发部的实习生。

– 宿舍里的基础软件工程师!

对于很多同学来说,成为应用开发者或者算法工程师或者进入AI行业是比较主流的选择。为什么这么“巧合”,他们同时加入这个行业呢?

@JmPotato 说他是“头”的始作俑者。2019年底,在听播客的时候,偶然听到东旭关于分布式数据库的分享,当时对PingCAP一无所知。后来,我进行了相关的学习。在学习 Raft 的过程中,接触到了 TiKV、TiDB 等项目。直到那时我才慢慢意识到它们都是PingCAP的产品。那时候PingCAP刚刚招实习生,我就被自己迷住了。做了很多相关准备后,开始面试,进入公司实习,现在正式加入。

@RinChanNOW 还表示@JmPotato 的实习为整个宿舍打开了一个全新的世界。我还记得当大家一起实现一个简单的 Raft 协议的时候。从那时起,我就能感受到分布式系统的奇妙之处,不是被动的内卷flash 打字母游戏的控制范围的代码,而是一种发自内心的热爱和向往。

我不知道 TiDB,我是如何快速加入 Hackathon 并开始工作的?

@RinChanNOW 虽然之前学过分布式系统,但在学习和工作中并没有 TiDB 的实际经验。作为外部开发者,如何参加这个关于 TiDB 的 Hackathon?这也是很多学生对Hackathon活动望而却步的一个重要原因。@RinChanNOW 完全不用担心。一方面,TiDB 文档丰富,系统学习不难;另一方面,TiDB 社区非常活跃,无论是 AskTUG、TiDB internals 还是 GitHub,都能遇到很多志同道合的小伙伴,他们都愿意帮助新的 TiDBer 快速融入社区。

@RinChanNOW 还和大家分享了一些具体的学习经历:

除了准备 TiDB 和 TiKV 的开发环境之外,需要做的准备工作之一就是了解 TiDB 和 TiKV 的代码结构和数据流向,也就是对它们的源码有一个大致的了解,即也是最耗时的过程,所以我的代码并没有那么大,但是写了很久。

根据我需要改动的部分,结合PingCAP官博,对源码进行了一波学习:

选择流程:

TiDB 源码阅读系列文章(三)SQL生活

TiDB 源码阅读系列文章(六)Select 语句概览

如何下推查询到 TiKV 并执行:

TiKV 源码分析系列文章(十四)协处理器概述

TiKV源码解析系列文章(十六)TiKV Coprocessor Executor源码解析

插入过程:

TiDB 源码阅读系列文章(四)Insert Statement Overview

TiDB 源码阅读系列文章(十个六)INSERT语句详解

SQL语句的具体执行流程:

TiDB 源码阅读系列文章(20三)Prepare/Execute 请求处理

TiKV MVCC 读写流程:

TiKV 源码分析系列文章(十篇三)MVCC 数据阅读

Play Real:TiDB Hackathon 有什么不同?

团队中的@disking 算是老牌Hackathon 玩家了。除了本次 TiDB Hackathon,@JmPotato 和@RinChanNOW 也或多或少地参加了其他类似的编程比赛。谈到不同比赛的体验差异,他们有一个统一的看法:很多编程比赛更多是针对学生的,留下一些目标明确甚至标准答案的作业,更像是一场考验编程能力的考试。竞争的可能是谁有更优雅的实现和更好的效果。. 参加 TiDB Hackathon 是一种完全不同的体验。TiDB Hackathon 更实用。没有明确的主题选择。这是一场不为人知的冒险。比代码实现更重要的是创造力和思维。只有真正在使用和参与产品迭代的开发者才能感受到。乐在其中。

不过受疫情影响,这两年的 TiDB Hackathon 虽然热闹,但气氛还是少了一点。如果有机会,还是期待明年的Hackathon能来到同一个空间与玩家交流,真正的48小时密集开发。

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论