低代码到底是不是行业毒瘤?一线大厂怎么做的?戳此了解>>> 了解详情
写点什么

阿里云马劲:保证云产品持续拥有稳定性的实践和思考

2018 年 12 月 29 日

阿里云马劲:保证云产品持续拥有稳定性的实践和思考

对所有的技术人员来说,业务可靠性提升是一个系统工程,涉及网络管理、IDC 管理、服务器管理、交付管理、变更管理、故障管理、监控管理、预案管理、根因分析、容量规划、容灾演练、标准化建设、集成测试、泛操作管理、权限管理、数据安全管理等方方面面,随着先进技术的应用、业务云化、微服务化等,业务架构变得更加复杂,任何一个环节出现问题,哪怕是一个小问题都可能演变成大故障,我们更加迫切需要一种新的方式提升业务可靠性。


业界做法和阿里云的探索

诸如 Netflix 探索通过异常注入的方式提升其视频服务的可靠性[1],已经演进成独立的“混沌自动化平台”(ChAP,Chaos Automation Platform);Microsoft Azure 在 Netflix 之后也研发了自己的异常注入平台;Google 通过研发自动化平台来替代传统模型中的人工操作,在业务可靠性提升的重要方向都有对应的平台实现,参考《Site. Reliability. Engineering》;在阿里云已经有了 Monkey King 平台,实现系统级别诸如宕机、磁盘掉盘、网卡丢包等异常注入。Netflix ChAP 关注的是业务自身可靠性提升,不太适合专有云以及公共云这种模式;Google 很多平台基于其强大的研发能力,在产品内部实现大量可靠性设计与代码嵌入,我们现在还比较难直接照搬;Monkey King 已经能很好的实现异常注入的功能,但该注入哪些异常,该如何评估云产品的可靠性还在探索中。结合综上实践和思考,我们在业界经验的基础上,结合云特点正在探索通过混沌工程理念[2]提升系统可靠性。


混沌工程理念:指在系统可靠性设计范围内实践一些可在系统(对专有云是在仿真系统)内引发失效的实验,在进行每个实验之前工程师会提出一个导致系统失效的假设场景,进而设计一个实验去引发或模拟该场景,并以受控、自动化的方式开展实验。通过观测系统的反馈,对不符合预期的结果进行深入分析并持续改进。在我们的实践中重点关注系统可靠性提升的三个问题:


  1. 该如何降低故障频度、重复故障比例、提升监控有效性与故障处理效率;

  2. 该如何量化评估云产品的可靠性,是否存在隐患,优化建议是什么;

  3. 该如何帮助云用户提升其业务可靠性。


通过混沌工程提升可靠性包括如下图示几大部分:



1. SSRD 设计

和对应产品的负责人一起确定用哪些指标来描述服务的稳定状态,常见的指标可以参考服务的 SLA、SLO 设计。这些指标主要用来描述系统的可靠性设计以及衡量的指标。在这个过程中,我们会和云产品的负责人一起通过历史故障分析讨论我们的云产品可靠性该如何设计,是否需要增加进而逐渐完善云产品的可靠性体系。


2. FMEA 分析

针对云产品的特性、所运行的环境、强弱依赖分析、故障频次、发生后影响、历史故障等因素建立故障关联模型,诸如系统是否可冗余单点异常、发生频率是什么、如果发生对用户影响有多大等等。


3. ACP(Apsara Chaos Platform)

实现基础异常注入、复杂任务编排以及异常任务自动调度功能。


本文将重点介绍 FMEA 分析以及 ACP 平台。


FMEA 分析和 ACP 平台介绍

为了发现业务存在的隐患,我们首先需要想清楚需要构建哪些异常,为此我们从公共云以及专有云上经历过的故障入手,通过对这些故障的分析、聚类,我们抽取了第一版云平台下的 105 种故障模式,通过这些基础故障及其组合我们可以构建超万种异常场景。



另外 20%左右故障基于现有技术无法有效的模拟,比如第三方依赖引入的问题、程序 BUG 以及特殊机型硬件等异常。


回顾这些故障模式,十分感慨,每一次故障都是血的教训,我们努力的避免并预防故障的发生。而如今恰恰也是这些宝贵的经验与知识再一次指引我们未来的方向。在一期我们还是大量依靠人工来分析和提炼这些异常模式,难免有遗漏和不准确,目前在进行中的二期我们正探索通过 AI 方式抽取更复杂的故障模式进而覆盖更广的异常场景,未来有了新成果也会和各位读者共同探讨。


在 ACP 设计中,Scene 用来描述异常场景,每个异常 Pattern 可以创建一个单一的异常场景。也可以由一个或几个基础异常组合而成,组合的方式见下文异常立方体模型。任务调度引擎实现对 Scene 的调度,每次异常注入对应一个 JOB(任务),当前系统为了保证 Scene 不会被反复调度,全局控制保证一个 Scene 只能被调度一次。每个 JOB 提供若干操作原语(CREATE、DELETE、START、STOP、SUSPEND)提供人工干预接口。同步后台会有 Service Check 模块,主动关注 SSRD 中涉及的核心指标,如果发现异常会自动触发 JOB 暂停。我们尝试进行一场场景的仿真,比如 Gray failures 异常,它是诸如服务器假死、网络抖动、IO hang、某个硬件设备单核 CPU 被打满、流量陡增等异常。这些看似小问题系统稍微处理不当便可能演变成大故障。


如下图我们预期随着业务量增涨资源消耗是线性增涨,但实际上可能是业务量增涨到某个节点,资源还没有达到瓶颈的时候,性能却急剧下降而出现严重的雪崩点。如果我们不能及时发现这些隐患点,那么在生产系统高峰期发生的时候会是非常可怕的。



因此在 ACP 平台上,我们在集成集团 Monkey King 平台第一、二大类异常仿真的基础上开发了 Gray failures 异常仿真引擎,支持诸如通过线性方式模拟 CPU 消耗自然增长、通过正弦方式模拟网络抖动式丢包、通过高斯方式模拟流量陡增等异常仿真,如下图所示:



为了能支持更复杂的组合类异常场景,我们调研了 Airflow[3]以及 Jenkins[4]等工作流引擎,都能满足需求,但 Jenkins 偏重,每次流创建和生成都需要分钟以上,难以满足时效性要求。Airflow 依赖第三方库非常多,会偶尔出现流夯住的问题,虽然是开源的,但代码量巨大,出现问题定位和修复成本非常高。为此我们实现了类似 Airflow 一样的轻量级流编排引擎,可以满足简单任务的编排需求。但从长期来看,我们更倾向于切换到 Airflow 进而支持更高并发量、更复杂的流描述能力。


除此之外,为了能支撑超万种异常场景自动调度,我们自研了分布式任务调度框架,消除单点隐患以及解决未来高吞吐场景的需求。当前在任务调度引擎中已经引入优先级的概念,支持三种任务级别,同级别中的任务无优先级,采用 FIFO 的方式调度,支持并发度控制。



ACP 交互界面展示分享

为了更好管理异常组合,我们引入了数据立方体概念,每个小方块代表一类基础异常,对于数据立方体,我们可以通过切片、切块、上卷(roll-up)、下钻(drill-down)等方式生成更复杂的组合类异常。异常立方体中我们会对异常进行分级:


  • Low 级别:系统对于这些异常可以优雅自动恢复无需人工干预;

  • Medium 级别:系统可以从这些异常中优雅恢复,但可能会导致一些业务降级或者服务可靠性的影响;

  • High 级别:这个级别的异常注入对服务可靠性存在较大的影响,需要较多的人工干预才能恢复。


样例:对任意一个异常事件 Ae =F(X=1,Y=1,Z=1) 表示 RDS 的 Low 程度的 Hardware Failure(Low 级别诸如宕机故障)



ACP 任务创建 PORTAL



通过如下多种随机模式可以覆盖尽可能多的异常模拟


  1. Mode:Single:指定异常注入对象;Random One:随机选择一个操作对象;Sequence:顺序选择所有操作对象。

  2. Device:Single:指定操作设备;Random One:随机选择一个操作设备;

  3. Pattern:Linear:线性模拟;Sine:正弦模拟;Gaussian:高斯模拟。


ACP 异常模式四象限

用来描述这些异常 PATTERN 对用户的潜在影响,目标不断通过技术、管理、流程等手段将第一象限中高风险、高影响的隐患优化到第三象限(更低的风险以及更小的影响)



云产品可靠性设计与隐患消除

专有云有它的特殊性,故障在专有云的环境下往往影响更大,一个单一的故障在几百朵云内可能就是几百次故障…更需要我们在产品设计过程中消除隐患,而这个过程可行方式之一就是启动 SSRD 设计,在产品构建之初启动可靠性设计并通过 FMEA 分析以及 ACP 不断挖掘潜在隐患并打磨故障处理的整个闭环,如下图:



在整个实验过程中,我们不断观测并采集系统的核心指标:


1、监控是否能及时发现,是否有报警


2、出现的故障,全链路监控是否能及时发现


3、对应的预案是否生效


4、系统的自愈能力是否符合设计预期


5、如果系统没有达到预期,该如何优化


对任何环节存在缺失或者不完善的隐患,持续推动优化。


云产品的可靠性量化评估一直比较棘手,传统方式更多依靠经验来评估。有了 ACP 以及不断积累的异常场景知识库,我们便可以在仿真环境下验证并给出量化的评估结果,而这些不但可以提早帮云产品发现潜在的隐患而且可以给出优化的建议和方向。有一个很重要的场景就是业务上云以后其所在的运行环境已经发生了巨变,而用户的业务需要提早适应新的环境以及应对新的挑战,最有效的方式之一就是通过容灾演练在业务无流量或仿真环境下模拟异常发生并观测业务的应激能力,对发现的问题及早推动改进和优化,提前消除隐患。


附录:


[1]. https://blog.codecentric.de/en/2018/07/chaos-engineering/


[2]. 混沌(Chaos theory)一词原指宇宙未形成之前的混沌状态,混沌现象起因于物体不断以某种规则复制前一阶段的运动状态而产生无法预测的随机效果,易发生于变动的系统中,该系统在行动之初极为单纯,但经过一定时间连续变动之后却产生始料未及的后果,也就是混沌状态。


[3]. Airflow:http://airflow.incubator.apache.org/


[4]. Jenkins: https://jenkins.io/




作者简介


马劲,花名隆猫,阿里云专有云事业部兼企业应用事业部总经理。全面负责专有云团队产品的技术研发、销售、运营管理服务以及产品市场营销等工作,从无到有带领专有云团队的成立和不断壮大。


2018 年 12 月 29 日 15:082627

评论 1 条评论

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

ProxmoxVE系列:上传系统镜像&&创建虚拟机

Bob

虚拟机 proxmoxve PVE

C++ socket通讯详解及注意事项

赖猫

c++ 后台开发 后端 服务器开发

[译]用@WebMvcTest测试MVC Web Contorller

祝坤荣

spring unittest

Spring Native Beta来了,原生更香

Java王路飞

spring 程序员 架构 微服务 springboot

一个SQL错误的问题让我找到了公司框架中三个bug

程序员小毕

Java MySQL 数据库 程序员 架构

用 Redis 实现消息队列是一个好主意么?

escray

redis 极客时间 学习笔记 3月日更 Redis 核心技术与实战

电子商务网站

在即

28天写作 28天挑战 3月日更

镜像仓库学习笔记

lenka

3月日更

ProxmoxVE 系列:如何巧妙的用Xshell连接Ubuntu server服务主机

Bob

虚拟机 系统 proxmoxve PVE

员工离职的注意事项

石云升

离职 28天写作 职场经验 3月日更

C++ 中的 task based 并发

赖猫

c++ 后端 多线程 并发 服务器开发

智能时代与华为路标:手机影像的文艺复兴史

脑极体

数据去哪了?:从一次生产事故聊聊并发编程原子性问题

海拉鲁

Java 并发编程 多线程

分布式锁的实现方案

360技术

深圳正探索利用区块链技术理念打造“数字政府“

CECBC区块链专委会

大数据

ProxmoxVE系列:Ubuntu服务器版系统安装

Bob

虚拟机 系统 proxmoxve PVE

如何定义错误码

编号94530

Java 错误码 错误处理

第十二周作业

MR.X

Redis - 缓存穿透、缓存击穿、缓存雪崩

insight

redis 3月日更

如何革命社交媒体、实现去中心化?丝绸之路创始人在狱中提出了构想

CECBC区块链专委会

社交网络

apollo在Spring boot加载过程解析

程序员小毕

Java spring 开源 源码 程序员

寻找被遗忘的勇气(二十四)

Changing Lin

3月日更

在全面拥抱人工智能前,这 6 步您的公司做到了吗?| 云途专栏

亚马逊云科技 (Amazon Web Services)

看东鹏饮料如何从150亿条数据中洞察先机 | 精选案例

亚马逊云科技 (Amazon Web Services)

学习方法记录

风翱

学习方法 3月日更

数据结构队列

我是程序员小贱

3月日更

亚马逊云科技和德甲为 2021 赛季新推出三项赛况统计数据,强化实时比赛分析

亚马逊云科技 (Amazon Web Services)

Java泛型最全指南

xcbeyond

Java 泛型 3月日更

NoCode 实战 | 零代码应用开发,轻松搞定任务跟踪管理难题(上)

亚马逊云科技 (Amazon Web Services)

Wireshark数据包分析学习笔记Day21

穿过生命散发芬芳

Wireshark 数据包分析 3月日更

设计与思考,关于资源和生命周期

程序员架构进阶

设计实践 生命周期 28天写作 3月日更 池化技术

2021 ThoughtWorks 技术雷达峰会

2021 ThoughtWorks 技术雷达峰会

阿里云马劲:保证云产品持续拥有稳定性的实践和思考
-InfoQ