HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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:521199

评论

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

安全厂商长擎软件加入龙蜥社区,共建领先的 OS 基础设施

OpenAnolis小助手

操作系统 国产操作系统 龙蜥社区生态伙伴

全球首发!龙蜥社区助力 Intel SPR 加速器上云

OpenAnolis小助手

云原生 操作系统 envoy 龙蜥社区 Intel SPR

华为云FunctionGraph构建高可用系统的实践

华为云开发者联盟

华为云 华为云FunctionGraph 华为云开发者联盟 华为云Serverless 企业号2024年4月PK榜

合合信息Embedding模型获得MTEB中文榜单第一

陈橘又青

合合信息

AnyMP4 Data Recovery for Mac:高效数据恢复新

iMac小白

大模型微调提升AI应用性能

百度开发者中心

人工智能 大模型

《龙蜥理事说》第二期对话统信软件 AI 让操作系统更智能

OpenAnolis小助手

AI 操作系统 国产操作系统 龙蜥社区

4 月 30 日启动报名!2024 开源之夏&龙蜥社区赛题等你来挑战

OpenAnolis小助手

开源 操作系统 龙蜥社区 开源之夏

好消息!职场<火焰杯>测试开发大赛开始报名啦!

测试人

软件测试 自动化测试 测试开发

Aiseesoft Data Recovery for Mac:数据恢复软件

iMac小白

Tower for Mac v10.5(399)注册激活版

iMac小白

Tower下载 Tower mac版 Tower破解

灵魂画手有救了!字节开放模型 Hyper-SD,最快 1 步生成 SOTA 级图片(有demo 来试试

字节跳动开源

人工智能 视觉智能 开放应用模型 扩散模型

IPQ9574 router CUP + QCN9274 RF module - ensure the security of Wi-Fi connection

wifi6-yiyi

5G wifi router

软件测试如何选择最佳的自动化测试定位策略?

测试人

软件测试

基础设施SIG月度动态:社区官网上线《龙蜥理事说》专题页,内核门禁提速

OpenAnolis小助手

开源 操作系统 龙蜥社区 龙蜥社区SIG

DxO Nik Collection 6 (PS、LR滤镜插件套装) v6.10.0中文版

iMac小白

Xmind Pro专业版思维导图绘制软件

iMac小白

张朝阳对话华为Fellow陈海波:万物智联时代,鸿蒙如何实现“换道超车”?

最新动态

程序会自己抛出错误,干嘛还要写try catch?

高端章鱼哥

Go-Zero微服务快速入门和最佳实践(一)

王中阳Go

Go golang 分布式 微服务 go-zero

MAC系统进程管理工具 :MenuBar Stats for mac

iMac小白

时之鑫门窗|为什么选购门窗时推荐用十大品牌门窗

科技热闻

Syncovery for Mac:高效文件同步与备份工具

iMac小白

Syncovery下载 Syncovery破解版 Syncovery mac

MES系统功能有什么?对企业有什么价值?

万界星空科技

工业互联网 制造业 生产管理系统 mes 万界星空科技

microsoft remote desktop mac版10.9.6 远程桌面连接工具

iMac小白

浪潮信息联合龙蜥社区推出 InManageBoot:让开局交付变得如此简单!

OpenAnolis小助手

运维 操作系统 龙蜥社区 InManageBoot

助力用户快速学习、使用大模型,天翼云即将上线Llama 3大模型学习机

编程猫

Cornerstone for Mac(最好用的SVN管理工具)v4.2永久激活版

iMac小白

重回铁王座!时隔5年,Quill 2.0 终于发布啦!

OpenTiny社区

前端 富文本

荣获优秀共建方!开放原子开源大赛&龙蜥机密赛题决赛圆满结束

OpenAnolis小助手

操作系统 龙蜥社区 机密计算

Anolis OS 23.1 BETA 预览版:龙芯同源异构完成,支持更多芯片厂家

OpenAnolis小助手

开源 操作系统 龙蜥社区 龙蜥操作系统 Anolis OS

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