Zookeeper分布式一致性协议ZAB

2024-01-24 11:38

本文主要是介绍Zookeeper分布式一致性协议ZAB,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、分布式一致性协议ZAB详解

Zookeeper Atomic Broadcast(Zookeeper 原子广播协议)。ZAB 协议是为分布式协调服务 Zookeeper 专门设计的一种支持 崩溃恢复 和 原子广播 的协议。整个 Zookeeper 就是在这两个模式之间切换。 简而言之,当 Leader 服务可以正常使用,就进入消息广播模式,当 Leader 不可用时,则进入崩溃恢复模式。

2、zookeeper集群崩溃恢复leader选举流程

半数节点以上同步成功,3/2+1也就是3个节点需要2个节点同步。zk不是实时的强一致性,可以说是顺序一致性。leader挂了,事务id最大的那个节点成为新的主节点(因为他同步的数据最多)。

3、原子广播协议是什么

 ZAB 协议的消息广播过程使用的是一个原子广播协议,类似一个 两阶段提交过程(2PC)。对于客户端发送的写请求,全部由 Leader 接收,Leader 将请求封装成一个事务 Proposal,将其发送给所有 Follwer ,然后,根据所有 Follwer 的反馈,如果超过半数(含leader自己)成功响应,则执行 commit 操作。发送请求会先写到log中,leader收到超过半数ack才会commit写入内存。

4、从create命令来看下zookeeper集群数据同步全流程

通过nio的socketChannel发送到客户端

5、zookeeper链式数据处理器之责任链设计模式剖析

LeaderZooKeeperServer 和 FollowerZooKeeperServer 责任链有一定不同,但整体是类似的 ,leader做过的syncRequest(同步日志到磁盘),ackRequest(发送ack到leader),commit(提交数据到内存),finalRequest(数据到内存,节点变动触发客户端监听) ,follower也要做一遍这些操作。

//LeaderZooKeeperServerprotected void setupRequestProcessors() {//构建leader请求处理链 -责任链 设计模式RequestProcessor finalProcessor = new FinalRequestProcessor(this);RequestProcessor toBeAppliedProcessor = new Leader.ToBeAppliedRequestProcessor(finalProcessor, getLeader());commitProcessor = new CommitProcessor(toBeAppliedProcessor,Long.toString(getServerId()), false,getZooKeeperServerListener());commitProcessor.start();ProposalRequestProcessor proposalProcessor = new ProposalRequestProcessor(this,commitProcessor);proposalProcessor.initialize();prepRequestProcessor = new PrepRequestProcessor(this, proposalProcessor);prepRequestProcessor.start();//线程处理消息firstProcessor = new LeaderRequestProcessor(this, prepRequestProcessor);setupContainerManager();}
ProposalRequestProcessor构造器中又初始化了两个Processor
public ProposalRequestProcessor(LeaderZooKeeperServer zks,RequestProcessor nextProcessor) {this.zks = zks;this.nextProcessor = nextProcessor;AckRequestProcessor ackProcessor = new AckRequestProcessor(zks.getLeader());syncProcessor = new SyncRequestProcessor(zks, ackProcessor);}

6、集群数据同步全流程

SyncRequestProcessor

client 发起request create /zhuge 666

Leader的操作 1.1 leader向所有follower发送proposal 1.2 写本地数据文件 1.3 给自己发ack

Follower的操作 2.1 写本地数据文件 2.2 返回ack给Leader

Leader的操作 3.1 leader收到半数以上给所有Follower发送commit 3.2 发送inform让observer存储消息 3.3 commit:写自己的内存数据 3.4  回发节点数据变动通知给客户端,触发客户端client监听事件 3.5 返回客户端命令操作结果   

Follower的操作  4 commit:写自己的内存数据
 
 当leader发完时还没有超过半数以上,等follower发过来超过后会commit。1.1步中发生的proposal是加入到一个leader的queuedPackets队列里了,leader.lead启动时有启动一个线程LearnerHandler run方法种startSendingPackets方法又启动线程 ,将队列中的packet阻塞式poll数据转发给follower 

7、zxid创建流程

这么设计是因为某个leader挂掉后,事务Id在jvm内存中是无法同步的,所以下一次LeaderId+1即可,这样避免了事务Id又重0开始覆盖之前的记录的问题。private final AtomicLong hzxid = new AtomicLong(0); 事务id自增是原子性的

8、客户端Watcher监听机制

客户端用path和wathcer绑定好存到一个集合里,到时服务端(发现节点变动触发监听机制)传回来一个path,客户端就会根据path从wathcer集合里去找相应的watcher。出于性能考虑监听是一次性的,触发一次后在服务端的watcherTable里会remove这个path

9、zk如何使用BIO&NIO&Netty通信

leader和follower选举后的通讯是建立BIO连接(适用于连接数比较少),除开选举的端口是另一个端口。

zk默认使用NIO连接(适用于多个客户端),因为以前Netty有时候不稳定,需要保证系统的稳定。Netty在后期加入,可以手动配置,现在官方是推荐使用netty.

将zoo.cfg文件位置配置到启动参数里

-Dzookeeper.serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory

使用Netty通信

10、zookeeper集群架构如何规避脑裂问题

脑裂(brain-split):脑裂是指在主备切换时,由于切换不彻底或其他原因,导致客户端和follower误以为出现两个leader,最终使得整个集群处于混乱状态。

zookeeper 如果leader挂掉,会进行重新选举,选举周期会+1,就是leaderId会比上一个大,这样可以判断最大的zxid才是最终的leader。就算他后面恢复了,log记录的内容也会被清除掉,因为leaderId不是最大的那个。

11、zookeeper架构设计核心总结

ZAB协议(多节点分布式一致性算法的实现),原子广播,并发消息队列/并发编程,bio/nio通讯,zxid,leader选举(多级内存队列,半数以上),崩溃恢复

这篇关于Zookeeper分布式一致性协议ZAB的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/639572

相关文章

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细介绍 Curator 框架,包括它的设计哲学、核心组件以及如何使用 Curator 来简化 ZooKeeper 的操作。 1

集中式版本控制与分布式版本控制——Git 学习笔记01

什么是版本控制 如果你用 Microsoft Word 写过东西,那你八成会有这样的经历: 想删除一段文字,又怕将来这段文字有用,怎么办呢?有一个办法,先把当前文件“另存为”一个文件,然后继续改,改到某个程度,再“另存为”一个文件。就这样改着、存着……最后你的 Word 文档变成了这样: 过了几天,你想找回被删除的文字,但是已经记不清保存在哪个文件了,只能挨个去找。真麻烦,眼睛都花了。看

zookeeper相关面试题

zk的数据同步原理?zk的集群会出现脑裂的问题吗?zk的watch机制实现原理?zk是如何保证一致性的?zk的快速选举leader原理?zk的典型应用场景zk中一个客户端修改了数据之后,其他客户端能够马上获取到最新的数据吗?zk对事物的支持? 1. zk的数据同步原理? zk的数据同步过程中,通过以下三个参数来选择对应的数据同步方式 peerLastZxid:Learner服务器(Follo

开源分布式数据库中间件

转自:https://www.csdn.net/article/2015-07-16/2825228 MyCat:开源分布式数据库中间件 为什么需要MyCat? 虽然云计算时代,传统数据库存在着先天性的弊端,但是NoSQL数据库又无法将其替代。如果传统数据易于扩展,可切分,就可以避免单机(单库)的性能缺陷。 MyCat的目标就是:低成本地将现有的单机数据库和应用平滑迁移到“云”端

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

2024.9.8 TCP/IP协议学习笔记

1.所谓的层就是数据交换的深度,电脑点对点就是单层,物理层,加上集线器还是物理层,加上交换机就变成链路层了,有地址表,路由器就到了第三层网络层,每个端口都有一个mac地址 2.A 给 C 发数据包,怎么知道是否要通过路由器转发呢?答案:子网 3.将源 IP 与目的 IP 分别同这个子网掩码进行与运算****,相等则是在一个子网,不相等就是在不同子网 4.A 如何知道,哪个设备是路由器?答案:在 A

Modbus-RTU协议

一、协议概述 Modbus-RTU(Remote Terminal Unit)是一种基于主从架构的通信协议,采用二进制数据表示,消息中的每个8位字节含有两个4位十六进制字符。它主要通过RS-485、RS-232、RS-422等物理接口实现数据的传输,传输距离远、抗干扰能力强、通信效率高。 二、报文结构 一个标准的Modbus-RTU报文通常包含以下部分: 地址域:单个字节,表示从站设备