很久之前曾基于linux内核自带的TC和netem模拟一些公网中遇到的极端情况(延迟、丢包、重复、损坏和乱序等),验证了我们传输程序的健壮性!
具体细节可见这篇老博客: https://blog.csdn.net/u013128262/article/details/84784663
最近在复现kafka生产端一个timeout异常场景时,发现之前方案时因为内核和OS版本问题有些差异而无法直接使用老的命令,便把目光迅速调整到阿里开源的这款混沌工程新贵ChaosBlade(https://github.com/chaosblade-io/chaosblade
)。
ChaosBlade 是阿里巴巴开源的一款遵循混沌工程原理和混沌实验模型的实验注入工具,帮助企业提升分布式系统的容错能力,并且在企业上云或往云原生系统迁移过程中业务连续性保障。
ChaosBlade 不仅使用简单,而且支持丰富的实验场景,场景包括:
ChaosBlade还提供混沌实验管理工具,包含创建实验、销毁实验、查询实验、实验环境准备、实验环境撤销等命令,是混沌实验的执行工具,执行方式包含 CLI 和 HTTP 两种。提供完善的命令、实验场景、场景参数说明,操作简洁清晰。
所以ChaosBlade是可以非常方便地支持网络故障模拟场景!
Talk is cheap,just do it!
直接从github上下载最新的程序包: https://github.com/chaosblade-io/chaosblade/releases
[$] <> ./blade create network -h
Network experiment
Usage:
blade create network [flags]
blade create network [command]
Examples:
network delay --interface eth0 --time 3000
# You can execute "blade query network interface" command to query the interfaces
Available Commands:
corrupt Corrupt experiment
delay Delay experiment
dns Dns experiment
drop Drop experiment
duplicate Duplicate experiment
loss Loss network package
occupy Occupy the specify port
reorder Reorder experiment
Flags:
-h, --help help for network
Global Flags:
-d, --debug Set client to DEBUG mode
--uid string Set Uid for the experiment, adapt to docker
从helper看出ChaosBlade支持一下网络故障模拟:
更多操作详见官方入门手册: https://github.com/chaosblade-io/chaosblade/wiki/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97
复现kafka生产端timeout场景的话,直接使用最常用的网络丢包实验即可。
Loss network package
支持的参数:
--destination-ip string destination ip. Support for using mask to specify the ip range such as 92.168.1.0/24 or comma separated multiple ips, for example 10.0.0.1,11.0.0.1.
--exclude-ip string Exclude ips. Support for using mask to specify the ip range such as 92.168.1.0/24 or comma separated multiple ips, for example 10.0.0.1,11.0.0.1
--exclude-port string Exclude local ports. Support for configuring multiple ports, separated by commas or connector representing ranges, for example: 22,8000. This flag is invalid when --local-port or --remote-port is specified
--force Forcibly overwrites the original rules
--ignore-peer-port ignore excluding all ports communicating with this port, generally used when the ss command does not exist
--interface string Network interface, for example, eth0 (required)
--local-port string Ports for local service. Support for configuring multiple ports, separated by commas or connector representing ranges, for example: 80,8000-8080
--percent string loss percent, [0, 100] (required)
--remote-port string Ports for remote service. Support for configuring multiple ports, separated by commas or connector representing ranges, for example: 80,8000-8080
--timeout string set timeout for experiment
我们实际的一个demo:
# eth0发往远端9092端口的数据包将持续120s丢包5%
blade create network loss --percent 5 --interface eth0 --remote 9092 --timeout 120
执行完会有一个状态返回值:
{"code":200,"success":true,"result":"5cbde40d2594f891"}
通过status
参数可以查询到实际的状态
blade status 5cbde40d2594f891
ChaosBlade功能强大,并且提供了便捷的使用接口和管理工具。
作为一个技术人不但要用好工具,更要了解工具的运行原理!
ChaosBlade基础资源相关的实现都在chaosblade-exec-os这个模块。
我们先看看程序入口:
https://github.com/chaosblade-io/chaosblade-exec-os/blob/master/exec/network_loss.go
此处主要还是一些业务逻辑,没有核心实现。
https://github.com/chaosblade-io/chaosblade-exec-os/blob/master/exec/bin/tcnetwork/tcnetwork.go
不难看出ChaosBlade在网络故障模拟底层技术仍然是TC和netem这2大杀器。