大数跨境
0
0

如何快速执行一次混沌实验?ChaosBlade 帮到你

如何快速执行一次混沌实验?ChaosBlade 帮到你 阿里巴巴中间件
2019-04-11
2
导读:阿里巴巴混沌工程工具 ChaosBlade 自开源以来,由于其操作简洁、无侵入、扩展性强的特点,不少开发者将它用来测试自身系统的容错能力和健壮性,还将它用来验证容器编排配置是否合理。


阿里巴巴混沌工程工具 ChaosBlade 自开源以来,由于其操作简洁、无侵入、扩展性强的特点,不少开发者将它用来测试自身系统的容错能力和健壮性,还将它用来验证容器编排配置是否合理。


本文将结合实践,从模型的定义和实现两个方面为大家介绍 ChaosBlade 混沌实验模型,遵循此模型,我们可以简单明了地执行一次混沌实验,不仅可以控制实验的最小爆炸半径,而且可以方便快捷地扩展新的实验场景或者增强现有场景。chaosblade 和 chaosblade-exec-jvm 工程都是根据此模型来实现。


  • chaosblade 工程链接

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

  • chaosblade-exec-jvm 工程链接:

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

模型定义


在给出模型之前,我们先明确实施一次混沌实验所涉及的一些问题:

  • 对什么做混沌实验?

  • 混沌实验实施的范围是什么?

  • 具体实施什么实验?

  • 实验生效的匹配条件有哪些?

举个例子:

一台 IP 是 10.0.0.1 机器上的应用,调用 com.example.HelloService@1.0.0 Dubbo 服务延迟 3s。根据上述的问题列表,先明确的是要对 Dubbo 组件做混沌实验,实施实验的范围是 10.0.0.1 单机,对调用 com.example.HelloService@1.0.0 服务模拟 3s 延迟等等。 明确以上内容,就可以精准的实施一次混沌实验。我们将这些步骤总结并抽象出以下模型:

  • Target:实验靶点,指实验发生的组件,例如容器、应用框架(Dubbo、Redis、Zookeeper)等。

  • Scope:实验实施的范围,指具体触发实验的机器或者集群等。

  • Matcher:实验规则匹配器,根据所配置的 Target,定义相关的实验匹配规则,可以配置多个。由于每个 Target 可能有各自特殊的匹配条件,比如 RPC 领域的 HSF、Dubbo,可以根据服务提供者提供的服务和服务消费者调用的服务进行匹配;缓存领域的 Redis,可以根据 set、get 操作进行匹配。

  • Action:指实验模拟的具体场景,Target 不同,实施的场景也不一样,比如磁盘,可以演练磁盘满、磁盘 IO 读写高、磁盘硬件故障等实验场景。如果是应用,可以抽象出延迟、异常、返回指定值(错误码、大对象等)、参数篡改、重复调用等实验场景。

回到上述的例子,我们可以将实验总结成一句话:对 Dubbo 组件(Target)进行故障演练,演练的是 10.0.0.1 主机(Scope)的应用,调用 com.example.HelloService@1.0.0 (Matcher)服务延迟 3s(Action)。

伪代码可以写成:

Toolkit.
    // 实验靶点
    dubbo.
    // 范围,此处是主机
    host("1.0.0.1").
    // 组件匹配器,消费者还是服务提供者
    consumer().
    // 组件匹配器,服务接口
    service("com.example.HelloService").
    // 组件匹配器,1.0.0 接口版本
    version("1.0.0").
    // 实验场景,延迟 3s
    delay(3000);

chaosblade 模型的实现


chaosblade cli 调用

针对上述例子,chaosblade 的调用命令是:

blade create dubbo delay --time 3000 --consumer --service com.example.HelloService --version 1.0.0

  • delay: 模型中的 action,执行延迟演练场景。

  • --time: 模型中 action 参数,指延迟时间。

  • --consumer、 --service、 --version:模型中的 matchers,实验规则匹配器。

注: 由于 chaosblade 是在单机执行的工具,所以混沌实验模型中的 scope 默认为本机,不再显示声明。

chaosblade 模型的定义

  • 一个组件混沌实验模型的定义,包含组件名称和所支持的实验场景列表。

type ExpModelCommandSpec interface {
    // 组件名称
    Name() string

    // 支持的场景列表
    Actions() []ExpActionCommandSpec

    // ... 略
}


  • 一个实验场景 action 的定义,包含场景名称、场景所需参数和一些实验规则匹配器。

type ExpActionCommandSpec interface {
    // 演练场景名称
    Name() string

    // 规则匹配器列表
    Matchers() []ExpFlagSpec

    // Action 参数列表
    Flags() []ExpFlagSpec

    // Action 执行器
    Executor(channel Channel) Executor

        // ... 略
}


  • 一个实验匹配器的定义,包含参数名、参数描述等等。

type ExpFlagSpec interface {
        // 参数名
    FlagName() string

        // 参数描述
    FlagDesc() string

        // 是否需要参数值
    FlagNoArgs() bool

        // 是否是必要参数
    FlagRequired() bool
}

chaosblade 模型的具体实现

以 network 组件为例,network 作为混沌实验组件,目前包含网络延迟、网络屏蔽、网络丢包、DNS 篡改演练场景,则依据模型规范,具体实现为:

type NetworkCommandSpec struct {
}

func (*NetworkCommandSpec) Name() string {
    return "network"
}

func (*NetworkCommandSpec) Actions() []exec.ExpActionCommandSpec {
    return []exec.ExpActionCommandSpec{
        &DelayActionSpec{},
        &DropActionSpec{},
        &DnsActionSpec{},
        &LossActionSpec{},
    }
}

network target 定义了 DelayActionSpecDropActionSpecDnsActionSpecLossActionSpec 四种混沌实验场景,其中 DelayActionSpec 定义如下:

type DelayActionSpec struct {
}

func (*DelayActionSpec) Name() string {
    return "delay"
}

func (*DelayActionSpec) Matchers() []exec.ExpFlagSpec {
    return []exec.ExpFlagSpec{
        &exec.ExpFlag{
            Name: "local-port",
            Desc: "Port for external service",
        },
        &exec.ExpFlag{
            Name: "remote-port",
            Desc: "Port for invoking",
        },
        &exec.ExpFlag{
            Name: "exclude-port",
            Desc: "Exclude one local port, for example 22 port. This flag is invalid when --local-port or remote-port is specified",
        },
        &exec.ExpFlag{
            Name:     "device",
            Desc:     "Network device",
            Required: true,
        },
    }
}

func (*DelayActionSpec) Flags() []exec.ExpFlagSpec {
    return []exec.ExpFlagSpec{
        &exec.ExpFlag{
            Name:     "time",
            Desc:     "Delay time, ms",
            Required: true,
        },
        &exec.ExpFlag{
            Name: "offset",
            Desc: "Delay offset time, ms",
        },
    }
}

func (*DelayActionSpec) Executor(channel exec.Channel) exec.Executor {
    return &NetworkDelayExecutor{channel}
}

DelayActionSpec 包含 2 个场景参数和 4 个规则匹配器。

总结


通过以上示例,可以看出此模型简单、易实现,并且可以覆盖目前已知的实验场景。后续我们将对此模型进行完善,塑造一个混沌实验标准。

想要更完整的免费故障演练工具?可访问文末“阅读原文”。


直播预告


时间:4 月 17 日(下周三)19:00 -- 20:00

议题:混沌工程工具 ChaosBlade 介绍与实践》

主讲人:穹谷(本文作者)

内容概要:

  • 混沌工程概述

  • 介绍 ChaosBlade 项目及附属项目

  • 介绍 chaosblade 工具及混沌实验模型

  • 实际场景下 chaosblade 最佳实践

如何参与:按照以下方式进入钉钉群

加入我们的混沌工程社群,一起交流和探索混沌工程的实践以及发展路径:

👪 ChaosBlade 开源钉群(推荐,入群请备注:名称或昵称+公司+城市)

👧 若没有钉钉,请添加中间件小姐姐微信,再拉入微信群(回复较慢,请耐心等待⌛️)

本文作者:

肖长军(花名:穹谷)

GitHub ID @xcaspar,阿里巴巴高级开发工程师,多年应用性能监控和混沌工程领域工作经验,阿里云产品 AHAS 核心开发,ChaosBlade 开源项目负责人。


文章缩略图

Photo by Javardh on Unsplash


/ 首场 Nacos 开发者沙龙@杭州,即刻报名 /

/ 好玩又实用,阿里巴巴开源 ChaosBlade /



©每周一推

第一时间获得下期分享


Tips:

# 点下“看”❤️

# 然后,公众号对话框内发送“锅刷”,试试手气?😆

# 本期奖品是来自淘宝心选的进口椰棕锅刷

【声明】内容源于网络
0
0
阿里巴巴中间件
Aliware阿里巴巴中间件官方账号
内容 920
粉丝 0
阿里巴巴中间件 Aliware阿里巴巴中间件官方账号
总阅读615
粉丝0
内容920