写点什么

Redis Cluster 宕机引发的事故

  • 2020-06-12
  • 本文字数:2160 字

    阅读完需:约 7 分钟

Redis Cluster 宕机引发的事故

导读:

Redis 官方号称支持并发 11 万读操作,并发 8 万写操作。由于优异的性能和方便的操作,相信很多人都在项目中都使用了 Redis,为了不让应用过分的依赖 Redis 服务,Redis 的作用只作为提升应用并发和降低应用响应时间存在,即使 Redis 出现异常,应用程序也不应该出现提供服务失败问题,对此拍拍信最近安排了一次全环境的 Redis Cluster 宕机演练。

本文作者系拍拍信架构负责人朱荣松和拍拍信架构开发工程师许彬,授权“技术锁话”进行发布。

一、演练过程

Redis 集群环境:


  1. 测试环境:

  2. Redis Cluster 配置 :Redis 3 主 3 从 一共 6 个节点。

  3. 预发环境:

  4. Redis Cluster 配置 :Redis 3 主 3 从 一共 6 个节点。


下面是我们操作的时间线:


  • 第一天

  • 程序运行中关闭任意一台从节点,测试一天均无异常。

  • 第二天

  • 程序运行中关闭任意一台从节点,程序未发现异常,测试一天未发现异常。

  • 第三天

  • 预发环境有应用发版,出现异常程序无法启动。


……

二、问题描述

首先说明几个前提:


  1. 测试与预发环境目前关闭的都是任意一台 Redis 从节点。

  2. 测试环境经过反复测试无问题才开始关闭预发环境节点。

  3. 预发环境重启被关闭的 Redis 节点后异常消失。

  4. 连接 Redis 客户端使用的是 Java 语言中使用范围较广的 Jedis。


那么为什么测试环境在经过反复测试没有问题,到预发环境会出现问题?

三、原理

分析问题前先简单解释下 Redis Cluster 实现原理。简单来说 Redis Cluster 中内置了 16384 个哈希槽,当需要在 Redis Cluster 中存取一个 key 或者 value 时,Redis 客户端先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数( 算法为:crc16(key)mod 16384),这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,值得注意的是这个计算 key 是在哪个槽上的操作是 Redis 客户端做的操作,Java 中常用的客户端为 Jedis 这个也是被 Spring 推荐的一种客户端。


注: 如果有人好奇为什么 Redis Cluster 为什么会使用 16384 也就是 2^14 个槽。可以查看 Github https://github.com/antirez/redis/issues/2576作者对此进行了解释。

四、分析

首先是查看程序启动异常信息,下图 1 为程序异常信息。



图 1 异常很明显抛出的是连接异常


查看了 Jedis 的源码后发现初始化 Redis Cluster 的槽信息时,调用 initializeSlotsCache()方法时出现异常。图 2 为此方法的具体实现,分析代码发现此代码的目的应该是需要 cache Redis Cluster 槽信息,由于代码中有 break,所以是只需要连接 Redis 获取一次信息即可。细一看此代码应该是有 Bug,Try 的范围没有覆盖到 Jedis 连接的操作,如果 Jedis 连接失败直接抛出连接失败异常,此循环会直接退出,与代码实际预期不符合。



图 2


由此引发另一个思考,是不是我关闭的节点正好为循环的第一个节点导致此问题。尝试关闭另外一台从节点后程序正常启动。那么 Jedis 加载的节点顺序是什么,似乎 Jedis 对节点顺序进行了排序操作。在查看源码后发现 Jedis 重写了 Redis 节点配置类的 hashCode 方法。



图 3



图 4


下面简单测试下如果配置为:jedis-01.test.com、jedis-02.test.com、jedis-03.test.com、jedis-04.test.com、jedis-05.test.com、jedis-05.test.com 输出顺序是什么。



图 5


输出结果:


[redis-06.test.com:6379,redis-04.test.com:6379, redis-01.test.com:6379, redis-03.test.com:6379, redis-02.test.com:6379,redis-05.test.com:6379]


也就是说如果关闭 redis-06.test.com:6379 这台节点,程序就会出现启动失败问题。

五、解决

问题定位后首先去 Github 上的查看相关问题是否有人遇到,在查询后发现此问题有人在去年 11 月提了 PR 解决了此问题,链接如下:


https://github.com/xetorthio/jedis/pull/1633


官方目前释放出了 2.10.0-m1 和 3.0.0-m1 中解决了此问题,但是由于不是 Release 版本使用还得注意。解决的办法为图 6,和图 2 对比可以发现图 6 对 Jedis 的实例化也进行了 try catch。



图 6

六、思考

Redis Cluster 由于使用去中心化思想 ,图 7 显示了 Redis Cluster 集群的状态,所以 Redis Cluster 中如果有部分节点异常就会导致整个集群异常。



图 7


那么问题来了多少节点异常会导致程序读写操作出现异常,下面我们也做了个简单的测试用于统计程序运行中,关闭 Redis 节点后程序的出错情况,以下测试表 1 仅供参考。


场景操作(多节点均同时操作)Redis写总量Redis读总量错误量总耗时(s)错误率
程序运行中关主(关任一主)10000010000030841000.031
关主(关任一主)10000010000014821020.015
关主(关任一主)100000100000305397.60.031
关从(关任一从)1000001000000109.20
关从(关任一从)100000100000090.10
关从(关任一从)100000100000088.90
主从一起关(关任一对)10000010000032613210.10.326
主从一起关(关任一对)10000010000029148169.80.291
主从一起关(关任一对)10000010000032410173.70.324
所有主全关100000100000100000353.41
所有从全关100000100000087.70
只留一台主100000100000100000357.11


表 1


从测试结果看,集群 Master 的选举过程是由 Master 参与选举的。


  1. 如果半数以上 Master 处于关闭状态那么整个集群处于不可用状态。

  2. 关闭任意一对主从节点会导致部分(大约为整个集群的 1/3)失败。

  3. 关闭任意一主,会导致部分写操作失败,是由于从节点不能执行写操作,在 Slave 升级为 Master 期间会有少量的失败。

  4. 关闭从节点对于整个集群没有影响。


2020-06-12 17:521413

评论

发布
暂无评论
发现更多内容

求职思维和招聘思维

老张

面试 求职 求职技巧

用数据,简单点!奇点云2024 StartDT Day数智科技大会,直播见

先锋IT

行云堡垒-跨界融合,三大认证新高度!

行云管家

兼容 行云堡垒

江苏泰州具有资质等保公司叫什么?在哪里?

行云管家

等保 等级保护 等保测评 泰州

精彩回顾|“AI+Security”之大模型&网络空间安全前沿探索

云起无垠

软件测试性能面试题丨简述 JMeter 聚合报告—霍格沃兹测试开发学社

测试人

软件测试 性能测试

Databend 倒排索引的设计与实现

Databend

倒排索引

智能LED显示屏能否进军电影行业?

Dylan

LED显示屏 led显示屏厂家 户内led显示屏

一文教你基于LangChain和ChatGLM3搭建本地知识库问答

华为云开发者联盟

人工智能 华为云 华为云ModelArts 华为云开发者联盟 企业号2024年5月PK榜

自主 AI Agent 的构建|Function Calling 技术实例探索

Baihai IDP

程序员 AI 智能体 企业号 5 月 PK 榜 LLMs

Crabc在交通领域中的实践与应用

Crabc低代码平台

低代码 数字化

GPT-4 Turbo 与 GPT-4 有什么区别?

蓉蓉

openai GPT-4 GPT-4 Turbo

CQ 社区版 2.12.3 | 任务中心、访问申请、数据变更等多个模块大改版!

BinTools图尔兹

sql 数据库管理 数据脱敏 用户提权 数据变更

我们小公司,哪像华为一样,用得上IPD(集成产品开发)?

IPD产品研发管理

华为 产品 项目管理 产品研发

GQL图查询语言:高效处理复杂图数据

悦数图数据库

图数据库

拼多多API实时数据接口:关键词搜索拼多多商品列表数据接口丨拼多多商品列表数据接口

tbapi

拼多多 拼多多商品列表数据接口

DDD领域驱动设计理论|得物技术

得物技术

架构 DDD 领域驱动设计DDD 领域模型 企业号 2024年5月 PK 榜

【FAQ】HarmonyOS SDK 闭源开放能力 —Account Kit(2)

HarmonyOS SDK

HarmonyOS

14个Flink SQL性能优化实践分享

华为云开发者联盟

sql flink 华为云 华为云开发者联盟 企业号2024年5月PK榜

智能推荐系统有哪些特点?

悦数图数据库

Redis Cluster 宕机引发的事故_文化 & 方法_技术琐话_InfoQ精选文章