IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 记一次官方redis cluster集群和sentinel哨兵模式结合下的节点故障切换不了的排查过程 -> 正文阅读

[大数据]记一次官方redis cluster集群和sentinel哨兵模式结合下的节点故障切换不了的排查过程

环境:

redis cluster集群分别在三个ip上部署了9个节点(7001-7009),三个主节点六个从节点;节点中主从数据同步确保正常;再在三个ip上部署了sentinel26379,sentinel26380,sentinel26381三个哨兵;

客户端连接:

  1. 使用ServiceStack组件 + .NET CORE 6.0;使用的哨兵+卡槽计算方式创建连接(ServiceStack官网信息说不支持redis cluster集群分区模式连接,要用redis sentinel哨兵模式创建连接,如果要用redis cluster集群分区模式得客户端代码实现,过程比较复杂)。

?

?

  1. 备用方案csredis组件 + .NET CORE 6.0;支持redis cluster集群分区和redis sentinel哨兵模式创建连接。
  2. 备用方案StackExchange组件 + .NET CORE 6.0;支持redis cluster集群分区和redis sentinel哨兵模式创建连接。

故障现象:

一、在csredis组件下出现的故障现象

在测试用例高压状态下手动kill掉当前应用命中的主节点,在配置的主从切换时间内没有顺利切换成功。

下例截图是使用csredis组件进行分析(这组件可以在控制台直观的显示出节点的状态和切换情况

这个是在Redis Sentinel创建的连接

官网例子

?

?

我们的tcp应用

?

?

?

?

第一步先确认redis节点的状态

?

?

上图可以看出目前主节点是7001,7007,7008

第二步再确认sentinel哨兵的监控状态

?

?

上图可以看出哨兵监控到的主节点信息状态是正常的;

第三步启动tcp应用程序进行测试用例压测

?

?

上图看测试缓存各方面都是正常的;

第四步手动停掉7001主节点,继续进行测试用例压测

?

?

?

?

上图看到有10分钟左右csredis还是没能正常切换到其它从节点;

再到redis-cli客户查看一下哨兵的情况

?

?

发现sentinel哨兵是能正常选举切换到7004为主节点,这样就可以排除掉redis环境的部署问题,问题应该是出现在csredis组件的连接切换上;

?

?

这也近一步证明了自己的判断,csredis一直停留在故障节点,没有自动切换到下一点,这时去查看csredis源码

?

?

用csredis切换到redis cluster集群分区测试,得到的结果是一样的;然后再阿里云开发平台也发现同样的现象

?

?

而且csredis官方版本对redis cluster集群连接说明描述很有限

?

?

再压测过程还发现一个情况,就是在节点服务不是人为主动停止,而是哨兵主观下线(非真的挂)情况下,节点间的切换是正常的;如下图:

?

?

  • 在ServiceStack组件下的故障现象

多方查找资料下发现ServiceStack对官方的redis cluster集群支持比较复杂,所以这里故障只在sentinel哨兵模式下验证;

第一步:配置好哨兵节点和对应的卡槽实例名称

?

?

并在连接创建类添加窗体输出,方便查看节点的切换情况

?

?

第二步:重复csredis压测步骤,确认哨兵和集群节点之间的状态

?

?

?

第三步:在确保redis集群状态正常的情况下启动tcp进行测试用例压测

在节点都正常的情况下,顺利注册完成,下面先记录一下注册用时

?

?

同时通过上面说的的窗体输出节点信息,发现在每个redis读写操作过程就会计算一遍key值所在的卡槽位置(也就是主从节点分布在3个ip端就计算一遍)(现不确定这里是否会有性能方面的问题

?

?

第四步:停掉一个当前主节点试试看

?

?

?

?

注册工具也卡住不动了;

?

?

第五步:这是同样用redis-cli客户端工具去查看节点集群情况和哨兵的监控情况;

可以看到7004由原来的主节点变成了从节点,并且是fail故障状态;7006接替了7004变成了主

?

?

哨兵状态监测到也是新的7006为主节点

?

?

这样就验证了我之前的猜想,是ServiceStack客户端不能根据故障自动识别到下一个别重新选举出的主节点

这时再手动启动被关掉的7004节点(但因为测试工具交长时间注册不上不能自动恢复注册)

这里还发现了一下现象,在手动关闭掉主节点后,ServiceStack会出现线程阻塞,进而报I/O异常,注册进行不下去;

?

?

在csredis和ServiceStack的故障对比下,总结出以下几点:

  1. 两个组件在手动停掉当前节点后,都没有正常的切换到下个哨兵选举出的主节点;
  2. csredis在手动停掉当前节点后,注册可以继续往下进行,servicestack则不能顺利进行注册;分析看来csredis在线程释放比servicestack好,servicestack会出现阻塞并出现I/O异常
  3. 在手动恢复停掉的节点后,而且在tcp应用程序不重启的情况下,csredis能马上恢复正常,redis读写不再报错,注册速度也起来了;而servicestack不能顺利恢复,而且还因为阻塞导致测试工具崩掉;

  • StackExchange组件下的故障现象

再切换到StackExchange进行以上步骤进行对比

第一步:先用哨兵模式进行创建连接

?

?

?

?

第二步:确认集群节点和哨兵监控状态

?

?

第三步:在确保redis集群状态正常的情况下启动tcp进行测试用例压测

在节点都正常的情况下,哨兵模式出现以下错误,导致注册不能顺利完成;测试了多次还是这样,那就跳过这个模式直接上redis cluster集群模式

?

?

第四步:直接上redis cluster集群模式

?

?

在官方的集群模式下虽然有小部分redis读写错误;但没有出现上面的异常,可以7500个连接顺利注册完

?

?

?

?

第五步:停掉一个当前主节点试试看

?

?

从下图可以看出在当前7001节点停止后,出现了短暂的异常日志,但错误日志很快就停了,注册也接顺利注册完成,这里控制台虽然没有体现出节点的切换情况,但从日志和注册情况下分析,节点故障是能顺利转移了

?

?

?

接下来看看集群节点和哨兵的状态

可以看到哨兵的也成功的选举出了7006作为主节点,7006在集群中也替换了7001成为了主节点

?

?

得出结果是StackExchange 在redis cluster集群模式下的故障转移是正常的,和redis集群环境是的故障转移是匹配上了。

在csredis和StackExchange 的故障对比下(上面已经对比过servicestack,这里就不再去对比了),总结出以下几点:

1、csredis组件在手动停掉当前节点后,没有正常的切换到下个哨兵选举出的主节点;StackExchange 在哨兵模式下也是有问题,但在redis cluster集群模式下可以顺利转移故障;

2、csredis在手动停掉当前节点后,注册可以继续往下进行,但节点一直在恢复状态,redis读写错误日志也在不停的记录,而StackExchange 只出现了短暂的redis读写错误,注册也能马上恢复,顺利的注册完成;

  1. 在手动恢复停掉的节点后,而且在tcp应用程序不重启的情况下,csredis能马上恢复正常,redis读写不再报错,注册速度也起来了;而StackExchange 不管是在节点停掉是否恢复的状态下,都对注册过程影响不大;

最终选择的方案

经过以上几天的反复测试、验证,个人觉得选择StackExchange +redis cluster集群模式在故障转移高可用方面比较合适;至于长时间的稳定性,还要看测试组同事的任务压测才能体现。

理由:

  1. 在不用重做或者改变原有的redis集群环境下,可以通过很少改动就可以切换到StackExchange 组件,或者在老系统不做任何改动的情况下,新系统用StackExchange 也可以兼容;
  2. 从微软NET CORE官方也推荐使用StackExchange 和官方的redis cluster集群模式
  3. StackExchange 免费开源
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-30 18:32:03  更:2022-03-30 18:34:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:55:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码