【ZooKeeper高手实战】ZAB协议:ZooKeeper分布式一致性的基石

这篇具有很好参考价值的文章主要介绍了【ZooKeeper高手实战】ZAB协议:ZooKeeper分布式一致性的基石。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🌈🌈🌈🌈🌈🌈🌈🌈
欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术 的推送
发送 资料 可领取 深入理解 Redis 系列文章结合电商场景讲解 Redis 使用场景中间件系列笔记编程高频电子书
文章导读地址:点击查看文章导读!
🍁🍁🍁🍁🍁🍁🍁🍁
【ZooKeeper高手实战】ZAB协议:ZooKeeper分布式一致性的基石,Zookeeper,分布式,zookeeper,java

ZooKeeper 中的分布式一致性协议 ZAB

zk 使用了 ZAB( ZooKeeper Atomic Broadcast) 分布式一致性协议来保证在分布式系统中的所有节点可以 保证数据一致性

下边将从具体的功能出发,来介绍 ZAB 协议的原理

ZAB 协议如何实现主从同步机制?

在 zk 集群中,只有 Leader 可以接收写操作,Follower 只可以读,Leader 收到写的事务请求后,会香所有的 Follower 发送一个 事务操作的提议,也就是 Proposal,当 Follower 收到 Proposal 之后,会先将数据的变更写入到磁盘的日志文件中,表示已经收到了 Proposal,之后会返回 Ack 给 Leader,当 Leader 收到了超过半数 Follower 的 Ack,之后 Leader 会先将数据写到自己的 znode 中(也就是写到内存中去,此时数据就可以被客户端感知到了),之后再给所有的 Follower 发一个 Commit 消息,让大家提交这个请求事务,Follower 收到 Commit 消息后,就会将磁盘中刚刚写入的数据往内存中的 znode 中写,之后客户端就可以读取到数据了

光读上边的字,可能看起来很头疼,可以通过下边这个图很清晰的了解整个流程:
【ZooKeeper高手实战】ZAB协议:ZooKeeper分布式一致性的基石,Zookeeper,分布式,zookeeper,java

ZAB 协议如何实现崩溃恢复机制?

下边将会介绍 zk 集群 启动 再到 崩溃 再到 恢复 整体的流程:

zk 集启动的时候,进入 恢复模式,选举一个 Leader 出来,然后 Leader 等待集群中过半的 Follower 跟他进行数据同步,只要过半的 Follower 完成数据同步,接着就退出恢复模式,可以对外提供服务了

此时,还没完成同步的 Follower 会自己去跟 Leader 进行数据同步的

之后会进入 消息广播模式,只有 Leader 可以接受写请求,但是客户端可以任意连接 Leader 或者 Follower,如果客户端连接到 Follower,Follower 就会将写请求转发给 Leader

Leader 收到写请求,就把请求同步给所有的 Follower,当超过半数的 Follower 都返回了 Ack,之后 Leader 先将数据写到自己的 znode 中,再给所有的 Follower 发一个 Commit 消息,让大家提交这个请求事务,Follower 收到 Commit 消息后,就会将磁盘中刚刚写入的数据往内存中的 znode 中写,之后客户端就可以读取到数据了

如果 Leader 宕机了,就会进入 恢复模式,重新选举一个 Leader,只要获得了过半的机器的投票,就可以成为 Leader

zk 集群中可以容忍不超过一半的机器宕机,就比如说一个集群有 3 台机器,那么最多允许 1 台机器宕机,剩下的 2 台选举 Leader,只要 2 台机器都认可其中一台机器当 Leader,也就是超过了集群一半的机器都认可,那么就可以选举这台机器作为 Leader

新的 Leader 等待过半的 Follower 跟他同步,之后重新进入 消息广播模式

以上就是 zk 集群恢复崩溃的整个流程了,当然我也花了一个流程图,更方便观看,如下:
【ZooKeeper高手实战】ZAB协议:ZooKeeper分布式一致性的基石,Zookeeper,分布式,zookeeper,java

主要就是分为 3 个阶段:

  • 集群启动时:恢复模式,Leader 选举 + 数据同步
  • 消息写入时:消息广播模式,Leader 采用 2PC 的过半写机制,给 Follower 进行同步
  • 崩溃恢复:恢复模式,Leader/Follower 宕机,只要剩余机器超过一半,就可以选举新的 Leader

下边来介绍一下 ZAB 协议中是如何采用 2PC 两阶段提交思想完成数据写入的:

采用 2PC 两阶段提交思想 的 ZAB 消息广播流程:

每一个消息广播的时候,都是基于 2PC 的思想,先是发起事务提议 Proposal 的广播,各个 Follower 返回 Ack,当过半的 Follower 都返回 Ack 之后,Leader 就发送 Commit 消息到 Follower,让大家提交事务

这里的两阶段指的就是发送 ProposalCommit

发起一个事务 Proposal 之前,Leader 会分配一个全局唯一递增的事务 id(zxid),以此来严格保证顺序

Leader 会为每个 Follower 创建一个队列,里边存放要发给 Follower 的事务 Proposal,保证了一个同步的顺序性

Follower 收到事务 Proposal 之后,就立即写入本地磁盘日志中,写入成功后数据就不会丢失了,之后返回 Ack 给 Leader,当过半的 Follower 都返回 Ack,Leader 推送 Commit 消息给全部 Follower,让大家进行事务提交

那么 zk 到底是 强一致性 还是 最终一致性

zk 不是强一致的,因为当 Leader 给 Follower 发送 Commit 消息之后,可能有的 Follower 提交成功了,有的还没有提交成功,这会导致 短暂的数据不一致

但是说 zk 是最终一致性也不太对,zk 官方给自己的定位是 顺序一致性,因为 Leader 会保证所有的事务 Proposal 同步到 Follower 上都是按照顺序来执行的

ZAB 协议下可能存在的 数据一致性问题

在 ZAB 写一下有两种可能造成数据不一致的情况

  • 第一种情况:Leader 在收到过半 Follower 的 Ack 之后,Leader 就会 Commit,如果 Leader 在自己 Commit 之后,还没来得及给 Follower 发送 Commit 就挂掉了,此时 Leader 和所有的 Follower 的数据都是不一致的

    所以在 Leader 崩溃的时候,就会选举一个拥有最大 事务 id 的机器作为 Leader,它需要去检查事务日志,如果发现自己磁盘日志里有一个 Proposal 并且没有提交,说明肯定是之前的 Leader 没来得及发送 Commit 就挂掉了,此时新选举的 Leader 就为这个 Proposal 发送 Commit 到其他所有的 Follower 中去,这样就保证了老 Leader 提交的事务最终可以同步到所有的 Follower 中去
    【ZooKeeper高手实战】ZAB协议:ZooKeeper分布式一致性的基石,Zookeeper,分布式,zookeeper,java

  • 第二种情况:Leader 收到客户端请求,结果还没来得及给 Follower 发送 Proposal 就挂了,此时这个 Leader 上的 Proposal 请求应该是要被丢弃的,这种情况下,当新的 Leader 选举出来之后,老的 Leader 作为 Follower 重新启动,看到自己的磁盘日志有一个事务 Proposal,并且发现这个 Proposal 其实不应该存在,那么直接丢弃就可以了
    【ZooKeeper高手实战】ZAB协议:ZooKeeper分布式一致性的基石,Zookeeper,分布式,zookeeper,java

那么在 第二种情况 中,需要丢弃的消息是如何在 ZAB 协议中进行处理的?

每一条事务的 zxid 都是 64 位的,高 32 位是 Leader 的 epoch,可以看作是 Leader 的版本,低 32 位才是自增长的事务 id

如果 Leader 没有来得及给 Follower 发送 Proposal 就挂掉了,那么新的 Leader 选举出来之后,它的 epoch 会增长 1,老的 Leader 成为 Follower 之后,发现自己比新的 Leader 多一条 Proposal,并且 Proposal 的 epoch 比新 Leader 的 epoch 要小,那么直接丢弃即可文章来源地址https://www.toymoban.com/news/detail-778665.html

到了这里,关于【ZooKeeper高手实战】ZAB协议:ZooKeeper分布式一致性的基石的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 分布式系统中的那些一致性(CAP、BASE、2PC、3PC、Paxos、ZAB、Raft)

    本文介绍 CAP、BASE理论的正确理解、Paxos 算法如何保证一致性及死循环问题、ZAB 协议中原子广播及崩溃恢复以及 Raft 算法的动态演示。 下面还有投票,一起参与进来吧👍 工作过几年的同学,尤其是这几年,大家或多或少都参与过分布式系统的开发,遇到过各式各样“分布式

    2024年02月05日
    浏览(33)
  • 分布式系统的一致性级别划分及Zookeeper一致性级别分析

    在谈到Zookeeper的一致性是哪种级别的一致性问题,以及CAP原则中的C是哪一种一致性级别时有些疑惑。 下面是大多数文章中提到的一致性级别 一致性(Consistency)是指多副本(Replications)问题中的数据一致性。可以分为强一致性、顺序一致性与弱一致性。 1.1 强一致性(Stric

    2024年04月12日
    浏览(40)
  • 聊聊分布式架构09——分布式中的一致性协议

    目录 01从集中式到分布式 系统特点 集中式特点 分布式特点 事务处理差异 02一致性协议与Paxos算法 2PC(Two-Phase Commit) 阶段一:提交事务请求 阶段二:执行事务提交 优缺点 3PC(Three-Phase Commit) 阶段一:CanCommit 阶段二:PreCommit 阶段三:doCommit 优缺点 Paxos算法 拜占庭将军问题

    2024年02月08日
    浏览(34)
  • 一篇文章让你弄懂分布式一致性协议Paxos

    Paxos算法由Leslie Lamport在1990年提出,它是少数在工程实践中被证实的强一致性、高可用、去中心的分布式协议。Paxos协议用于在多个副本之间在有限时间内对某个决议达成共识。Paxos协议运行在允许消息重复、丢失、延迟或乱序,但没有拜占庭式错误的网络环境中,它利用“大

    2024年02月09日
    浏览(32)
  • 一文通吃:从 ZooKeeper 一致性,Leader选举讲到 ZAB 协议与 PAXOS 算法(上)

    本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注\\\"慕课网\\\"或慕课网公众号! 作者:大能 | 慕课网讲师 本文将从ZooKeeper集群如何保证一致性,讲到zookeeper保证数据一致性的协议,然后展开讲Zookeeper集群Leader选举,包括集群三种节点的类型,ZAB协议中

    2024年02月07日
    浏览(42)
  • 分布式锁原理与实战三:ZooKeeper分布式锁的原理

             目录 ZooKeeper分布式锁的原理 ZooKeeper的每一个节点,都是一个天然的顺序发号器。 ZooKeeper节点的递增有序性,可以确保锁的公平 ZooKeeper的节点监听机制,可以保障占有锁的传递有序而且高效 ZooKeeper的节点监听机制,能避免羊群效应 分布式锁的抢占过程 客户端

    2024年02月08日
    浏览(34)
  • Zookeeper入门实战(5)-分布式锁

    在分布式环境中,当需要控制对某一资源的不同进程并发访问时就需要使用分布式锁;可以使用 ZooKeeper + Curator 来实现分布式锁,本文主要介绍 Curator 中分布式锁的使用,文中所使用到的软件版本:Java 1.8.0_341、Zookeeper 3.7.1、curator 5.4.0。 信号量用于控制对资源同时访问的进

    2024年02月08日
    浏览(42)
  • Zookeeper实战——分布式锁实现以及原理

    分布式锁是控制分布式系统之间同步访问共享资源的一种方式。分布式锁的实现方式有很多种,比如 Redis 、数据库 、 zookeeper 等。这篇文章主要介绍用 Zookeeper 实现分布式锁。 先说结论: Zookeeper 是基于临时顺序节点以及 Watcher 监听器机制实现分布式锁的 。 (1)ZooKeeper 的每

    2023年04月08日
    浏览(22)
  • ZooKeeper 实战(五) Curator实现分布式锁

    1.1.分布式锁概念 分布式锁是一种用于实现分布式系统中的同步机制的技术。它允许在多个进程或线程之间实现互斥访问共享资源,以避免并发访问时的数据不一致问题。分布式锁的主要目的是在分布式系统中提供类似于全局锁的效果,以确保在任何时刻只有一个进程或线程

    2024年01月18日
    浏览(27)
  • (五)库存超卖案例实战——使用zookeeper分布式锁解决“超卖”问题

    本节内容使用zookeeper实现分布式锁,完成并发访问“超卖”问题的解决。相对于redis分布式锁,zookeeper能够保证足够的安全性。关于zookeeper的安装内容这里不做介绍,开始本节内容之前先自行安装好zookeeper中间键服务。这里我们利用创建zookeeper路径节点的唯一性实现分布式锁

    2024年02月06日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包