Zookeeper集群的数据一致性问题


参考蚂蚁课堂

1.Zookeeper不同节点的作用?

首先介绍一下zk集群中的leader节点和follower节点都是干啥的。每个follower节点都保存了leader节点的副本数据,全局保证了数据一致性,分布式读写分开,写的请求统一交给Leader实现,Follower或者是ObServer节点主要实现读的操作。如果你连接的是Follower节点或者ObServer节点然后你还要写的话,他会把这个写的请求转发给Leader节点,然后leader节点写完之后同步给Follower或ObServer节点。

2.ZAB原子广播协议

ZAB原子广播协议会保证各个节点的数据同步问题,ZAB采用两种模式第一种是恢复模式,第二种是广播模式。恢复模式就是当Leader宕机了再从剩下的Follower节点中选举出新的Leader。广播模式:解决每个节点的数据同步的问题。

当我们向zk集群中的leader发出一个事务请求的时候,我们的leader节点就会创建一个全局的zxid,即为事务id。这个zxid一定是唯一的,就算同一时刻有多个Follower向Leader节点发出写的请求,那么也不会造成线程不安全问题,因为他底层也有一个类似于synchronized的同步机制就算同时有多个写请求,他也会保证只生成唯一的全局zxid。

然后我们可以查看一下这个zxid,先连接一下zk客户端,./zkCli.sh -server 192.168.247.3:2181,然后通过ls /查看一下这台服务器上面有几个节点,然后get /节点名称即可查看节点的zxid

在这里插入图片描述

cZxid:数据节点创建时的事务ID

ctime:数据节点创建时的时间

mZxid:数据节点最后一次更新时的事务ID

mtime:数据节点最后一次更新的时间

pZxid:数据节点的子节点列表最后一次被修改(是子节点列表变更,而不是子节点内容)时的shiwuID

cversion:子节点的版本号

dataVersion:数据节点的版本号

aclVsersion:数据节点的ACL版本号

ephemeralOwner:如果节点时临时节点,则表示创建该节点的会话的SessionID;如果节点时持久节点,则该属性值为0

dataLength:数据内容的长度

numChildren:数据节点当前的子节点个数

至于说实现各个节点的同步问题,底层采用2PC两阶段提交协议

在这里插入图片描述

如图所示第一阶段Leader会带着zxid询问Follower是否允许同步数据,然后Follower会回复Leader一个ack,如果这个时候半数以上的Follower节点的回复都说可以的话那么Leader就会有第二阶段的提交,在第二阶段的过程中就会同步数据。

那么为什么我们写的请求必须统一交给leader,而不是follower节点实现呢?如果Follower也可以写的话,那么实现数据的同步将变得相当复杂,每个节点上都会产生新的数据。所以zookeeper是借鉴了分布式事务的2pc两阶段提交,选择了Leader作为中间的协调者从而更加方便的实现数据的同步。

3.zk选举底层实现原理

这个原理很简单,首先比较zxid,zxid大的被选为leader,如果zxid相同那么则会比较myid,谁大谁是leader。如果有过半机制已经选举出了leader,那么之后启动加入的节点不会加入选举。那么为什么zxid大的会被选举为leader,那我们要来看一下这个zxid的作用,当向leader节点发出一个写的请求的时候,leader上就会生成一个全局zxid,然后在同步数据的过程中第一阶段提交会带上zxid询问follower是不是可以同步数据,如果收到了确认回复那么在第二阶段提交的过程中会同步数据同时也会修改Follower的zxid。当有下一次写的请求leader还会生成一个新的比之前大的zxid,所以zxid代表了当前节点数据的更新情况,zxid越大说明数据越新,zxid默认为0。举个例子比如说在一个集群当中有一个leader和两个follower记为f1,f2,他们的myid分别为2,1,3现在leader收到了写的请求此时zxid变为1,然后开始数据同步此时f1同步成功,他的zxid为1,然后在对f2进行数据同步的时候,f2发生宕机,这时候数据没有被同步,所以zxid仍为0,然后leader宕机,f2重启的情况下,虽然f2的myid要大于f1,但是由于f1的zxid大于f2的zxid,说明f1的数据是最新的所以f1会被选举为leader。

4.分布式情况下网络抖动脑裂概念

在这里插入图片描述

如图所示原来的集群有一个leader节点,有4个follower节点,由于网络原因后两个follower无法和原来的leader节点通信,皇上不管我们了,直接斩木为旗,揭竿而起,自立为王,自行选举一个新的leader和朝廷分庭抗礼。这种现象成为脑裂。

5.分布式的基本理论CAP

  • C:在分布式系统中的所有数据备份,在同一时刻必须要一致。
  • A:在集群中部分节点宕机之后,仍然能够保证服务可用。
  • P:分区容错 在分布式系统中网络分区存在的脑裂问题,部分Server与集群其他节点失去联系,无法组成一个群体。

我们在平时尽可能保证CP和AP,不能同时保证CA因为我们的服务器节点宕机之后,很难保证同一时刻同步问题。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Zookeeper的全局数据一致性是通过最终一致性模型来实现的。在这个模型中,当一个客户端更新了Zookeeper上的一个值时,其他客户端可能会读取到过期的值,导致数据的不一致性。这是因为Zookeeper并不是一个强一致性服务,而是一个最终一致性模型。\[1\] 然而,Zookeeper也提供了一种缩水版的顺序一致性实现。顺序一致性是指当一个数据被更新后,后续的读操作能够立即读取到更新后的值。在Zookeeper中,顺序一致性只针对单个操作和单个数据对象,属于CAP中的一致性范畴。但需要注意的是,Zookeeper的顺序一致性实现并不完全符合传统的顺序一致性定义。\[2\] 要实现Zookeeper的全局数据一致性,需要关注两个方面:数据同步和leader选举。数据同步是指Zookeeper集群中的数据在各个节点之间进行同步,确保数据一致性。而leader选举是指当Zookeeper集群中的leader节点挂掉时,如何进行新的leader选举,以保证集群的正常运行。只有在这两个方面都得到明确的处理,Zookeeper数据一致性才能得到保证。\[3\] #### 引用[.reference_title] - *1* *2* [关于Zookeeper中的一致性Zookeeper数据同步流程](https://blog.csdn.net/qq_34789780/article/details/120007742)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Zookeeper系列——5Zookeeper数据一致性分析](https://blog.csdn.net/Eclipse_2019/article/details/126418783)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

温JZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值