使用ChaosBlade模拟Redis主从异地场景测试
Contents
我们接触到的商业化用户对于Redis集群有异地灾备的需求,对于
Redis Cluster
来说最简单的实际部署方案为主从异地,未来还有可能将要开发Redis Cluster
支持异地多活的能力。目前需要针对主从异地的情况下,对由于网络原因可能产生的故障场景做测试验证。
测试环境
基本的测试模式为:在每个Slave实例所在宿主机使用ChaosBlade
模拟网络故障,采用memtier_benchmark
模拟Redis集群访问流量,同时观察info replication
以及Redis日志。
Redis Cluster
3主3从,分别分布在6台宿主机(VM)memtier_benchmark 1.3.0
ChaosBlade 1.2.0
网络故障注入命令:
# 延迟45ms,上下浮动15ms,即延迟时间为30-60ms,维持6分钟
blade create network delay --time 45 --offset 15 --interface eth0 --exclude-port 22 --timeout 360
# 网卡丢包率25%,维持6分钟
blade create network loss --percent 25 --interface eth0 --exclude-port 22 --timeout 360
理论预期结果:
-
所有场景对于用户访问Redis基本无影响
-
异地正常场景(30ms时延、低丢包率)主从复制正常。
-
异地网络异常场景(秒级以上高时延,高丢包率)主从复制可能会断开,与实际流量情况、
repl-backlog-size
(复制缓冲区)配置有关。
测试数据
正常流量,读写比9:1,key大小32,压测命令:
memtier_benchmark -s 192.168.0.134 -p 6499 --test-time=300 -d 32 -c 50 --cluster-mode --ratio=1:9 --threads=2
主从间网络场景 | QPS | 平均RT(ms) | 99.99RT(ms) | maxRT(ms) | 异常表现 |
---|---|---|---|---|---|
正常 | 109471 | 2.74 | 28 | 41 | - |
延迟30~60ms | 110001 | 2.72 | 28 | 49 | - |
延迟1~2s | 110037 | 2.71 | 29 | 51 | - |
丢包25% | 108684 | 2.75 | 25 | 48 | - |
丢包50% | 110028 | 2.73 | 29 | 51 | - |
丢包100% | 111955 | 2.68 | 29 | 50 | 主从复制连接断开,集群信息中可以看到Slave离线。 |
大量写入,读写比1:1,key大小512,压测命令:
memtier_benchmark -s 192.168.0.134 -p 6499 --test-time=300 -d 512 -c 50 --cluster-mode --ratio=1:1 --threads=2
主从间网络场景 | QPS | 平均RT(ms) | 99.99RT(ms) | maxRT(ms) | 异常表现 |
---|---|---|---|---|---|
正常 | - | ||||
延迟30~60ms | 105220 | 2.85 | 31 | 49 | - |
延迟1~2s | 106043 | 2.83 | 31 | 53 | 主从复制连接断开,Slave会不断请求同步,但由于复制缓冲区会超出配置值而失败。 |
丢包25% | 105606 | 2.84 | 31 | 57 | - |
丢包50% | 106296 | 2.82 | 33 | 46 | 主从复制连接断开,Slave会不断请求同步,但由于复制缓冲区会超出配置值而失败。 |
丢包100% | 104620 | 2.86 | 31 | 48 | 主从复制连接断开,集群信息中可以看到Slave离线。 |
测试结果说明:
- 所有场景中,对于Redis集群读写访问无影响,在网络异常场景下主从复制会有异常,符合预期。
- 丢包100%相当于网络断开场景,观察到主从复制断开,集群信息看到实例下线,符合预期。
- 在Redis写入流量大 + 高时延(秒级)或高丢包率的情况下,Slave会容易触发全量同步,并且此时由于大量写入导致复制缓冲区溢出(超出
client-output-buffer-limit
的slave
客户端配置),主从复制连接会断开,直到网络恢复正常。
测试结论
Redis集群主从异地的场景中,在常规流量下,异地导致的正常延迟和丢包基本不会对Redis集群造成影响;在大量写流量下,并且异地时延达到秒级以上或丢包率很高时,会发生Slave请求全量同步、失败和主从复制连接断开。所有异地网络异常场景均不会对本地访问Redis集群造成影响。
在3*24
小时日常流量下,上述场景随机执行,均未对Redis集群读写造成影响,对于丢包100%等网络断开等场景,也能在网络故障场景结束后主从复制自动恢复,服务能保证稳定运行。