首页 > 其他分享 >聊一聊ZooKeeper的顺序一致性(转)

聊一聊ZooKeeper的顺序一致性(转)

时间:2023-09-15 10:11:33浏览次数:35  
标签:ZXID 结点 ZooKeeper 写入 聊一聊 一致性 提案 Leader

add by zhj: 原文有音频朗读

原文:https://time.geekbang.org/column/article/239261

作者:极客视点

你好,欢迎收听极客视点。

ZooKeeper 作为分布式应用系统协调服务,在分布式系统中的应用非常广泛,在某些业务场景下甚至可以作为注册中心、分布式锁来使用。ZooKeeper 之所以能有如此广泛的应用,与它良好的数据一致性保障机制是分不开的。最近,奈学教育 CTO 孙玄联合陈东在公众号“架构之美 ”聊了聊 ZooKeeper 的顺序一致性,希望对你有所启发。

众所周知,ZooKeeper 专门设计了 Zab(Zookeeper Atomic Broadcast)协议作为其数据一致性协议。利用 Zab 协议的数据写入由 Leader 结点协调,使用两阶段提交的方式,达到数据的最终一致性。为什么是最终一致性呢?我们先了解下两阶段的过程,如图一所示:

 数据写入过程如下:

  • 第一阶段:每次的数据写入事件作为提案广播给所有 Follower 结点;可以写入的结点返回确认信息 ACK;
  • 第二阶段:Leader 收到一半以上的 ACK 信息后确认写入可以生效,向所有结点广播 COMMIT 将提案生效。

根据写入过程的两阶段的描述,可以知道 ZooKeeper 保证的是最终一致性,即 Leader 向客户端返回写入成功后,可能有部分 Follower 还没有写入最新的数据,所以是最终一致性。

ZooKeeper 保证的最终一致性也叫顺序一致性,即每个结点的数据都是严格按事务的发起顺序生效的。

ZooKeeper 是如何保证事务顺序的呢?

这里需要了解下它的事务 ID,即 ZXID。ZooKeeper 通过比较各结点的 ZXID 和机器 ID 选出新的主结点。ZXID 由 Leader 节点生成,有新写入事件时,Leader 生成新 ZXID 并随提案一起广播,每个结点本地都保存了当前最近一次事务的 ZXID,ZXID 是递增的,所以谁的 ZXID 越大,就表示谁的数据是最新的。

ZXID 的生成规则如下图所示:

 ZXID 由两部分组成:

  • 任期:完成本次选举后,直到下次选举前,由同一 Leader 负责协调写入;
  • 事务计数器:单调递增,每生效一次写入,计数器加一。

ZXID 的低 32 位是计数器,所以同一任期内,ZXID 是连续的,每个结点又都保存着自身最新生效的 ZXID,通过对比新提案的 ZXID 与自身最新 ZXID 是否相差“1”,来保证事务严格按照顺序生效的。

ZooKeeper 集群的写入是由 Leader 结点协调的,真实场景下写入会有一定的并发量,那 Zab 协议的两阶段提交是如何保证事务严格按顺序生效的呢?Leader 在收到半数以上 ACK 后会将提案生效并广播给所有 Follower 结点,Leader 为了保证提案按 ZXID 顺序生效,使用了一个 ConcurrentHashMap,记录所有未提交的提案,命名为 outstandingProposals,key 为 ZXID,Value 为提案的信息。对 outstandingProposals 的访问逻辑如下:

  • 每发起一个提案,会将提案的 ZXID 和内容放到 outstandingProposals 中,作为待提交的提案;
  • 收到 Follower 的 ACK 信息后,根据 ACK 中的 ZXID 从 outstandingProposals 中找到对应的提案,对 ACK 计数;
  • 执行 tryToCommit 尝试将提案提交,判断流程是,先判断当前 ZXID 之前是否还有未提交提案,如果有,当前提案暂时不能提交;再判断提案是否收到半数以上 ACK,如果达到半数则可以提交;如果可以提交,将当前 ZXID 从 outstandingProposals 中清除并向 Followers 广播提交当前提案;

Leader 是如何判断当前 ZXID 之前是否还有未提交提案的呢?由于前提是保证顺序提交的,所以 Leader 只需判断 outstandingProposals 里,当前 ZXID 的前一个 ZXID 是否存在。代码如下:

所以 ZooKeeper 是通过两阶段提交保证数据的最终一致性,并且通过严格按照 ZXID 的顺序生效提案保证其顺序一致性的。

以上就是今天的内容,希望对你有所帮助。

 

标签:ZXID,结点,ZooKeeper,写入,聊一聊,一致性,提案,Leader
From: https://www.cnblogs.com/ajianbeyourself/p/17704224.html

相关文章

  • Zookeeper
    一、简介    可以用zookeeper来做:统一配置管理、统一命名服务、分布式锁、集群管理。二、数据结构    跟Unix文件系统非常类似,可以看做是一棵树,每个节点叫做【ZNode】,每个节点可以通过路径来标识,结构图如下:            Znode分类:   ......
  • dubbo分布式项目开发____Zookeeper搭建步骤和配置思路
    //搭建zookeeper 1.可以放到在linux下可以在windows下解压到指定的目录如个人:F:\zookeeper2.复制下conf下复制下zoo_simple.cfg文件把复制的修改成zoo.cfg内容如下一定以不要出现中文会报错的3.修改完成后进入windowsdos命令回车一下内容说明注册中心配置正常//资源地址......
  • 一篇文章让你弄懂分布式一致性协议Paxos
    一、Paxos协议简介Paxos算法由LeslieLamport在1990年提出,它是少数在工程实践中被证实的强一致性、高可用、去中心的分布式协议。Paxos协议用于在多个副本之间在有限时间内对某个决议达成共识。Paxos协议运行在允许消息重复、丢失、延迟或乱序,但没有拜占庭式错误的网络环境中,它利......
  • zookeeper安装
    ZooKeeper介绍ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错......
  • 保持预测一致性,推动企业实现未来价值
    近年来,不确定事件的频频发生,使得预测成为了企业生存和发展举足轻重的一部分。然而,预测仍是一件艰巨的任务,涉及大量数据、技术和工具。运营部门正在进行生存与收入概况一致的成本预测,销售部门也产生了良好的收入预测,保持预测的一致性,遵循相同的模式,具有一定的挑战性。那么如何确保不......
  • Redis缓存数据和表数据一致性之延时双删策略
    一、什么是Redis延时双删?1、延迟双删策略是分布式系统中数据库存储和缓存数据保持一致性的常用策略,但它不是强一致。不管哪种方案,都无法绝对避免Redis存在脏数据的问题,只能减轻这个问题2、因为双删策略执行的结果是把redis中保存的那条数据删除了,以后的查询就都会去查询数据库......
  • 缓存和数据库一致性问题
    先说结论:1、想要提高应用的性能,可以引入「缓存」来解决2、引入缓存后,需要考虑缓存和数据库一致性问题,可选的方案有:「更新数据库+更新缓存」、「更新数据库+删除缓存」3、更新数据库+更新缓存方案,在「并发」场景下无法保证缓存和数据一致性,且存在「缓存资源浪费」和「机......
  • 【Kafka】ZooKeeper启动失败报错java.net.BindException_ Address already in use_ bi
    问题描述Kafka2.8.1ZooKeeper启动失败。zookeeper-server-start.bat../../config/zookeeper.properties[2023-09-0418:21:49,497]INFObindingtoport0.0.0.0/0.0.0.0:2181(org.apache.zookeeper.server.NIOServerCnxnFactory)[2023-09-0418:21:49,498]ERRORUnexpected......
  • Nacos实战(21)-Nacos一致性协议
    1Nacos⼀致性协议1.1为什么Nacos需要⼀致性协议Nacos尽可能减少用户部署以及运维成本,做到用户只需要⼀个程序包,就快速单机模式启动Nacos或集群模式启动Nacos。而Nacos是⼀个需要存储数据的组件,为实现目标,就要在Nacos内部实现数据存储。单机问题不大,内嵌关系型数据库......
  • Zookeeper搭建
    1.ZookeeperZookeeper是ApacheHadoop项目下的一个子项目,是一个树形目录服务。Zookeeper是一个分布式的、开源的分布式应用程序的协调服务。 2.zookeeper搭建学习教程:04、ZooKeeper--集群搭建下--配置文件修改&启动_哔哩哔哩_bilibili前提:JDK已经安装好了输入java-version......