Contents

使用ChaosBlade模拟Redis主从异地场景测试

我们接触到的商业化用户对于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

理论预期结果:

  1. 所有场景对于用户访问Redis基本无影响

  2. 异地正常场景(30ms时延、低丢包率)主从复制正常。

  3. 异地网络异常场景(秒级以上高时延,高丢包率)主从复制可能会断开,与实际流量情况、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-limitslave客户端配置),主从复制连接会断开,直到网络恢复正常。

测试结论

Redis集群主从异地的场景中,在常规流量下,异地导致的正常延迟和丢包基本不会对Redis集群造成影响;在大量写流量下,并且异地时延达到秒级以上或丢包率很高时,会发生Slave请求全量同步、失败和主从复制连接断开。所有异地网络异常场景均不会对本地访问Redis集群造成影响。

3*24小时日常流量下,上述场景随机执行,均未对Redis集群读写造成影响,对于丢包100%等网络断开等场景,也能在网络故障场景结束后主从复制自动恢复,服务能保证稳定运行。