当前位置: 首页 > news >正文

Zookeeper脑裂解决方案

Zookeeper脑裂原因:

主要原因是Zookeeper集群和Zookeeper client判断超时并不能做到完全同步,也就是说可能一前一后,如果是集群先于client发现,那就会出现上面的情况。同时,在发现并切换后通知各个客户端也有先后快慢。一般出现这种情况的几率很小,需要leader节点与Zookeeper集群网络断开,但是与其他集群角色之间的网络没有问题,还要满足上面那些情况,但是一旦出现就会引起很严重的后果,数据不一致。

Zookeeper 脑裂解决方案:

要解决Split-Brain脑裂的问题,一般有下面几种种方法: Quorums (法定人数) 方式: 比如3个节点的集群,Quorums = 2, 也就是说集群可以容忍1个节点失效,这时候还能选举出1个lead,集群还可用。比如4个节点的集群,它的Quorums = 3,Quorums要超过3,相当于集群的容忍度还是1,如果2个节点失效,那么整个集群还是无效的。这是zookeeper防止"脑裂"默认采用的方法。

采用Redundant communications (冗余通信)方式:集群中采用多种通信方式,防止一种通信方式失效导致集群中的节点无法通信。

Fencing (共享资源) 方式:比如能看到共享资源就表示在集群中,能够获得共享资源的锁的就是Leader,看不到共享资源的,就不在集群中。

要想避免zookeeper"脑裂"情况其实也很简单,在follower节点切换的时候不在检查到老的leader节点出现问题后马上切换,而是在休眠一段足够的时间,确保老的leader已经获知变更并且做了相关的shutdown清理工作了然后再注册成为master就能避免这类问题了,这个休眠时间一般定义为与zookeeper定义的超时时间就够了,但是这段时间内系统可能是不可用的,但是相对于数据不一致的后果来说还是值得的。

1: zooKeeper默认采用了Quorums 这种方式来防止"脑裂"现象。即只有集群中超过半数节点投票才能选举出Leader。这样的方式可以确保leader的唯一性,要么选出唯一的一个leader,要么选举失败。在zookeeper中Quorums作用如下:

  • 集群中最少的节点数用来选举leader保证集群可用。
  • 通知客户端数据已经安全保存前集群中最少数量的节点数已经保存了该数据。一旦这些节点保存了该数据,客户端将被通知已经安全保存了,可以继续其他任务。而集群中剩余的节点将会最终也保存了该数据。

假设某个leader假死,其余的followers选举出了一个新的leader。这时,旧的leader复活并且仍然认为自己是leader,这个时候它向其他followers发出写请求也是会被拒绝的。因为每当新leader产生时,会生成一个epoch标号(标识当前属于那个leader的统治时期),这个epoch是递增的,followers如果确认了新的leader存在,知道其epoch,就会拒绝epoch小于现任leader epoch的所
有请求。那有没有follower不知道新的leader存在呢,有可能,但肯定不是大多数,否则新leader无法产生。Zookeeper的写也遵循quorum机制,因此,得不到大多数支持的写是无效的,旧leader即使各种认为自己是leader,依然没有什么作用。

zookeeper除了可以采用上面默认的Quorums方式来避免出现"脑裂",还可以可采用下面的预防措施:

2: 添加冗余的心跳线,例如双线条线,尽量减少“裂脑”发生机会。

3: 启用磁盘锁。 正在服务一方锁住共享磁盘,“裂脑"发生时,让对方完全"抢不走"共享磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动"解锁”,另一方就永远得不到共享磁盘。现实中假如服务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了"智能"锁。即正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁。平时就不上锁了。

4: 设置仲裁机制。 例如设置参考IP(如网关IP),当心跳线完全断开时,2个节点都各自ping一下 参考IP,不通则表明断点就出在本端,不仅"心跳"、还兼对外"服务"的本端网络链路断了,即使启动(或继续)应用服务也没有用了,那就主动放弃竞争,让能够ping通参考IP的一端去起服务。更保险一些,ping不通参考IP的一方干脆就自我重启,以彻底释放有可能还占用着的那些共享资源。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 面试题:MySQL 优化篇
  • 达梦备份与恢复
  • vue3中封装table表格
  • git提交代码时报错,提不了
  • 【Linux进阶之路】地址篇
  • Java集合体系面试题
  • 书生·浦语大模型-第三节课笔记/作业
  • ICLR24_OUT-OF-DISTRIBUTION DETECTION WITH NEGATIVE PROMPTS
  • Nextjs14 大优化!性能提升50%!
  • 【强化学习的数学原理-赵世钰】课程笔记(二)贝尔曼公式
  • 针孔相机、鱼眼相机、全景相机
  • 每天五分钟掌握深度学习框架pytorch:本专栏说明
  • 机器学习实战17-高斯朴素贝叶斯(GaussianNB)模型的实际应用,结合生活中的生动例子帮助大家理解
  • ts中的类型简介
  • 如何使用 Midjourney?2024年最新更新
  • Akka系列(七):Actor持久化之Akka persistence
  • CEF与代理
  • CSS盒模型深入
  • echarts的各种常用效果展示
  • emacs初体验
  • es6要点
  • extjs4学习之配置
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • java中的hashCode
  • JS实现简单的MVC模式开发小游戏
  • leetcode46 Permutation 排列组合
  • scala基础语法(二)
  • 编写高质量JavaScript代码之并发
  • 产品三维模型在线预览
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 新书推荐|Windows黑客编程技术详解
  • 智能合约开发环境搭建及Hello World合约
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​secrets --- 生成管理密码的安全随机数​
  • #565. 查找之大编号
  • #Linux(帮助手册)
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (笔试题)合法字符串
  • (回溯) LeetCode 131. 分割回文串
  • (论文阅读30/100)Convolutional Pose Machines
  • (十八)三元表达式和列表解析
  • (五)c52学习之旅-静态数码管
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)Linux下编译安装log4cxx
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)程序员技术练级攻略
  • ***详解账号泄露:全球约1亿用户已泄露
  • .dwp和.webpart的区别
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .Net CF下精确的计时器
  • .NET Framework与.NET Framework SDK有什么不同?