当 TiDB 赶上 Jepsen

本篇文章主要介绍 TiDB 是如何使用分布式一致性验证框架 Jepsen 进行一致性验证的。node

什么是 Jepsen

Jepsen 是由 Kyle Kingsbury 采用函数式编程语言 Clojure 编写的验证分布式系统一致性的测试框架,做者使用它对许多著名的分布式系统(etcd, cockroachdb...)进行了“攻击”(一致性验证),而且帮助其中的部分系统找到了 bug。这里一系列的博客展现了做者的验证过程以及对于一致性验证的许多思考。git

Jepsen 如何工做

Jepsen 验证系统由 6 个节点组成,一个控制节点(control node),五个被控制节点(默认为 n1, n2, n3, n4, n5),控制节点将全部指令发送到某些或所有被控制节点,这些指令包括底层的 shell 命令到上层的 SQL 语句等等。Jepsen 提供了几个核心 API 用于验证分布式系统:github

  • DB算法

    DB 封装了所验证的分布式系统下载、部署、启动和关闭命令,核心函数由 setup 和 teardown 组成,在 TiDB 的 Jepsen 测试中,setup 负责下载 TiDB 而且依次启动 Placement Driver、TiKV 和 TiDB;teardown 负责关闭整个 TiDB 系统而且删除日志。sql

  • Clientshell

    Client 封装了每个测试所须要提供的客户,每一个 client 提供两个接口:setup 和 invoke,setup 负责对 TiDB 进行链接,而 invoke 则包含了测试中 client 对 TiDB 调用的 sql 语句,具体语句依测试而定。编程

  • Checkerbash

    Checker 用于对测试生成的历史进行验证,判断测试结果是否符合预期,历史的格式以下图所示:网络

  • Nemesis并发

    Nemesis 用于对系统引入故障,好比常见的网络分区、网络延时、节点宕机,在 TiDB 的测试中,有如下几种 nemesis:

    parts:网络分区
      majority-ring:每一个节点都看到不一样的 majority
      start-stop:对某些节点进行 SIGSTOP
      start-kill:对某些节点进行 SIGKILL复制代码

    下图展现了 parts nemesis 引入测试中后某些语句执行时出现了 time-out 的错误。

  • Generator

    Generator 是 Jepsen 中的事件发生器,它将 Client 和 Nemesis 的操做交织在一块儿,为整个测试生成具体的执行语句。

TiDB 中的 Jepsen 测试

TiDB 中的 Jepsen 测试有 3 个,分别是 bank、set 和 register 测试。

Bank Test

银行测试用于验证快照隔离。这个测试模拟了一个银行系统中的各类转帐,每一个银行系统的初始能够是这样的:

[1 10]
[2 10]
[3 10]
[4 10]
[5 10]复制代码

1-5 分别表明帐户名称,而 10 表明帐户余额。测试会随机生成转帐信息:

[1 2 5]复制代码

表明将金额 5 从帐户 1 转入帐户 2 这个操做。与此同时,测试会随机读取全部帐户的存款信息,例如某一时刻帐户的存款信息多是这样的:

[8 14 2 11 15]复制代码

下面是测试进行中的某次截图:

在快照隔离下,全部的转帐都必须保证每一时刻全部帐户的总金额是相同的。TiDB 在即便引入了各类 nemesis 的状况下仍旧顺利地经过了测试。

Set Test

这个测试从不一样节点并发的将不一样的数插入一张表中,而且进行一次最终的表读取操做,用于验证全部返回成功的插入值必定会出如今表中,而后全部返回失败的插入值必定不在表中,同时,由于 nemesis 的引入,对于那些返回 time-out 的插入值,它们可能出现也可能不会出如今表中,这属于正常状况。

下面是测试进行中的某次截图:

一样,TiDB 经过了测试。

Register Test

这个测试很好理解,建一个表,而后插入一条值,而后咱们把这个值看作是一个寄存器,而后在测试中并发地从各个节点对其进行 read、write 和 cas 操做。

而后利用 Jepsen 产生的一系列操做历史(如上图)进行 Linearizability 一致性验证。这个算法是 Jepsen 的核心,也是 Jepsen 被业界所熟知的缘由之一,因此花时间去深刻学习了下,我会在另外一篇文章具体介绍这个算法。

写在最后

每次 TiDB 更新代码,咱们都会内部触发 CI 来执行 Jepsen,经过 Jepsen 来保证 TiDB 的数据一致性。若是你对分布式测试,一致性验证感兴趣,欢迎参与开发。

TiDB Jepsen:github.com/pingcap/jep…

徐鹏

相关文章
相关标签/搜索