在分布式架构环境下,服务间的依赖日益复杂,可能没有人能说清单个故障对整个系统的影响,构建一个高可用的分布式系统面临着很大挑战。在可控范围或环境下,使用 ChaosBlade 工具,对系统注入各种故障,持续提升分布式系统的容错和弹性能力,以构建高可用的分布式系统。

ChaosBlade 是什么?

ChaosBlade 是一款遵循混沌工程实验原理,建立在阿里巴巴近十年故障测试和演练实践基础上,并结合了集团各业务的最佳创意和实践,提供丰富故障场景实现,帮助分布式系统提升容错性和可恢复性的混沌工程工具。点击这里,了解详情。

ChaosBlade 无需编译,下载解压即可使用,支持基础资源、Java 应用、容器服务类的混沌实验,特点是操作简洁、无侵入、扩展性强。

ChaosBlade @GitHub,点击进入

下面我们以微服务分布式系统举例,一步一步构建高可用的分布式系统。

构建高可用的分布式系统

ChaosBlade 的使用方式

ChaoBlade 通过 CLI 方式调用,比如我们模拟 A 服务调用 B 提供的 com.alibaba.demo.HelloService 服务下的 hello 服务延迟 3 秒,我们可以在 B 应用上注入延迟故障,仅需两步操作:
第一步:准备阶段。由于 Java 应用的故障注入是通过 Java Agent 机制实现,所以首先要先挂载 agent,执行的命令是 blade prepare jvm --process <PROCESS NAME OF B APPLICATION>
第二步:执行阶段,注入故障。执行命令是 blade create dubbo delay --time 3000 --service com.alibaba.demo.HelloService --methodname hello --provider,即对 B 服务提供方提供的 com.alibaba.demo.HelloService#hello 服务注入 3 秒延迟。

ChaosBlade 使用简洁,如果想了解命令的如何使用,可在命令后面添加 -h参数,比如 blade create dubbo delay -h。更详细的 chaosblade 操作,可详见新手指南

分布式系统高可用原则

高可用的分布式系统一般需要满足以下原则:

  • 失败重试
  • 实例隔离
  • 请求限流
  • 服务降级
  • 服务熔断
  • 流量调度
  • 开关&预案
  • 监控告警
  • 日志跟踪

混沌实验场景实践

我们以 A 调用 B,B 调用 C,A 同时也调用 D 举例,A1、A2 是 A 服务的多个实例,依次类推。

失败重试

实验场景:调用下游服务实例异常。
容错方案:会再次请求另外一个服务实例进行重试。
场景模拟:对 B1 注入异常故障,A 服务调用到 B1 时会出现调用失败。
预期方案:系统会将 A 服务的请求路由到 B2 进行重试。
blade 命令:blade c dubbo throwCustomException --exception <EXCEPTION CLASS> --service <SERVICE NAME> --provider
修复方案:添加失败检测和请求重试能力。

实例隔离

演练场景:多次调用下游一个服务实例超时。
容错方案:会隔离或者下线此服务实例,防止请求路由到此服务实例。
场景模拟:对 B1 注入延迟故障,A 服务调用到 B1 时,出现调用超时。
预期方案:系统会自动隔离或下线 B1 实例。
blade 命令:blade c dubbo delay --time <DELAY TIME> --service <SERVICE NAME> --provider
修复方案:添加服务质量检查,下线不可用的服务实例。

请求限流

演练场景:服务线程池满。
容错方案:会对入口流量进行限流,防止请求堆积,资源耗尽导致服务不可用。
场景模拟:对 A 注入线程池满故障。
预期方案:线程池满时,触发限流,新请求快速失败。
blade 命令:blade c dubbo threadpoolfull --consumer
修复方案:添加限流能力。

服务降级

演练场景:A 对 B 是强依赖,对 D 是弱依赖,A 调用 D 线程数多,争抢调用 B 服务的资源。
容错方案:对弱依赖 B 进行降级,减少资源分配。
场景模拟:对 A 注入调用 D 线程数满故障。
blade 命令:blade c dubbo threadpoolfull --service <D SERVICE NAME> --consumer
修复方案:梳理服务依赖,添加服务降级能力。

调用熔断

演练场景:下游服务不可用
容错方案:触发熔断,快速失败返回
场景模拟:对 B 服务所有的实例注入延迟超时故障。
blade 命令:blade c dubbo delay --time <DELAY TIME> --service <SERVICE NAME> --provider
修复方案:当下游服务不可用时,能立即熔断,快速失败。

流量调度

演练场景:上游高并发下,扩容下游服务,在服务实例初始化时,CPU 负载高,导致上游服务受影响
容错方案:当服务实例机器负载高时,自动切流到正常机器
场景模拟:对 B1 做 CPU 满载操作。
blade 命令:blade c cpu fullload
修复方案:添加系统、应用资源监控和流量调度能力。

系统预案

演练场景:杀掉服务实例。
容错方案:快速拉起或扩容
场景模拟:杀掉 B 大部分实例。
blade 命令: blade create process kill --process <PROCESS NAME>
修复方案:添加相关系统预案。

监控告警

注入任意故障,验证监控告警的有效性

日志跟踪

演练场景:修改应用中具体方法返回值。
容错方案:全链路调用日志记录。
场景模拟:修改 B 服务的一个业务方法的返回值。
blade 命令:blade c jvm return --classname <CLASS NAME> --methodname <METHOD NAME> --value <RETURN VALUE>
修复方案:添加全链路日志记录,便于排查和追溯问题。

总结

通过 ChaosBlade 工具能简洁有效的执行混沌实验,上文提到的请求限流、降级熔断功能可以使用 Sentinel 来解决。阿里云 AHAS 产品已经集成混沌工程平台 和 Sentinel 功能。ChaosBlade 除了上述实验场景,还有更多的场景期待你来挖掘。

后续规划

ChaosBlade 后续会继续增强对 Java 生态的混沌实验,比如对 Redis、GRPC、RabbitMQ 等主流组件的支持。也会增加云原生设施的混沌实验,比如 Kubernetes、Service Mesh 等。

参与贡献

欢迎加入 ChaosBlade 社区,参与混沌工程生态建设,贡献不局限于代码,也可以是想法、文档、和社区答疑、讨论。


本文作者:中间件小哥

原文链接

本文为云栖社区原创内容,未经允许不得转载。

一线实践 | 借助混沌工程工具 ChaosBlade 构建高可用的分布式系统的更多相关文章

  1. 好玩又实用,阿里巴巴开源混沌工程工具 ChaosBlade

    减少故障的最好方法就是让问题经常性的发生.在可控范围或环境下,通过不断重复失败过程,持续提升系统的容错和弹性能力. 那么,实施一次高效的混沌工程实验,需要几步呢? 答案:2 步. ① 登陆 Chaos ...

  2. 面向云原生的混沌工程工具-ChaosBlade

    作者 | 肖长军(穹谷)阿里云智能事业群技术专家   导读:随着云原生系统的演进,如何保障系统的稳定性受到很大的挑战,混沌工程通过反脆弱思想,对系统注入故障,提前发现系统问题,提升系统的容错能力.Ch ...

  3. 阿里开源混沌工程工具 ChaosBlade

    https://github.com/chaosblade-io/chaosblade

  4. Linux企业集群用商用硬件和免费软件构建高可用集群PDF

    Linux企业集群:用商用硬件和免费软件构建高可用集群 目录: 译者序致谢前言绪论第一部分 集群资源 第1章 启动服务 第2章 处理数据包 第3章 编译内容 第二部分 高可用性 第4章 使用rsync ...

  5. 高性能Linux服务器 第11章 构建高可用的LVS负载均衡集群

    高性能Linux服务器 第11章 构建高可用的LVS负载均衡集群 libnet软件包<-依赖-heartbeat(包含ldirectord插件(需要perl-MailTools的rpm包)) l ...

  6. 基于docker+etcd+confd + haproxy构建高可用、自发现的web服务

    基于docker+etcd+confd + haproxy构建高可用.自发现的web服务 2016-05-16 15:12 595人阅读 评论(0) 收藏 举报 版权声明:本文为博主原创文章,未经博主 ...

  7. Dubbo+zookeeper构建高可用分布式集群(二)-集群部署

    在Dubbo+zookeeper构建高可用分布式集群(一)-单机部署中我们讲了如何单机部署.但没有将如何配置微服务.下面分别介绍单机与集群微服务如何配置注册中心. Zookeeper单机配置:方式一. ...

  8. spring boot 2.0.3+spring cloud (Finchley)1、搭建服务注册和发现组件Eureka 以及构建高可用Eureka Server集群

    一 .搭建Eureka 编写Eureka Server 由于有多个spring boot项目,采用maven多module的结构,项目结构如下: 新建一个maven主工程,在主maven的pom文件中 ...

  9. 用HAProxy和KeepAlived构建高可用的反向代理

      用HAProxy和KeepAlived构建高可用的反向代理 用HAProxy和KeepAlived构建高可用的反向代理 前言对于访问量较大的网站来说,随着流量的增加单台服务器已经无法处理所有的请求 ...

随机推荐

  1. pip在多个python版本中将包安装到制定版本

    $ pip install -t /usr/local/lib/python3./site-package/ beautifulsoup4 利用pip install -t 制定到具体位置

  2. jeecms使用小结

    前言: 使用jeecmsV9已经有一段时间,现在PC端的二次开发基本进入尾声,手机端的开发即将开始 ,由于项目时间比较紧,开发时不是每个人都会使用它自带的标签,所以在PC端开发的时候浪费了大量时间,为 ...

  3. nfs网络共享服务基础

    nfs原理 1.开启RPC服务 2.NFS向RPC服务注册启动的端口 3.用户向RPC询问NFS服务的端口 4.RPC返回端口给客户端 5.客户端通过获得的端口与NFS服务器进行数据传输 实验步骤 一 ...

  4. node 和npm环境安装

    node 安装 1.下载node二进制文件 [root@baolin-images#>> ~]#wget https://nodejs.org/dist/v10.16.0/node-v10 ...

  5. 【arc077f】AtCoder Regular Contest 074 F - Lotus Leaves

    题意 给定一个n*m的池塘,每个格子上可能有叶子. 从一个叶子出发,可以跳到相同行或相同列的叶子. 问至少去掉多少叶子,使得起点不能到达终点. \(n,m<=100\) 解法 很显然的最小割模型 ...

  6. mysql 无法存储joda time的datetime类型

    com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: '\xAC\xED\x00\x05sr\x ...

  7. 洛谷 P1217 [USACO1.5]回文质数 Prime Palindromes【取回文数/数论/字符串】

    题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围[a,b](5 <= a < b <= 100,000 ...

  8. JS中int和string的转换

    1.int型转换成string型 (1) var   x=100    a   =   x.toString()    (2) var   x=100;    a   =   x   +"& ...

  9. hive行转列的高级用法later view explode

    先贴出一个示例: 参考链接

  10. css中用一张背景图做页面的技术有什么优势?

    css中用一张背景图做页面的技术有什么优势? 简单介绍一下 CSS Sprites 的优点: 当用户往U盘中拷200张图片,会等很久.但是如果弄成一个文件,再拷贝就会快很多. CSS Sprites ...