
导读:
Redis官方号称支持并发11万读操作,并发8万写操作。由于优异的性能和方便的操作,相信很多人都在项目中都使用了Redis,为了不让应用过分的依赖 Redis服务,Redis的作用只作为提升应用并发和降低应用响应时间存在,即使Redis出现异常,应用程序也不应该出现提供服务失败问题,对此拍拍信最近安排了一次全环境的Redis Cluster 宕机演练。
许彬:拍拍信架构负责人。
朱荣松:拍拍信架构开发工程师。
一、演练过程
Redis 集群环境:
1. 测试环境:
Redis Cluster 配置 :Redis 3主 3从 一共6个节点。
2. 预发环境:
Redis Cluster 配置 :Redis 3主 3从 一共6个节点。
下面是我们操作的时间线:
程序运行中关闭任意一台从节点,测试一天均无异常。
程序运行中关闭任意一台从节点,程序未发现异常,测试一天未发现异常。
预发环境有应用发版,出现异常程序无法启动。
……
二、问题描述
首先说明几个前提:
1. 测试与预发环境目前关闭的都是任意一台Redis从节点。
2. 测试环境经过反复测试无问题才开始关闭预发环境节点。
3. 预发环境重启被关闭的Redis节点后异常消失。
4. 连接Redis客户端使用的是Java语言中使用范围较广的Jedis。
那么为什么测试环境在经过反复测试没有问题,到预发环境会出现问题?
三、原理
分析问题前先简单解释下Redis Cluster实现原理。简单来说Redis场景 | 操作(多节点均同时操作) | Redis写总量 | Redis读总量 | 错误量 | 总耗时(s) | 错误率 |
程序运行中 | 关主(关任一主) | 100000 | 100000 | 3084 | 100 | 0.031 |
关主(关任一主) | 100000 | 100000 | 1482 | 102 | 0.015 |
关主(关任一主) | 100000 | 100000 | 3053 | 97.6 | 0.031 |
关从(关任一从) | 100000 | 100000 | 0 | 109.2 | 0 |
关从(关任一从) | 100000 | 100000 | 0 | 90.1 | 0 |
关从(关任一从) | 100000 | 100000 | 0 | 88.9 | 0 |
主从一起关(关任一对) | 100000 | 100000 | 32613 | 210.1 | 0.326 |
主从一起关(关任一对) | 100000 | 100000 | 29148 | 169.8 | 0.291 |
主从一起关(关任一对) | 100000 | 100000 | 32410 | 173.7 | 0.324 |
所有主全关 | 100000 | 100000 | 100000 | 353.4 | 1 |
所有从全关 | 100000 | 100000 | 0 | 87.7 | 0 |
只留一台主 | 100000 | 100000 | 100000 | 357.1 | 1 |