摘要:银行测试用于验证快照隔离。测试会随机生成转账信息代表将金额从账户转入账户这个操作。在即使引入了各种的情况下仍旧顺利地通过了测试。然后利用产生的一系列操作历史如上图进行一致性验证。
本篇文章主要介绍 TiDB 是如何使用分布式一致性验证框架 Jepsen 进行一致性验证的。
什么是 JepsenJepsen 是由 Kyle Kingsbury 采用函数式编程语言 Clojure 编写的验证分布式系统一致性的测试框架,作者使用它对许多著名的分布式系统(etcd, cockroachdb...)进行了“攻击”(一致性验证),并且帮助其中的部分系统找到了 bug。这里一系列的博客展示了作者的验证过程以及对于一致性验证的许多思考。
Jepsen 如何工作Jepsen 验证系统由 6 个节点组成,一个控制节点(control node),五个被控制节点(默认为 n1, n2, n3, n4, n5),控制节点将所有指令发送到某些或全部被控制节点,这些指令包括底层的 shell 命令到上层的 SQL 语句等等。Jepsen 提供了几个核心 API 用于验证分布式系统:
DB
DB 封装了所验证的分布式系统下载、部署、启动和关闭命令,核心函数由 setup 和 teardown 组成,在 TiDB 的 Jepsen 测试中,setup 负责下载 TiDB 并且依次启动 Placement Driver、TiKV 和 TiDB;teardown 负责关闭整个 TiDB 系统并且删除日志。
Client
Client 封装了每一个测试所需要提供的客户,每个 client 提供两个接口:setup 和 invoke,setup 负责对 TiDB 进行连接,而 invoke 则包含了测试中 client 对 TiDB 调用的 sql 语句,具体语句依测试而定。
Checker
Checker 用于对测试生成的历史进行验证,判断测试结果是否符合预期,历史的格式如下图所示: ![](http://static.zybuluo.com/zyytop/hmc5dbcl7p5jv0qaaaozm7g3/bank.png)
Nemesis
Nemesis 用于对系统引入故障,比如常见的网络分区、网络延时、节点宕机,在 TiDB 的测试中,有以下几种 nemesis:
parts:网络分区 majority-ring:每个节点都看到不同的 majority start-stop:对某些节点进行 SIGSTOP start-kill:对某些节点进行 SIGKILL
下图展示了 parts nemesis 引入测试中后某些语句执行时出现了 time-out 的错误。 ![](http://static.zybuluo.com/zyytop/pt7oc0dau02iayxlt6tz52mn/parts.png)
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:https://github.com/pingcap/jepsen/tree/master/tidb
徐鹏
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/47174.html
摘要:它是第一个把数据分布在全球范围内的系统,并且支持外部一致性的分布式事务。目的是使得开发者阅读之后,能对项目有一个初步了解,更好的参与进入的开发中。深度探索数据库并发控制技术并发控制技术是数据库事务处理的核心技术。 存储过程高级篇 讲解了一些存储过程的高级特性,包括 cursor、schema、控制语句、事务等。 数据库索引与事务管理 本篇文章为对数据库知识的查缺补漏,从索引,事务管理,...
摘要:本话题系列文章整理自第期刘奇分享的深度探索分布式系统测试议题现场实录。如果没有做错误路径的测试,那很简单的一个问题,现在假设走到其中一条错误路径了,整个系统行为是什么这一点不知道是很吓人的。这不仅仅是硬件的监控,也可以认为是做错误的注入。 本话题系列文章整理自 PingCAP NewSQL Meetup 第 26 期刘奇分享的《深度探索分布式系统测试》议题现场实录。文章较长,为方便大家...
摘要:本话题系列文章整理自第期刘奇分享的深度探索分布式系统测试议题现场实录。如果没有做错误路径的测试,那很简单的一个问题,现在假设走到其中一条错误路径了,整个系统行为是什么这一点不知道是很吓人的。这不仅仅是硬件的监控,也可以认为是做错误的注入。 本话题系列文章整理自 PingCAP NewSQL Meetup 第 26 期刘奇分享的《深度探索分布式系统测试》议题现场实录。文章较长,为方便大家...
摘要:月日,正式发布版。性能方面重点优化了写入速度,计算任务调度支持优先级,避免分析型大事务影响在线事务。功能方面进一步兼容性。于年月在创建,同年月发布版本,而后于年月发布版,月发布版。 8 月 4 日,TiDB 正式发布 RC4 版。该版本对 MySQL 兼容性、SQL 优化器、系统稳定性、性能做了大量的工作。性能方面重点优化了写入速度,计算任务调度支持优先级,避免分析型大事务影响在线事...
阅读 1312·2021-11-19 09:55
阅读 2580·2021-09-06 15:02
阅读 1227·2021-09-04 16:46
阅读 3252·2019-08-30 15:53
阅读 802·2019-08-29 16:36
阅读 1082·2019-08-29 16:29
阅读 2113·2019-08-29 15:21
阅读 491·2019-08-29 13:45