问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Ceph分布式存储是怎么防止脑裂的?

发布网友 发布时间:2022-04-22 03:30

我来回答

1个回答

热心网友 时间:2023-05-07 13:26

"split brain"原本是指医学中的“ 裂脑综合征 ”,即连接大脑左右半球的胼胝体受损到一定程度后发生的症状。左右脑分离后,会分别处理知觉、形成概念和对刺激产生反应,相当于有两个脑在一个身体运作,会造成患者行为的冲突。例如:

split brain这个词也被计算机科学引入,指 采用主从(master-slave)架构的分布式系统中,出现了多个活动的主节点的情况 。但正常情况下,集群中应该只有一个活动主节点。

造成脑裂的原因主要是 网络分区 (这个词之前在 讲CAP理论 时就已经出现过了)。由于网络故障或者集群节点之间的通信链路有问题,导致原本的一个集群被物理分割成为两个甚至多个小的、独立运作的集群,这些小集群各自会选举出自己的主节点,并同时对外提供服务。网络分区恢复后,这些小集群再度合并为一个集群,就出现了多个活动的主节点。

另外,主节点 假死 也有可能造成脑裂。由于当前主节点暂时无响应(如负载过高、频繁GC等)导致其向其他节点发送心跳信号不及时,其他节点认为它已经宕机,就触发主节点的重新选举。新的主节点选举出来后,假死的主节点又复活,就出现了两个主节点。

脑裂的危害非常大,会破坏集群数据和对外服务的一致性,所以在各分布式系统的设计中,都会千方百计地避免产生脑裂。下面举两个例子说说。

一般有以下三种思路来避免脑裂:

Quorum一词的含义是“法定人数”,在ZooKeeper的环境中,指的是ZK集群 能够正常对外提供服务所需要的最少有效节点数 。也就是说,如果n个节点的ZK集群有少于m个节点是up的,那么整个集群就down了。m就是所谓Quorum size,并且:

为什么是这个数呢?

考虑一个n = 5的ZK集群,并且它按3:2分布在两个机房中。

假设m = 2(即n / 2),当两个机房之间的网络中断时,Server 1~3和Server 4~5将分别形成独立的集群,并且都能对外提供服务——也就意味着都能重新选举出各自的Leader,即产生了脑裂。当网络恢复,两个集群合并时,它们的数据就会不一致。

但是,若m = 3(即n / 2 + 1),那么网络中断后,DC2上的两个节点不满足Quorum要求的数量,故只有DC1上的三个节点能选举出Leader并提供服务,DC2上的两个节点不能提供服务,当然也就不会破坏数据一致性了。

由上可知,ZK的Quorum机制其实就是要求集群中 过半 的节点是正常的,所以ZK集群包含奇数个节点比偶数个节点要更好。显然,如果集群有6个节点的话,Quorum size是4,即能够容忍2个节点失败,而5个节点的集群同样能容忍2个节点失败,所以可靠性是相同的。偶数节点还需要额外多管理一个节点,不划算。

上面说的是网络分区的情况,如果是Leader假死呢?

之前某篇文章中其实说过了,集群每次选举出一个Leader时,都会自增纪元值(epoch),也就是Leader的代数。所以,就算原来的Leader复活,它的纪元值已经小于新选举出来的现任Leader的纪元值,Follower就会拒绝所有旧Leader发来的请求,所以不会产生脑裂。当然,有一部分Follower可能对新选举出的Leader没有感知,但由于上述Quorum机制的保证,这部分肯定不会占多数,故集群能够正常运转。除ZK外,Kafka集群的Controller也是靠纪元值防止脑裂的。

下面先贴出HDFS高可用的官方经典架构图。

HDFS NameNode高可用需要两个NN节点,一个处于活动状态,另一个处于热备状态,由ZKFailoverController组件借助外部ZK集群提供主备切换支持。

当活动NN假死时,ZK集群长时间收不到心跳信号,就会触发热备NN提升为活动NN,之前的NN复活就造成脑裂。如何解决呢?答案就是隔离,即 将原来那个假死又复活的NN*起来 (就像用篱笆围起来一样), 使其无法对外提供服务 。具体来讲涉及到三方面。

为了实现Fencing,成为活动NN的节点会在ZK中创建一个路径为 /hadoop-ha/${dfs.nameservices}/ActiveBreadCrumb 的持久znode。当正常发生主备切换时,ZK Session正常关闭的同时会一起删除上述znode。但是,如果NN假死,ZK Session异常关闭, /hadoop-ha/${dfs.nameservices}/ActiveBreadCrumb 这个znode就会残留下来。由热备升格为活动的NN会检测到这个节点,并执行Fencing逻辑:

只有Fencing执行完毕之后,新的NN才会真正转换成活动状态并提供服务,所以能够避免脑裂。

最后废话一句,JournalNode集群区分新旧NN同样是靠纪元值,而它的可用性也是靠Quorum机制——即如果JournalNode集群有2N + 1个节点的话,最多可以容忍N个节点失败。

冗余通信机制没有提到,其实就是在节点之间添加额外的心跳线,防止一个心跳路径断开导致误判。

帝都疫情开始反弹,还是老实在家待着吧。

民那周末快乐,晚安。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 月总结怎么写 销售月总结怎么写 个人简短 晒腊鱼怎么做 月度总结报告怎么写 腊鱼腌多久可以晒了吗 腊鱼晒干后怎么清洗 怎么保存呀??? 月底个人总结怎么写 腊鱼腌制要晒多久 月底总结怎么写 月总结怎么写 个人 腊鱼腌制好了需要洗吗 华为手机拍照显示时间和地点 腌腊鱼之前要不要把鱼洗干净 个人月会总结怎么写 淹腊鱼几天可以晒 月总结怎么写? 腌制的腊鱼怎么晒 腌腊鱼三天后需要洗后再晒吗 腊鱼腌制几天就可以晒? 华为手机拍照怎么在相片上显示时间地点 个人月度工作总结怎么写 本月个人总结怎么写? 如何基于 Ceph 构建高性能块存储服务 如何基于Ceph打造一款高可靠的块存储系统 如何配置ceph分布式存储方案 如何使用ceph 如何 单机 ceph 单机安装安装测试 ceph 对于服务器配置有要求吗 如何在CentOS 7.0上配置Ceph存储 如何配置Ceph对象存储作为KVM虚拟机外部存储 如何搭建ceph虚拟基础设施 windows环境 ceph为什么走容器 如何限制ceph-osd内存使用 如何在Ubuntu 16.04中安装Ceph存储集群 如何通俗的理解ceph中的osd 如何手动重启ceph各个节点的服务 如何恢复ceph的故障节点的硬盘上的数据 手机QQ上怎样设置隐藏专享特权,除了自己其他人都... ceph已有image怎么更改feature 如何学习开源项目及Ceph的浅析