iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Redis Cluster 宕机引发的事故
  • 371
分享到

Redis Cluster 宕机引发的事故

2024-04-02 19:04:59 371人浏览 八月长安
摘要

导读:Redis官方号称支持并发11万读操作,并发8万写操作。由于优异的性能和方便的操作,相信很多人都在项目中都使用了Redis,为了不让应用过分的依赖 Redis服务,Redis的作用只作为提升应用并发和

Redis Cluster 宕机引发的事故

导读:

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 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为程序异常信息。

Redis Cluster 宕机引发的事故 图1异常很明显抛出的是连接异常

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

Redis Cluster 宕机引发的事故

图2

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

Redis Cluster 宕机引发的事故

图3


Redis Cluster 宕机引发的事故

图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输出顺序是什么。

Redis Cluster 宕机引发的事故

图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。

Redis Cluster 宕机引发的事故

图6

六、思考

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


Redis Cluster 宕机引发的事故

图7


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

场景

操作(多节点均同时操作)

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

表1

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

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

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

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

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

您可能感兴趣的文档:

--结束END--

本文标题: Redis Cluster 宕机引发的事故

本文链接: https://www.lsjlt.com/news/47420.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Redis Cluster 宕机引发的事故
    导读:Redis官方号称支持并发11万读操作,并发8万写操作。由于优异的性能和方便的操作,相信很多人都在项目中都使用了Redis,为了不让应用过分的依赖 Redis服务,Redis的作用只作为提升应用并发和...
    99+
    2024-04-02
  • 记一次 Redis Cluster 宕机引发的事故
    导读:Redis官方号称支持并发11万读操作,并发8万写操作。由于优异的性能和方便的操作,相信很多人都在项目中都使用了Redis,为了不让应用过分的依赖 Redis服务,Redis的作用只作为提升应用并发和...
    99+
    2024-04-02
  • 解决redis宕机的问题
    这篇文章给大家分享的是有关解决redis宕机的问题的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。我们都知道 Redis 的数据全部在内存里,如果突然宕机,数据就会全部丢失,那应该...
    99+
    2024-04-02
  • MongoDB一次节点宕机引发的思考是怎样的
    本篇文章为大家展示了MongoDB一次节点宕机引发的思考是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。简介最近一个 MongoDB 集群环境中的某节点异常下...
    99+
    2024-04-02
  • 如何解决高并发服务遇redis瓶颈引发time-wait事故
    这篇文章主要讲解了“如何解决高并发服务遇redis瓶颈引发time-wait事故”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何解决高并发服务遇redis...
    99+
    2024-04-02
  • redis中宕机指的是什么意思
    小编给大家分享一下redis中宕机指的是什么意思,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!宕机是计算机术语,口语里面我们简单...
    99+
    2024-04-02
  • redis宕机数据恢复的方法是什么
    Redis宕机后可以通过以下方法恢复数据: 重新启动Redis服务:首先尝试重启Redis服务,看是否能够恢复数据。如果Redi...
    99+
    2024-04-09
    redis
  • Java求余%操作引发的一连串故事
    操作符%通常用在正整数上,但同样可以用在负整数和浮点数上。   注意:只有当被除数是负数时, 余数才是负的。 C1 RCE对%的处理 HotSpot VM的C1有个RCE(Range...
    99+
    2024-04-02
  • go语言中http超时引发的事故解决
    前言 我们使用的是golang标准库的http client,对于一些http请求,我们在处理的时候,会考虑加上超时时间,防止http请求一直在请求,导致业务长时间阻塞等待。 最近...
    99+
    2024-04-02
  • RedHat7.2的RemoveIPC设置主yes引起rac宕机该怎么办
    今天就跟大家聊聊有关RedHat7.2的RemoveIPC设置主yes引起rac宕机该怎么办,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 最近准...
    99+
    2024-04-02
  • 如何解决JVMFullGC引发严重线上事故的问题
    今天就跟大家聊聊有关如何解决JVMFullGC引发严重线上事故的问题,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、业务场景介绍先简单说说线上生产系统的一个背景,因为仅仅是文章作为...
    99+
    2023-06-03
  • 拒绝服务器宕机!必知的故障排除秘诀
    服务器宕机是一个令人头疼的问题,因为它会导致网站或应用程序无法访问,从而导致业务损失和客户不满。为了避免此类情况,了解故障排除技术至关重要。本文将提供一些必知的秘诀,以帮助您快速识别和修复服务器问题。 初步故障排除步骤 检查基本连接:确...
    99+
    2024-03-03
    服务器故障排除、服务器宕机、诊断工具
  • 亚马逊服务器宕机:一场灾难性的故障
    1. 事件概述 2021年11月25日,亚马逊AWS(Amazon Web Services)的服务器出现了故障,导致全球范围内的网站和应用程序无法正常运行。这场灾难性的故障持续了数小时,影响了数百万用户和企业。 2. 故障原因 据亚马逊...
    99+
    2023-10-27
    亚马逊 灾难性 故障
  • Redis中一个String类型引发的惨案
    ​ 曾经看到这么一个案例,有一个团队需要开发一个图片存储系统,要求这个系统能快速记录图片ID和图片存储对象ID,同时还需要能够根据图片的ID快速找到图片存储对象ID。我们...
    99+
    2024-04-02
  • 云服务器宕机:亚马逊的故障和应对措施
    1. 亚马逊云服务器的重要性 亚马逊是全球最大的云计算服务提供商之一,其云服务器(Amazon EC2)是许多企业和个人的首选。云服务器的可靠性和稳定性对于用户来说至关重要,因为它们托管了用户的应用程序、数据和服务。 2. 亚马逊云服务器...
    99+
    2023-10-27
    亚马逊 应对措施 故障
  • mysql中索引,触发器,事务,存储引擎的理解
    1、索引:作用于表中的某列,并将其进行排序,有助于快速地进行查询。   索引是对数据库表中一个或多个列的值进行排序的数据结构,是用于提高在数据库表中访问数据的速度的数据库对象。...
    99+
    2024-04-02
  • ORA-00130 引发的故障是怎样的
    本篇文章为大家展示了ORA-00130 引发的故障是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 1.登录系统检查服务  &nb...
    99+
    2024-04-02
  • MySQL中Spring管理的事务开启后不提交引起的事故
    1. 前言 了解到一个事故,在MySQL数据库中,使用Spring管理的事务在开启以后没有在操作结束时提交或回滚,使得原有线程在后续执行数据库操作时可能继续使用原有事务,且不会提交,导致对数据库的修改...
    99+
    2023-09-03
    spring mysql java
  • 技术人生系列 · 我和数据中心的故事(第十一期)- 一次启停引发的故障
               春风轻轻吹走了冬日里的寒气,又到了一年最美的花季,伴随着温暖的阳光 老K 再次与大家相...
    99+
    2024-04-02
  • 事务注解(@Transactional)引起的数据覆盖故障
    最近组织团队内技术培训,刘聪为分享的一个跟事务和写数据库相关的case(bug)很有代表性。用事务,要小心!一、故障现象车辆交付履约流程上两个节点(工程项目)A和B, A修改一条数据记录item(工单),然...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作