【Redis集群专题】「集群技术三部曲」分析一下相关的Redis集群模式下的脑裂问题(问题篇)

news2024/11/25 2:19:42

技术格言

世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。

什么是脑裂

字面含义

首先,脑裂从字面上理解就是脑袋裂开了,就是思想分家了,就是有了两个山头,就是有了两个主思想。

技术定义

在高可用集群中,当两台高可用服务器在指定的时间内,由于网络的原因无法互相检测到对方心跳而各自启动故障转移功能,取得了资源以及服务的所有权,而此时的两台高可用服务器对都还活着并作正常运行,这样就会导致同一个服务在两端同时启动而发生冲突的严重问题,最严重的就是两台主机同时占用一个VIP的地址(类似双端导入概念),当用户写入数据的时候可能会分别写入到两端,这样可能会导致服务器两端的数据不一致或造成数据的丢失,这种情况就称为裂脑,也有的人称之为分区集群或者大脑垂直分隔,互相接管对方的资源,出现多个Master的情况,称为脑裂。

脑裂导致的问题

引起数据的不完整性:在集群节点出现脑裂的时候,如果外部无法判断哪个为主节点,脑裂的集群都可以正常访问的时候,这时候就会出现数据不完整的可能性。

  • 服务异常:对外提供服务出现异常。

导致裂脑发生的原因

优先考虑心跳线路上的问题,在可能是心跳服务,软件层面的问题

  • 1)高可用服务器对之间心跳线路故障,导致无法正常的通信。原因比如:

    • 1——心跳线本身就坏了(包括断了,老化);

    • 2——网卡以及相关驱动坏了,IP配置及冲突问题;

    • 3——心跳线间连接的设备故障(交换机的故障或者是网卡的故障);

    • 4——仲裁的服务器出现问题。

  • 2)高可用服务器对上开启了防火墙阻挡了心跳消息的传输;

  • 3)高可用服务器对上的心跳网卡地址等信息配置的不正确,导致发送心跳失败;

  • 4)其他服务配置不当等原因,如心跳的方式不同,心跳广播冲突,软件出现了BUG等。

解决脑裂所出现的问题

  • 添加冗余的心跳线,尽量减少“脑裂”的机会

  • 启用磁盘锁:在发生脑裂的时候可以协调控制对资源的访问设置仲裁机制

实际的生产环境中,我们可以从以下几个方面来防止裂脑的发生:

  • 1)同时使用串行电缆和以太网电缆连接,同时用两条心跳线路,这样一条线路坏了,另一个线路还是好的,依然能传送消息(推荐的)

  • 2)检测到裂脑的时候强行的关闭一个心跳节点(需要特殊的节点支持,如stonith,fence),相当于程序上备节点发现心跳线故障,发送关机命令到主节点。

  • 3)多节点集群中,可以通过增加仲裁的机制,确定谁该获得资源,这里面有几个参考的思路:

    1——增加一个仲裁机制。例如设置参考的IP,当心跳完全断开的时候,2个节点各自都ping一下参考的IP,不同则表明断点就出现在本段,这样就主动放弃竞争,让能够ping通参考IP的一端去接管服务。

    2——通过第三方软件仲裁谁该获得资源,这个在阿里有类似的软件应用

  • 4)做好对裂脑的监控报警(如邮件以及手机短信等),在问题发生的时候能够人为的介入到仲裁,降低损失。当然,在实施高可用方案的时候,要根据业务的实际需求确定是否能够容忍这样的损失。对于一般的网站业务,这个损失是可控的(公司使用)

  • 5)启用磁盘锁。正在服务一方锁住共享磁盘,脑裂发生的时候,让对方完全抢不走共享的磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的乙方不主动解锁,另一方就永远得不到共享磁盘。现实中介入服务节点突然死机或者崩溃,另一方就永远不可能执行解锁命令。后备节点也就截关不了共享的资源和应用服务。于是有人在HA中涉及了“智能”锁,正在服务的一方只在发现心跳线全部断开时才启用磁盘锁,平时就不上锁了

什么是redis脑裂?

如果在redis中,形式上就是有了两个master,记住两个master才是脑裂的前提。

哨兵(sentinel)模式下的脑裂

1个master与3个slave组成的哨兵模式(哨兵独立部署于其它机器),刚开始时,2个应用服务器server1、server2都连接在master上,如果master与slave及哨兵之间的网络发生故障,但是哨兵与slave之间通讯正常,这时3个slave其中1个经过哨兵投票后,提升为新master,如果恰好此时server1仍然连接的是旧的master,而server2连接到了新的master上。

数据就不一致了,基于setNX指令的分布式锁,可能会拿到相同的锁;基于incr生成的全局唯一id,也可能出现重复。

集群(cluster)模式下的脑裂

cluster模式下,这种情况要更复杂,例如集群中有6组分片,每给分片节点都有1主1从,如果出现网络分区时,各种节点之间的分区组合都有可能。

手动解决问题

在正常情况下,如果master挂了,那么写入就会失败,如果是手动解决,那么人为会检测master以及slave的网络状况,然后视情况,如果是master挂了,重启master,如果是master与slave之间的连接断了,可以调试网络,这样虽然麻烦,但是是可以保证只有一个master的,所以只要认真负责,不会出现脑裂。

自动解决问题

Redis中有一个哨兵机制,哨兵机制的作用就是通过redis哨兵来检测redis服务的状态,如果一旦发现master挂了,就在slave中选举新的master节点以实现故障自动转移。

问题,就出现在这个自动故障转移上,如果是哨兵和slave同时与master断了联系,即哨兵可以监测到slave,但是监测不到master,而master虽然连接不上slave和哨兵,但是还是在正常运行,这样如果哨兵因为监测不到master,认为它挂了,会在slave中选举新的master,而有一部分应用仍然与旧的master交互。当旧的master与新的master重新建立连接,旧的master会同步新的master中的数据,而旧的master中的数据就会丢失。所以我认为redis脑裂就是自动故障转移造成的。

总结梳理解决方案

如何解决脑裂?

设置每个master限制slave的数量

redis的配置文件中,存在两个参数

min-slaves-to-write 3
min-slaves-max-lag 10
  • 第一个参数表示连接到master的最少slave数量
  • 第二个参数表示slave连接到master的最大延迟时间

按照上面的配置,要求至少3个slave节点,且数据复制和同步的延迟不能超过10秒,否则的话master就会拒绝写请求,配置了这两个参数之后,如果发生集群脑裂,原先的master节点接收到客户端的写入请求会拒绝,就可以减少数据同步之后的数据丢失。

注意:较新版本的redis.conf文件中的参数变成了

min-replicas-to-write 3
min-replicas-max-lag 10

redis中的异步复制情况下的数据丢失问题也能使用这两个参数

总结

官方文档所言,redis并不能保证强一致性(Redis Cluster is not able to guarantee strong consistency. / In general Redis + Sentinel as a whole are a an eventually consistent system) 对于要求强一致性的应用,更应该倾向于相信RDBMS(传统关系型数据库)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/101095.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑调用 iPhone 摄像头全过程(iVCam)

最近不是停课不停学吗,令人“深恶痛绝”的钉钉又进入了我们学生的生活。但是初中的网课相比小学的又增加了一个要求:全程摄像头拍摄。但是,我这笔记本没有摄像头啊!突然想起来好像手机的摄像头可以给电脑调用。话不多说&#xff0…

3D数学基础 学习笔记

左手坐标系:DX、3DMax 右手坐标系:OpenGL 世界坐标系、物体坐标系、摄像机坐标系 向量和点在数学上是等价的,向量是有大小和方向的有向线段,向量没有位置,只有大小和方向 向量运算: 零向量:…

【看源码】@Cacheable和@CacheEvict的原理, 批量key过期失效的原因分析

Cacheable和CacheEvict的坑, 批量key过期失效的原因分析前言测试代码源码put缓存时最终key的产生看不同情况下, 是否能匹配Evict过期缓存1. 没有入参没有指定key的情况2. 有入参的情况3. 配置了allEntries的情况总结补充前言 最近发现自己搭的一个项目返回的数据不太准确, 第一…

网工Python之路——Netmiko模块实验(思科)

小白网工的python之路 「Python 网络自动化」Netmiko 实验环境 我的实验环境是GNS3搭建拓扑图,用云桥接到在VMware Workstation 16运行的CentOS 7, CentOS 7上搭建好了python3.8, 所有交换机已经预配好了SSH服务,ssh登录账号为python&…

paddle

paddle预测库 git config --global http.postBuffer 1048576000 git clone --recursive https://github.com/PaddlePaddle/Paddle.git 修改CMakeLists.txt mkdir build cd buildcmake -DWITH_CONTRIBOFF -DWITH_MKLOFF -DWITH_MKLDNNOFF -DWITH_TESTINGOFF -DCMAKE_BUILD_TY…

DBCO-PEG-Ferrocene,Ferrocene-PEG-DBCO,DBCO偶联修饰二茂铁

DBCO-PEG-Ferrocene ,Ferrocene-PEG-DBCO,二苯并环辛炔-聚乙二醇-二茂铁,DBCO偶联修饰二茂铁产品规格: 1.CAS号:N/A 2.分子量MV:1000、2000、3400、5000、10000、20000等可按需进行定制 3.包装规格&#xf…

数据结构与算法_空间复杂度

同时间复杂度一样,空间复杂度也是数学的函数表达式。 空间复杂度不是程序占用了多少 bytes的空间,因为这个也没太大意义,所以空间复杂度算的是运行的过程中临时的、额外的变量的个数。 空间复杂度计算规则基本跟实践 复杂度类似&#xff0c…

Flutter For App——一个简单的豆瓣APP

一个简单的豆瓣APP效果视频功能简述功能第三方库接口简述底部导航栏效果图实现初始化BottomNavigationBarItembottomNavigationBar切换页面导致bottomNavigationBar子页面重绘Top250榜单效果图实现Widget树FutureBuilder异常ListView上拉加载电影详情效果图实现高斯模糊网络数据…

设计模式原则 - 单一职责原则(一)

单一职责原则一 官方定义基本介绍二 案例演示普通方式实现解决方案解决方案一解决方案案例分析解决方案二解决方案案例分析案例总结三 注意事项&细节四 如何遵守单一职责原则?一 官方定义 单一职责原则(Single Responsibility Principle, SRP&#x…

用Spark写入Mysql的特别注意事项

相信有部分刚入门的小伙伴对于spark写入Mysql的过程不太熟悉。特意写一篇文章讲一下这个注意事项,以免“上大当” 我们先看一个小伙伴写的一段spark写入mysql的代码 public static void trans(SparkSession spark,String pro_table, String pro_url, String pro_dr…

微服务框架 SpringCloud微服务架构 服务异步通讯 52 惰性队列 52.1 消息堆积问题

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 服务异步通讯 文章目录微服务框架服务异步通讯52 惰性队列52.1 消息堆积问题52.1.1 消息堆积问题52 惰性队列 52.1 消息堆积问题 52.1.1 消…

11基于主从博弈理论的共享储能与综合能源微网优化运行研究(MATLAB程序)

参考文献: 基于主从博弈理论的共享储能与综合能源微网优化运行研究——帅轩越(2022电网技术) 主要内容; 代码主要做的是基于主从博弈理论的共享储能与综合能源微网优化运行研究,首先介绍了系统运行框架,分析了系统内…

一文了解各种高精度室内定位技术

在消费需求和创新技术驱动下,可穿戴设备和物联网产品的发展驶入了快车道,GNSS定位功能在无人驾驶、智能设备、资产追踪等日趋智能化中广泛应用,而随着万物互联时代的到临,物联网技术围绕人员、资产的室内位置服务需求也愈加强烈。…

vue使用

目录 路由History模式打包页面空白 项目放根目录 -- 配置 项目放二级目录 -- 配置 路由History模式打包页面空白 项目放根目录 -- 配置 router > index.js 修改 base const router new VueRouter({mode: history,// base: process.env.BASE_URL,base: /,routes, }) ngi…

【Redis集群专题】「集群技术三部曲」介绍一下常用的Redis集群机制方案的原理和指南(入门篇)

集群化的方案 Redis的Sentinel解决了主从复制故障不能自动迁移的问题,但是主节点的写性能和存储能力依然是受到了Redis单机容量有限的限制,所以使用Redis集群去解决这个问题,将Redis的数据根据一定的规则分配到多台机器。 Redis集群方案 R…

【git】

目录第一章 简介 1.1 版本控制 1.1.1 本地版本控制1.1.2 集中式版本控制1.1.3 分布式版本控制 第二章 基础篇 2.1 下载代码 2.2 更新代码 2.2.1 清空本地未被跟踪内容2.2.2更新代码使之与库上同步 2.3 修改 2.3.1 Vim2.3.2 Sed2.3.3 Awk 2.4 查看状态 2.5 保存代…

通俗易懂的java设计模式(3)-观察者设计模式

什么是观察者设计模式 观察者模式主要应用在对象存在一对多关系的情况下,那么如果一个对象,依赖于另一个对象,那个被依赖的对象一旦被修改,依赖于他的那个对象也会被观察者所告知。 观察者模式又被称作为发布-订阅模式&#xff0c…

2022 UUCTF

目录 <1> Web (1) websign(禁用js绕过) (2) ez_rce(?>闭合 rce) (3) ez_unser(引用传递) (4) ez_upload(apache后缀解析漏洞) (5) ezsql(union注入) (6) funmd5(代码审计 %0a绕过preg_replace) (7) phonecode(伪随机数漏洞) (8) ezpop(反序列化字符串逃逸) …

[附源码]Nodejs计算机毕业设计教师业绩考核和职称评审系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

[附源码]Nodejs计算机毕业设计教务管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…