主页 > 研究 > 实践探索 > 文章

如何打造健壮的分布式系统?

如何打造健壮的分布式系统?

同时负责 TiDB 底层组件 TiKV 的研发,该项目属于 CNCF 孵化中项目,应该也是国内唯一进入 CNCF 的数据库项目。同时,我也是典型的开源爱好者,做了很多 go-mysql, raft.rs ,grpc-rs 等开源组件的工作。

为什么需要混沌工程?

假设,我们现在开始建造一个系统,无论该系统的具体功能是什么,我们都需要保证系统的稳定性,但是如何知道系统是否处于稳定状态呢?通常,团队可以通过单元测试、集成测试和性能测试等手段进行验证。但是,无论这些测试写的多好,我们认为都远远不够,因为错误可以在任何时间发生,尤其是对分布式系统而言,此时就需要引入混沌工程(Chaos Engineering)。

 

以 TiDB 的实际生产流程为例,由于 TiDB 底层采用 Raft 一致性协议进行副本复制,因此存在 Follower 和 Leader 的概念,Follower 被动接受 Leader 的日志,同步相关数据。当新的 Follower 节点加入集群后,Leader 会给 Follower 发送 Snapshot,也就是说,Leader 会把当前整个数据进项打包成 Snapshot 发给 Follower。在 TiDB 里面,Snapshot 包括四部分,分别是 Meta 文件,default.sst,write.sst 和 lock.sst。Meta 文件记录数据文件源信息,包括数据文件的大小等,其余三个是数据文件。

当 Follower 接收到 Snapshot 文件后,会进行 Save Snapshot 的操作,将四个部分存到不同的文件里面。然后,Follower 会 Check Snapshot,也就是检查 Snapshot 的正确性,如果 Snapshot 是正确的,就会将其应用到整个 Follower 状态。如上图所示,在 Save Snapshot 和 Check Snapshot 之间发生了 Panic,并且进行了重启。要知道,对 Linux 系统而言,如果写文件时进程挂掉,但 Linux 系统没有挂掉,那么这个文件还可以认为是安全的,虽然会把文件写到 Page Cache 里面,但挂掉之后,Linux 系统会强制将 Page Cache 刷到磁盘里面,保证文件安全。

但是,当我们的 Follower 挂掉重启之后,我们发现文件出现丢失,如上图所示 write.sst 变成了 0 兆,但根据 Meta 文件,write.sst 不可能是 0 兆。也就是说,在磁盘没有任何问题的情况下,进程重启后出现了文件丢失。通过查看 dmseg,出现了SLUB:unable to allocate memoy on node的提示。这可以理解为,虽然系统没有出现问题,但可能由于内存不足等其他问题让文件 Page Cache 无法正常进行,此时就会出现上述问题。

对我们来说,虽然很多时候可以认为程序没有问题,但是与程序一起合作的操作系统可能会出现 Bug,导致整个数据丢失,这是对程序进行多少次单元测试都无法避免的事情。

 

上图是第二个示例,显示的是分布式系统里常见的 Gray Failure 问题。通常情况下,判断一个程序的死活,很直观的感觉就是写一个 Checker 程序,定期运行以试探程序状态。我们可能会出现一种情况,就是上文提到的 Gray Failure,具体指的是检查程序与整个系统相通,但客户端与系统很可能已经完全无法交互,我们自认为系统是好的,但实际上系统已经出现问题。

综上,分布式系统会出现很多仅仅通过测试无法解决的问题,因此我们想到了非常好的解决方法就是混沌工程。

混沌工程是什么?

混沌工程的概念很早之前就有,但是直到 2012 年,Netflix 公司才让外界更多人知道了“混沌”。为了更好地推广混沌工程,Netflix 引入了一只猴子(Chaos Monkey),试想一只猴子在系统里面,平时是安安静静的,什么事情都不做,突然一天发疯开始在系统里到处捣乱,作为工程师,要干的一件事情就是逮住这只猴子,让它别捣乱,这大概就是混沌工程要表达的意思。

相关阅读:

  1. 陆续打造了1个区级实践中心
  2. 坚持实施稳健的货币政策
  3. 如何进一步切实增强执行力
  4. 中国经济奇迹是如何创造的?
  5. 如何选择网上配资靠谱吗?
  6. 企业家培养计划打造产业生态林
  7. 申论热点:素质教育该如何落实
返回顶部