Chaosblade 混动工程之网络延迟实践

需求背景

在分布式系统下,通过设置网络延迟,来观测服务间的稳定性,及服务与中间件的稳定性表现。

技术方案

Chaosblade是阿里巴巴最近开源的一款故障注入的工具,通过Chaosblade进行故障注入,来模拟网络延迟,本篇主要讲解在模拟过程中遇到的疑惑,希望能够分享出来,避免再次踩坑。

Github:https://github.com/chaosblade-io/chaosblade/releases?

blade Create network delay 网络延迟实验场景

介绍

可以指定网卡、本地端口、远程端口、目标 IP 延迟。需要特别注意,如果不指定端口、ip 参数,而是整个网卡延迟,切记要添加 --timeout 参数或者 --exclude-port 参数,前者是指定运行时间,自动停止销毁实验,后者是指定排除掉的延迟端口,两者都是防止因延迟时间设置太长,造成机器无法连接的情况,如果真实发生此问题,重启机器即可恢复。

本地端口和远程端口之间是或的关系,即这两个端口都会发生延迟,只要指定了本地端口或者远程端口,无需指定需要排除的端口。端口与 IP 之间是与的关系,即指定的 IP:PORT 发生延迟。

网络延迟场景主要验证网络异常的情况下,系统的自我容错能力。

参数

--destination-ip string   目标 IP. 支持通过子网掩码来指定一个网段的IP地址, 例如 192.168.1.0/24. 则 192.168.1.0~192.168.1.255 都生效。你也可以指定固定的 IP,如 192.168.1.1 或者 192.168.1.1/32,也可以通过都号分隔多个参数,例如 192.168.1.1,192.168.2.1。
--exclude-port string     排除掉的端口,默认会忽略掉通信的对端端口,目的是保留通信可用。可以指定多个,使用逗号分隔或者连接符表示范围,例如 22,8000 或者 8000-8010。 这个参数不能与 --local-port 或者 --remote-port 参数一起使用
--exclude-ip string       排除受影响的 IP,支持通过子网掩码来指定一个网段的IP地址, 例如 192.168.1.0/24. 则 192.168.1.0~192.168.1.255 都生效。你也可以指定固定的 IP,如 192.168.1.1 或者 192.168.1.1/32,也可以通过都号分隔多个参数,例如 192.168.1.1,192.168.2.1。
--interface string        网卡设备,例如 eth0 (必要参数)
--local-port string       本地端口,一般是本机暴露服务的端口。可以指定多个,使用逗号分隔或者连接符表示范围,例如 80,8000-8080
--offset string           延迟时间上下浮动的值, 单位是毫秒
--remote-port string      远程端口,一般是要访问的外部暴露服务的端口。可以指定多个,使用逗号分隔或者连接符表示范围,例如 80,8000-8080
--time string             延迟时间,单位是毫秒 (必要参数)
--force                   强制覆盖已有的 tc 规则,请务必在明确之前的规则可覆盖的情况下使用
--ignore-peer-port        针对添加 --exclude-port 参数,报 ss 命令找不到的情况下使用,忽略排除端口
--timeout string          设定运行时长,单位是秒,通用参数
?

可详细参考:https://chaosblade-io.gitbook.io/chaosblade-help-zh-cn/blade-create-network-delay

操作动作

# 访问本机 8080 和 8081 端口延迟 3 秒,延迟时间上下浮动 1 秒
blade create network delay --time 3000 --offset 1000 --interface eth0 --local-port 8080,8081

{"code":200,"success":true,"result":"9b4aa9fabe073624"}

# 可以在另一台相同网络内的机器通过 telnet 命令验证,即 telnet xxx.xxx.xxx.xxx 8080
# 销毁实验
blade destroy 9b4aa9fabe073624

?

在另外一台机器上,进行telnet进行验证,是能达到延迟效果。并没有满足真实需求,原因是如下:

?

首先说下架构设计,整体架构有两层设计,首先是API层,其次是Service服务层,有两台机器,一台机器A,一台机器B,每台机器都有Nginx,通过Nginx进行反向代理到各个服务。

A机器作为API服务,部署了很多API服务。

B机器作为Service服务,部署了很多Service服务。

在这种情况,各个服务都是混合部署的,那么希望能够针对某个服务进行网络延迟、或者设置延迟时间过长,造成超时的假象。

那么希望能够在本地操作也实现延迟,通过上述操作方式是并不能满足需求的。通过这种方式127.0.0.1:8001来模拟网络延迟故障。这样如何操作呢?

解决方案

经对原理深入了解之后发现,是使用网卡方式不当的导致,命令是中有对--interface 设置,那么上述操作的是设置是:eth0 ,上图

Chaosblade 混动工程之网络延迟实践

?通过上图发现是有两个网卡的,eth0和lo 会发现他们对应的inet对应的IP,lo对应的127.0.0.1本地IP

通过设置--interface lo 即可实现对本地端口模拟网络延迟。?

就这样,问题已经解决了。。。

?

延伸阅读

eth0,eth1,eth2……代表网卡一,网卡二,网卡三……
lo代表127.0.0.1,即localhost?

上一篇:【K8s概念】存储容量


下一篇:Mongo部署到Win2008 上 CPU持续100%,改为 Non- NUMA 即可