50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

微服务中台技术解析之混沌工程实践

  • 2020-11-17
  • 本文字数:4168 字

    阅读完需:约 14 分钟

微服务中台技术解析之混沌工程实践

引言

近来 FreeWheel 微服务业务团队的业务逐渐扩大,单体服务已经无法胜任,于是我们如火如荼地开展了向微服务迁移的工作,一时间,服务如雨后春笋般冒了出来。在享受微服务带来便利的同时,我们也面临着众多服务带来的整体稳定性的考验。尽管我们有着完善的监控和报警系统,一旦故障发生,总是能第一时间通知到工程师来排查问题,但是这些都是事后的响应和应对。如何能提前了解系统可能会出啥问题,啥时候会出问题,出了问题怎么应对变得至关重要。混沌工程是帮助解决这一问题的不二选择,本文主要聊一下 FreeWheel 微服务业务团队在混沌工程道路上的实践。

混沌工程是什么

混沌工程是对分布式系统进行实验的学科,以便建立对系统抵御生产中动荡条件的能力的信心。

 

Chaos Engineering is the discipline of experimenting on a distributed system in order to build confidence in the system’scapability to withstand turbulent conditions in production.

 

通俗地说,混沌工程就是要在你的系统上进行混沌实验,根据实验结果分析来发现你的系统有哪些缺陷,然后对系统加以改进,如果有不可解决的问题,那么可以提前知道一旦发生怎么处理是损失最小的。通过不断的迭代实验来提高系统的弹性,不仅可以很好的给客户提供服务,还能够让各位工程师高枕无忧,减少半夜被叫起来处理故障的次数,最终帮助建立起稳定可靠的系统。

 

混沌工程是由混沌工程师来执行的,他们通过一系列的混沌实验,来学习观察系统的表现,并能通过此种表现去指导工程师来提高系统的健壮性。这有点像科学家通过做实验去学习定律,混沌工程师就是通过实验来发现系统的知识的。它跟传统的测试有很大的区别,传统测试会提前定义好输入和输出,如果不满足这个结论,测试就出错了,具有非常明确的目的;混沌实验不是如此,实验会产生什么样的信息是不确定的。比如整个网络延迟、CPU 过载、内存过载、IO 出错等等实验,会产生什么样的结果呢?有些我们可以预料,有些则不然,只有发生了,才会看到。

混沌工程发展史

纵观国内外互联网公司,都能看到混沌工程的影子,混沌工程也经历了 10 多年时间的演进。业内比较有代表性的就是 Netflix、阿里、PingCAP 和 Gremlin(Netflix 和 AWS 的混沌工程师创立的)。纵观这 10 多年以来混沌工程的发展,Netflix 占据了极其重要的地位。

 

国外大厂混沌工程的发展历程,主要是以 Netflix 为代表:


图来自 https://aws.amazon.com/cn/blogs/china/aws-chaos-engineering-start/

 

  • 2010-2010 年,Netflix 开发出第一个版本,并且向社区开源;

  • 2014 年,Chaos Engineer (混沌工程师)变成一个专职工作;

  • 2015 年,Netflix 正式提出了混沌工程的原则;

  • 2016 年,混沌工程开始有商业化产品;

 

国内市场上混沌工程的发展还处于起步阶段,具有代表性的就是阿里和 PingCAP 这两家公司。相信随着云原生的发展,不断推进微服务的解耦,国内公司也会越来越重视起混沌工程。

混沌工程的原则和成熟度模型

尽管各家公司开发的混沌工程方案不同,但是都遵循了一套被大家认可的原则来指导混沌工程的发生。


如何评判我们的实验做是好是坏,以及如何做得更好呢?混沌工程的成熟度给我们提供了一个可以参考的标准。成熟度有四个等级:初级,简单,复杂,高级。


在混沌工程工具的开发和混沌实验的进行中,要全面考虑这些原则和成熟度模型,做有用的实验,帮助工程师发现系统新的知识。

FreeWheel 微服务业务团队在混沌工程领域的实践

FreeWheel 微服务业务团队在迁移微服务的过程中,微服务个数达到 30+。在这么庞大的一个服务体系,难以预料哪个服务会出问题,关注点也不再是哪个服务会出问题,而是转移到服务会在什么时候出问题、出了问题会对系统产生什么样的影响。

 

在寻找如何预测系统发生的问题及其影响时,我们发现混沌工程可以解决这个痛点。因此我们组建了 Chaos 小组,2020 年 4 月份立项并开始实现 Freewheel 微服务业务团队自己的 Chaos 系统,到目前为止,我们开发了 1.0 版本和正在进行的 2.0 版本。

初试牛刀

我们开发了什么

Chaos 1.0 是一个可插拔的系统,可以很方便的集成一些 Monkey 到 Chaos 系统,由三部分组成:Chaos Admin,Chaos Server,Chaos Monkey。Chaos Admin 主要负责跟用户的交互,混沌工程师可以通过其进行实验的开始和结束,Chaos Server 主要负责跟 K8S cluster 交互,负责搬运 Monkey 和执行 Monkey,Chaos Monkey 则是由一批可独立运行的工具组成。架构图如下:


根据混沌工程的原则以及我们的业务特点,我们制定了 FreeWheel 微服务业务团队使用 Chaos1.0 进行混沌实验的步骤:

  1. 定义系统稳态,参考 PQM(Freewheel 公司的 Monitor 系统) 和 ELK 收集的数据我们对各个微服务定义了一套系统指标稳态;

  2. 构建进行混沌实验的环境-接近真实环境,在混沌实验没有很成熟之前,不建议直接到生产环境实验,尽管这跟混沌工程原则相违背,但在混沌工程成熟度和接受度不高的时候选择一种类似生产环境的环境来进行实验是比较好的选择;

  3. 构建 Chaos1.0,通过混沌工程的 jenkins pipeline 可以很容易构建出 Chaos1.0;

  4. 进行混沌实验,由 Chaos 小组工程师来主导,需要准备好业务数据和业务请求来帮助实验的真实性;

  5. 通过 PQM,ELK 分析实验结果,来指导系统改进及下一次实验。

 

Chaos1.0 的 Admin 部分交互非常简单,使用者可以选择要进行实验的微服务资源,然后进行实验。下面列举了一些我们利用现有的 Monkey 进行的实验。

我们做的实验

 

某一个服务在正常使用中,系统资源将近耗尽,会发生什么?


Target service 想知道当 CPU/Mem 占满时,是否还可以正常 serve 客户,于是我们对 target service 进行了 burncpu 的实验。我们发现,当 CPU 使用量上升时,target service 会自动扩容 POD,最高会扩容到 10 个来保证服务的正常运行。当 CPU 下降,Pod 会自动缩容到需要的个数。


kubectl get pods -n fw25048a |grep target-spa-http

target-spa-http-7d8cc7b7cd-kgbfs                      2/2     Running             3          6h

target-spa-http-7d8cc7b7cd-klkll                      2/2     Running             3          6h

target-spa-http-7d8cc7b7cd-mtvlb                      0/2     Running             0          8s

target-spa-http-7d8cc7b7cd-psdmz                      2/2     Running             3          6h1m

target-spa-http-7d8cc7b7cd-qwfsz                      2/2     Running             2          6h

target-spa-http-7d8cc7b7cd-r6ws6                      0/2     Running             0          8s

 

当系统资源全部占满,服务是否能正常工作?

 

Forecast service 想知道 CPU 占满的情况下,客户的请求是否还能在客户接受的范围,是否需要限流?

 

TPS=20 时,我们可以观察到,请求几乎可以在 3s 内返回:


TPS=60 时,根据线上流量我们选取了这个值,我们可以观察到 90%的请求依然可以在 3s 内返回,接近 10%的请求会超过 3s。




综上,我们发现 CPU load 很高时,如果要保证客户的体验,就需要对系统限流,限多少可以通过我们的实验得到一个基本值。

 

某一个服务在正常使用中,突然死掉,会发生什么?

 

TPS=10 PodNum=3



TPS=20 PodNum=3



TPS=30 PodNum=3



TPS=60 PodNum=3



TPS=300 PodNum=3,我们可以观察到,系统的处理能力,在瞬间的处理能力接近 10 左右,所以即便是流量很高,fail 的 request 并不会很多。


系统架构演进

我们开发了什么

Chaos 1.0 中,我们的设计原则是可以很容易的接入各种 Monkey ,并且完全不需要部署到生产环境。在实验中我们发现这种方式会带来一些问题,各个 monkey 需要执行的环境和参数各不相同,导致实验的灵活度不够高,并且我们也体会到了不入虎穴、焉得虎子,不深入生产环境,有一些实验反而没那么容易做。所以在 2.0 中,我们学习了 PingCAP 公司的开源项目Chaos-Mesh,它的设计特别符合我们需求,基于此我们设计出了我们自己的方案。

 

Chaos 2.0 中我们使用 CRD 来定义各个 Monkey,CRD 是 K8s 中比较成熟的解决方案,还有一些配套的工具可以很方便的帮助我们集成到 K8s 中,2.0 选择了kubebuilder来生成跟 K8s 融合的框架。

 

2.0 中我们设计了 PodChaos CRD、StressChaos CRD、NetworkChaos CRD,这三个是我们需求比较多的,尤其是 Network 方面的实验。2.0 目前的设计包含了 3 个部分:Chaos Admin、Controller Manager 和 Deamon。 Chaos Admin 跟 1.0 如出一辙,负责跟用户交互,帮助用户可以很方便的来执行混沌实验;Controller Manager 会根据 Chaos Admin 的指令来对 POD 进行直接操作或者来操纵 Deamon,主要负责跟 K8s 交互;Deamon 的功能主要是操纵 Container 以及 Container 里面的进程。

我们做的实验

Chaos2.0 目前处于开发中,我们做了一个 podkill 的实验。

 

Advertising service 想知道如果随机的 kill pod,对客户的影响是怎样的?

 

PodNum=3,TPS=30,每 2 分钟随机 kill 掉一个 pod,pod 个数和 TPS 跟生产环境保持一致。



我们可以观察到,每当一个 pod 被杀掉的时候,大概会有 5-6 个 request 会失败。

 

目前 Chaos2.0 还在继续研发,后续还会进行各种实验来挖掘我们系统的知识。

未来之路

Chaos 系统终归是为产品质量服务的,所以无论我们处于哪个阶段,使用什么样的技术手段,我们的初心始终不变——建成一套自动化的混沌工程平台,通过混沌实验来提高系统的稳定性,可用性等,进而达到提高产品质量的目的,使得工程师和客户都可以受益。

 

未来我们会朝着这几个方面努力:

 

1. 完善目前的工具和平台,通过我们的 Chaos 系统能够完成更多的实验,达到最终可以自动化分析实验结果;

2. 集成我们的系统到 CI 中,使得混沌实验不再是按需执行,而是周期性的常态化执行;

3. 持续关注业界最新的 chaos 发展,不断演进我们的平台。

作者介绍

郭彦梅,Lead Software Engineer,FreeWheel

南开大学计算机硕士,曾在国内一线互联网公司担任核心系统的开发工作,目前就职于 FreeWheel 核心业务开发团队,有丰富的开发和技术管理经验,目前研究方向是混沌工程,热衷于新技术的探索和分享。


延伸阅读:

《gRPC长连接在微服务业务系统中的实践》

《一个微服务业务系统的中台构建之路》


2020-11-17 10:002922

评论

发布
暂无评论
发现更多内容

在武汉学习web前端开发课程哪家比较好

小谷哥

移动互联网未来发展的五大趋势

BeeWorks

实践丨手把手教你用STM32设计WiFi语音播报日程表

华为云开发者联盟

开发

自定义spring boot starter三部曲之二:实战开发

程序员欣宸

Java springboot 7月月更

SAP Fiori 应用 Adapt UI 动态显示或者隐藏的技术设计细节解析

汪子熙

JavaScript 前端开发 web开发 SAP 7月月更

学习WEB前端去哪里培训比较好

小谷哥

自动化测试如何实施落地?

老张

软件测试 自动化测试 项目落地

ST 端侧人工智能之视觉检测课程

贾献华

7月月更

Free自由协议系统Dapp开发(锁仓复利)

薇電13242772558

智能合约 dapp

SaaS应用:实现企业数字化转型的最佳途径

Baklib

SpringBoot的SpringBootApplication注解

技术小生

springboot 7月月更

Optional的使用详解

echoes

在线SQL转JSON工具

入门小站

工具

【开课预告】7~9月学习课程《基于MASA Framework的EShop实战》

MASA技术团队

2022年智能运维企业50强,博睿数据实力入选

博睿数据

数字化 智能运维 博睿数据 性能监测

C 语言入门(五)

逝缘~

7月月更

# 重要-即时通讯IM开源项目OpenIM关于版本管理及v2.3.0发布计划

Geek_1ef48b

web前端开发技术前景怎么样好不好

小谷哥

leetcode 435. Non-overlapping Intervals 无重叠区间(中等)

okokabcd

LeetCode 数据结构与算法 贪心算法

开发实践丨昇腾CANN的推理应用开发体验

华为云开发者联盟

Python 人工智能

linux远程复制文件命令小总结

入门小站

在线多行文本批量正则替换添加后缀工具

入门小站

工具

灵雀云加入LF机密计算联盟,推进机密计算在云原生场景的应用

York

灵雀云 云原生 机密计算

企事业单位建设知识管理的七条建议

Baklib

知识管理 企事业单位

在上海想学web前端课程如何选择

小谷哥

大模型训练难于上青天?效率超群、易用的“李白”模型库来了

OneFlow

机器学习 gpu 模型训练

如何深入学习Html5前端技术知识

小谷哥

WorkPlus SE | 全国第1个永久免费的即时通讯软件!

BeeWorks

混合办公-疫情之下,远程办公靠谱吗?

BeeWorks

究竟谁更需要已读功能?用户还是即时通讯本身?

BeeWorks

微服务中台技术解析之混沌工程实践_语言 & 开发_郭彦梅_InfoQ精选文章