【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

PingCAP 唐刘:如何利用混沌工程打造健壮的分布式系统?

  • 2019-07-18
  • 本文字数:3218 字

    阅读完需:约 11 分钟

PingCAP唐刘:如何利用混沌工程打造健壮的分布式系统?

在本选题的上一篇文章,介绍了阿里巴巴混沌工程实践及相关思考。作为一项处于普及阶段的技术,国内开发者对混沌工程的理解及实践尚处于初期阶段,本文主要介绍 PingCAP 首席架构师唐刘对这一概念的理解以及 PingCAP 如何利用混沌工程打造健壮的分布式系统。


作为混沌工程的重要推动者,Netflix 在混沌工程手册中谈到,在生产环境进行软件验证的想法通常会被嘲笑。过去,这句话基本都被翻译为“我们在发布之前不打算完善地验证这些代码”。在经典的测试链路中,寻找软件缺陷的普遍信条是离生产环境越远越好。例如,在单元测试中发现缺陷要比在集成测试中发现更好,这里的逻辑是:离生产环境越远,或者是离发布越远的时候,发现的缺陷就越容易被找到根本原因并彻底修复。


对于混沌工程而言,整个链路刚好反过来:在离生产环境越近的地方进行实验越好,理想的实践就是直接在生产环境中执行。对于软件工程师来说,最难的莫过于,系统用户永远不会如预期那样与系统进行交互,混沌工程是解决这一问题的理想方法,可以让开发者了解除代码之外,整个系统其他方面的情况,特别是状态、输入、以及第三方系统导致的难以预见的行为。


据了解,在 TiDB 的研发初期,PingCAP 就引入了混沌工程,以此保证 TiDB 在各种极端情况下的稳定性。在ArchSummit 全球架构师峰会(深圳站)2019 大会期间,InfoQ 就混沌工程理念及实践这一话题采访了 PingCAP 首席架构师唐刘,以此了解 PingCAP 的实践历程。

混沌工程与分布式系统

理解是实践的前提之一,唐刘在采访中坦言,混沌工程这个名字比较容易让人困惑,包括其英文“Chaos Engineering”,初次听到这个单词时确实不太好理解。唐刘表示:“最开始,我就是把它当成一种注入测试的方法,后来才发现这其实是一门工程学科,通过实验的方式发现问题并解决问题。


其实,混沌工程的理念很早之前就存在,唐刘表示,过去使用的错误注入就可以理解为混沌工程的一种表现方式,只不过 Netflix 将其提炼出来变成了通用准则,只要照着相关方法就能实施混沌工程,而这一技术诞生之际就与分布式系统密切相关,在《Chaos Engineering》一书中是这样表述的:


混沌工程是在分布式系统上进行实验的学科 , 目的是建立对系统抵御生产环境中失控条件的能力以及信心 。

注:分布式系统就是,其中有台你根本不知道的机器故障了,有可能会让你自己的服务也故障。——Leslie Lamport


即使可预见所有在控制范围内系统的状态,也总是会出现意外情况,比如系统依靠的某些外部服务突发宕机,这在系统搬迁上云后尤为明显,云服务也并不总是稳定可靠的。采访中,唐刘解释道,混沌工程主要是解决常规测试不能覆盖的问题。对于分布式系统来说,因为其异常的复杂性,加上错误可能在任何时候、任何地点发生,众多常规测试方法并不能保证系统正确。


当然,在某些场景下,直接在生产环境中进行实践是非常困难且不可用的,比如将干扰直接注入到行驶中的自动驾驶汽车的传感器上,这是比较危险的,但大部分用户应该都不是在操作这类生死攸关的系统。


相比较而言,唐刘认为混沌工程比较适合对数据安全性要求较高的场景。此外,如果业务对故障容错有所承诺,也需要通过混沌工程验证系统是否可以支持容错。量化到具体指标来看,如果开发人员确定系统会宕机并且清楚宕机之后会造成较大损失,可以通过“支持快速终止实验”和“最小化实验造成的‘爆炸半径’”等方式实施混沌工程。


当执行任何混沌工程实验前,应该先有一个用来立即终止实验的“红色按钮”,更好的方法则是自动化该功能,当其监测到对稳定状态有潜在危害时立即自动终止实验。第二个策略涉及在设计实验时,考虑从实验中获得有意义结论的同时,兼顾最小化实验可能造成的潜在危害。


无论是架构师、开发人员还是测试人员,唐刘都建议关注这一技术,这相当于从另一个视角审视系统,尤其是对开发者而言。唐刘补充道,开发一个优秀的系统并不只是写代码就足够了,测试不应该仅仅依靠测试人员,他一直相信:


优秀的开发者一定是优秀的测试人员。

PingCAP 混沌工程实践

如上文所言,在开始研发 TiDB 时,PingCAP 就决定引入混沌工程,应该算是国内吃螃蟹的团队之一。谈到当初的引入原因,唐刘表示,起初开发分布式数据库时,整个团队很自然就想到需要保证开发的数据库能够让用户放心使用,这就需要进行各种各样的测试。当时,Netflix 开发的 Chaos Monkey 已经非常知名,得益于 Netflix 成功的部署经验,PingCAP 团队想到利用该工具解决稳定性问题。


回顾整个实践历程,唐刘表示大概可以分为三个阶段,第一个阶段是 2017 年之前,那时并没有自动化的概念,所有实验全部需要手动完成,包括申请机器、手动部署等。虽然比较繁琐,但也在系统上线之前发现了不少问题。


第二个阶段是从 2017 年到 2019 年初,PingCAP 基于 K8s 搭建了一套自动化 chaos 框架,叫做 Schrodinger,这套系统极大提升了整体生产力,只需自定义要做的实验,Schrodinger 就能搞定。


第三个阶段则是 2019 年初至今,PingCAP 一直在做 Schrodinger Cloud,Schrodinger 主要是为测试 TiDB,也可用来测试 TiDB 的周边工具,甚至是合作伙伴的业务。面对这些需求,PingCAP 考虑基于 K8s 做一套更加通用的 Chaos 框架,采用 Operator 的方式,任何 Chaos 在 K8s 里面都是 CRD,用户只需要定义好自己的 CRD,Schrodinger 就可以自动完成后续事宜。


在开发混沌工程实验时,唐刘建议可遵循以下原则,将有助于实验设计:


  • 建立稳定状态的假设;

  • 多样化现实世界事件;

  • 在生产环境运行实验;

  • 持续自动化运行实验;

  • 最小化“爆炸半径”。



具体来说,系统稳态可以通过一些指标,比如延迟和 QPS 数据等来定义,当系统指标在测试完成后,无法快速恢复稳态要求,可以认为这个系统是不稳定的;其次,引进多样化的现实变量,比如网卡、磁盘故障等;然后,最为重要的是在生产环境中进行验证,这样做是存在风险的,因此最好提前与协作部门同步;最后,自动化可以让整个过程的效率更高,最小化“爆炸半径”可以避免不必要的损失。



举例来说,对于一个三副本的系统而言,可以通过随机杀死 Leader 节点的方式来验证系统是否可以保持稳态。可预想的情况是系统在主节点被杀死后会出现一段抖动,随后恢复正常则证明系统是具备容错能力的,反之,则证明系统存在问题。


在这之中,主要有两个大方向:一是发现错误;二是注入错误。TiDB 主要通过 Metrics(Prometheus 项目)、Log 和 Tracing 三种方式分析系统状态。其中,TiDB 默认不开启 Tracing 方式,因为这会对性能产生一定影响,仅在必要时启动该方法。至于注入错误,应用、存储、网络、CPU 等存在多种故障方式,唐刘在分享中提到了如下部分,供开发者参考:



根据过往实践经验,唐刘建议希望使用混沌工程的开发者可以参考混沌工程主页列出的步骤和原则。但是,要想真正实践,还需要做很多工作,包括更好地对系统进行错误注入,更好地发现系统问题,这些其实业界没有通用的解决方案,因此实践起来还是比较麻烦的。采访中,唐刘推荐可以阅读 Netflix 的《Chaos Engineering》一书(中文翻译版),Github 上有一个 awesome-chaos-engineering 的 Repo也可以参考。此外,如果整个开发团队本来对测试就不太重视,认为这完全是测试团队的事情,那可能也很难推动混沌工程落地。

结束语

三年前,我很少听到有人谈论混沌工程,现在已经蛮多了。


采访最后,唐刘表示如今的混沌工程在国内已经比较出名,这个概念应该已经进入普及阶段。但据唐刘的了解,国内真正对其应用很好的,并没有特别多公司,大部分仍然处于理清概念,但不知道如何实施的阶段。在这种背景下,企业可能最需要关注的是如何建立起自己的一整套自动化测试平台,实现对系统的自动错误注入,并自动发现系统问题。在此基础上,企业可以根据业务情况考虑深入实践混沌工程。


嘉宾介绍:


唐刘,PingCAP 首席架构师,主要是负责分布式 key-value TiKV 的研发工作,也会折腾下 TiDB 整个产品的测试,工具开发等工作。


相关文章:


《混沌工程的力量:阿里周洋亲述这一技术背后那些事儿》


公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2019-07-18 08:5511794
用户头像
赵钰莹 InfoQ 主编

发布了 874 篇内容, 共 604.5 次阅读, 收获喜欢 2671 次。

关注

评论 1 条评论

发布
用户头像
在唐刘看来,实践混沌工程主要有两个大方向:发现错误和注入错误。对于系统稳态的指标涉及网络、存储等诸多方面,唐刘提供部分样例供开发者参考。
2019-07-18 09:10
回复
没有更多了
发现更多内容

如何应对员工犯错?

石云升

项目管理 管理 引航计划 内容合集 10月月更

springboot vue失物招领网站源码

清风

源码 Vue springboot java 计算机毕业设计

SpringMVC源码分析-HandlerAdapter(4)-ModelAndViewContain组件分析

Brave

源码 springmvc 10月月更

微博系统中”微博评论“的高性能高可用计算架构

michael

#架构实战营

独一无二的「MySQL调优金字塔」相信也许你拥有了它,你就很可能拥有了全世界。

洛神灬殇

性能优化 后端 MySQL 数据库 引航计划 10月月更

【LeetCode】 旅行终点站Java题解

Albert

算法 LeetCode 10月月更

容器 & 服务:Helm Charts(一)

程序员架构进阶

架构 Kubernetes 容器 Helm Charts 10月月更

细说包管理器yarn和npm

devpoint

npm YARN Node 10月月更

1. 滚雪球学Python第四季开启,一需三吃,Python 函数式编程初识,面向过程,面向对象,函数式

梦想橡皮擦

10月月更

翻译积累 - Java正则表达式Pattern类

小马哥

翻译 日更

【Flutter 专题】138 图解自定义国旗渐变头像

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 10月月更

以匠心正道,以决心致远:毫末智行的自动驾驶之路

脑极体

数据结构与算法 - 复杂度

小马哥

数据结构与算法 日更

2. Python函数式编程中的字符串,元组,函数的分类,高阶函数,一篇文章都介绍一遍

梦想橡皮擦

10月月更

Docker OOM Killer

BeyondLife

Docker JVM trouble shooting

【实战】基于TensorRT 加速YOLO系列以及其他加速算法实战与对比

cv君

AI 引航计划

javaweb springboot汽车租赁系统源码

清风

源码 springboot 计算机毕业设计

Object.defineProperty的缺点及Vue3为什么用Proxy

wudaxue

手把手教学基于深度学习的遥感影像倾斜框算法训练与分析

cv君

AI 引航计划

谈 C++17 里的 State 模式之二

hedzr

c++ 算法 设计模式 Design Patterns 有限状态机

[27]智慧金融--AI目前最被看好的落地领域

数据与智能

人工智能

软件架构之原则、风格和实践

俞凡

架构

linux手误rm可能不需要跑路

入门小站

Linux

在线心语日历批量生成工具

入门小站

工具

自动驾驶混战,剑气二宗谁能笑傲江湖?

白洞计划

《写给互联网工程师的5G书》全文pdf开放下载

俞凡

架构 5G 网络 通信 10月月更

第 9 章 -《Linux 一学就会》-文件的归档和压缩 tar---zip

学神来啦

Linux 运维 linux学习

聊一聊差分放大器

不脱发的程序猿

嵌入式 电路设计 硬件开发 运算放大器

在线GIF图片帧修改工具

入门小站

工具

003云原生之架构原则

穿过生命散发芬芳

云原生 10月月更

linux线上CPU100%排查

入门小站

Linux

PingCAP唐刘:如何利用混沌工程打造健壮的分布式系统?_ArchSummit_赵钰莹_InfoQ精选文章