Zookeeper Server端对接收到的Client端请求,以及Leader接收到的Follower/Observer请求,都会以"处理链"的方式"分工/逐步"处理,这是一种良好的设计模式..不过事实上Zookeeper源码中,这部分代码写的确实比较"纠结"..
一. Folower端:
Follower与Client的通讯入口为ServerCnxn.doIO()方法,Follower与Leader的通讯操作入口Follower.followLeader()方法.下文中提到的请求,即为"Request"对象(将用户操作封装之后的对象)
FollowerZookeeperServer实例就是Follower为Client请求服务的对象.任何一个请求都将会依次经过如下"处理器"或过程:
1) ZookeeperServer.processPacket(Request)方法开始处理请求,如果请求符合要求,将会被交付给"处理器".
2) FollowerRequestProcessor(线程):作为Follower的首个"处理器",将Client请求队列化,因为其本身即为线程,则在线程run方法中,则从队列中逐个take出请求,并交付给"下一个处理器"(nextProcessor),对于write操作(create,delete,setData...)同时也将请求转发给Leader一份.
3) Follower.followLeader()中,如果来自Leader的消息类型为"proposal",则将此消息交付给SyncRequestProcessor处理器.
4) SyncRequestProcessor(线程):对于2)处理器转发给Leader的请求,Leader会经过处理后给所有的Followers发送"Proposal"(提议),Proposal中将会包含此次请求的zxid,cxid等.SyncRequestProcessor主要做了一件事情:将请求写入txnLog中.如果事务日志写入成功,则将请求转发给5)处理器
5) SendAckRequestProcessor:因为在3)中,Follower已经接收到"提议",则在此处理器中,直接回馈Leader一个ACK包,按照惯例,此包仍然会包括zxid(此zxid来自proposal).
6) Follower.followLeader()中,如果来自Leader的消息类型为"commit",则将此消息交付给CommitProcessor处理器.此处进行了严格的请求次序控制,如果发现乱序情况,则直接导致系统退出(乱序的特征:pendingTxns.element().zxid,其中pendingTxns是个队列,表示proposal队列,即commit的顺序必须和proposal的顺序一致)
7) CommitProcessor(线程): 对于来自Leader的commit请求,会被队列化,那么在CommitProcessor线程的run方法中,则会逐个处理"commit"请求.此处理器很简单,它的特点就是让请求处理"逐个进行"传递给下一个处理器.
8) FinalRequestProcessor:将数据变更操作持久化,操作ZKDatabase,如果有必要,则触发相应的watches.
二.Observer端: 和Follower很像,但是它没有SendAckRequestProcessor,当接收到commit类型的请求时,直接提交就行.它不参与proposal和ack.
二.Leader端:
Leader端和Follower端在交互上形成对应.Leader与Follower通讯入口为LearnerHandler.run();
1) 对于Follower转发给Leader的write操作,请求类型为Leader.REQUEST,则触发此请求添加到请求队列中,此后将有"处理器链"依次处理.
2) PreRequestProcessor(线程):将请求队列化,是请求的预处理阶段,因为Leader可以断言所有的write操作必将带来额外的影响,比如节点的创建会影响其父节点的version变更,比如Sequential节点创建需要计算序列号码等.此处理器并没有做实际的工作,主要作用就是生成一个zxid,并交付给请求....继续下一个处理器.
3) ProposalRequestProcessor:将请求封装成一个"Proposal"依次发送给所有的Follower,发送操作也是有LearnerHandler来做...此后,将有将请求交付给SyncRequestProcessor.
4) SyncRequestProcessor(线程):和Follower一样,记录txnLog.
5) AckRequestProcessor:是Leader对请求的补充操作,Leader对请求直接做"ACK"操作,意味着任何一个Proposal,Leader都会立即提交ACK.
6) Leader此时将会获得Follower交付的ACK请求,将会直接使用leader.processAck(serverId,zxid..)处理,此方法的主要作用就是,对请求队列中亟待"commit"的请求进行确认,直到"大多数"Follower都对某个请求进行了ACK,此请求才会被commit;如果对一个已经commited的请求进行确认(即当前ack请求的zxid小于先已提交的zxid),将会忽略(下一个处理器,将会告知其立即提交)...
7) CommitProcessor(线程):如果LearnerHandler接收到ACK请求时,都会执行Leader.commit()方法,此方法的最要作用就是针对"多数派"的请求,则向Follower/Observer发送Commit请求;此后,把此请求交付给下一个处理器ToBeAppliedRequestProcessor.
8) ToBeAppliedRequestProcessor:根据命名,我们也能知道,此处理器就是在"即将实施变更"之前,做一些额外的工作,在向所有的Follower发送Commit之前,Leader特意把此请求添加一个队列中(为了防止,在最后时机发送乱序情况,比如发送commit时遇到异常),如果"请求"到达ToBeAppliedRequestProcessor,说明当前commit请求被如期发送给了所有的所有的Follower(事实上有可能正在发送),那么ToBeAppliedRequestProcessor所做的就是把队列头部的Commit移除,并继续传递给下一个处理器.
9) FinalRequestProcessor:和Follower一样,在本地ZKDatabase中持久化此变更请求.
这就是Follower和Leader进行的"二阶段"提交和事务控制的全过程,不过因为IO操作本身就存在很多"异常可能";那么Follower和Leader所做的,就是控制好请求被执行的顺序,也就是确保事务性和全局数据一致性;如果Follower发现乱序或者IO异常,唯一能做的,就是重新和Leader同步;Leader能做的就是阻塞后续请求或者发起选举.
相关推荐
Leader 负责处理所有客户端的写请求,并向其他节点广播更新,确保数据的一致性。 对于学习 Zookeeper 的学生或部署的工作人员,了解以下知识点至关重要: 1. 安装与配置:如何正确地安装 Zookeeper,包括修改配置...
打开这个压缩包,你会发现`zookeeper-3.4.8.jar`,这是Zookeeper的核心库文件,包含了所有必要的类和方法,使得Zookeeper能够运行并处理客户端的请求。Java档案(JAR)文件是Java平台特有的,用于封装多个类文件和...
领导者负责处理所有的写请求,而读请求可以由任何服务器处理。 2. **ZooKeeper配置**:在部署ZooKeeper时,我们需要配置`conf/zoo.cfg`文件。关键配置项包括: - `dataDir`:存储ZNode数据和日志的地方。 - `...
4. **选举机制**:在Zookeeper集群中,当一台服务器成为“领导者”时,它会处理所有的客户端请求。如果领导者宕机,集群会通过选举选出新的领导者。选举算法基于Paxos或Fast-Paxos协议的变种,确保了高可用性。 5. ...
在Zookeeper 3.4.6版本中,用户可以解压后直接运行 `bin/zkServer.cmd` 启动服务,这极大地简化了部署流程。接下来,我们将深入探讨Zookeeper的核心特性、工作原理以及如何在实际场景中应用。 1. **核心特性** - ...
Zookeeper的架构由三部分组成:服务器(Server)、客户端(Client)和数据存储(ZNode)。每个Zookeeper服务器都维护着一份相同的数据副本,通过选举算法保证数据的一致性。客户端与任意服务器建立连接,发送请求并...
`org.apache.zookeeper.server.ZooKeeperServer`是Zookeeper服务器的核心类,处理请求和响应。 此外,`zookeeper-release-3.5.4`中还包括了测试用例,这为我们提供了很好的示例,了解如何与Zookeeper进行交互。例如...
当客户端请求写操作时,Zookeeper会确保至少有半数以上的服务器节点接收到并处理该请求,以达到容错和高可用性。 四、Zookeeper 3.4.6在Windows上的部署 1. 解压“zookeeper-3.4.6.rar”:首先,你需要在Windows...
集群中的每个节点都是平等的,任何节点都可以处理客户端请求。 - Leader选举:在集群中,有一个被称为Leader的节点负责处理所有写操作,并协调其他follower节点,确保数据一致性。 - ACL权限控制:Zookeeper提供了...
ZooKeeper由多个服务器节点(称为ZNode)组成一个集群,每个节点都可以接收客户端的请求并处理。客户端通过TCP连接与服务器通信,使用Zookeeper协议进行交互。ZooKeeper采用主从结构,其中一个是Leader,其余是...
Leader负责处理所有的写请求,并通过ZAB(Zookeeper Atomic Broadcast)协议保证数据的一致性。Follower接收并转发读写请求给Leader,而Observer主要用于扩展系统,只处理读请求,不参与投票过程,降低了写操作的...
通常,客户端首先连接到 Zookeeper 集群中的一个节点,然后可以通过会话与 Zookeeper 进行通信,发送请求并接收响应。 **项目构建与配置(pom.xml)** 在 Maven 项目中,引入 Zookeeper 客户端依赖的配置如下: `...
Zookeeper集群由多个Server组成,分为follower、leader和observer三种角色。follower和observer负责接收客户端请求,而leader负责处理写操作和ZAB协议的协调。observer的角色是在不参与选举的情况下提供读服务,增加...
其次,性能优化是一个关键点,包括数据传输优化、请求处理优化,以及内存管理的改进,这些都有助于提升系统整体的吞吐量和响应速度。此外,此版本可能还修复了一些已知的bug,提高了系统的稳定性和可靠性。 安装...
- **选举算法**:Zookeeper使用Paxos或ZAB(Zookeeper Atomic Broadcast)协议实现领导者选举,确保集群中只有一个领导者处理所有写请求。 在实际应用中,Zookeeper常用于以下场景: - 配置管理:集中式地存储和...
2. **顺序一致性**:对于同一个客户端,所有请求按照发送顺序进行处理,这使得在高并发场景下依然能保持操作顺序。 3. **原子性**:所有的读取和写入操作都是原子的,要么全部完成,要么全部不完成。 4. **单一...
每个服务器都包含一份数据副本,当客户端请求写操作时,Zookeeper会通过ZAB协议在集群内达成一致,确保所有服务器的数据同步。 Zookeeper广泛应用于Hadoop生态中的其他组件,如HBase、HDFS、YARN等。例如,在HBase...
- **Zookeeper服务器**:每个服务器都保存整个数据树的一个副本,并且能够处理客户端请求。 - **Zookeeper客户端**:提供API供应用程序使用,与Zookeeper服务器进行通信。 - **会话(Session)**:客户端与服务器...
4. 启动Zookeeper服务,运行`bin/zkServer.sh start`。 5. 使用`bin/zkCli.sh`命令行工具与Zookeeper交互。 六、总结 Zookeeper作为分布式系统的基石,它的核心价值在于提供了一种简单、高效的方式来解决分布式...
2. **负载均衡**:Zookeeper可以根据预设策略,如随机、轮询或根据服务实例的权重进行负载分发,确保服务请求的均衡。 3. **故障检测**:通过心跳检测机制,Zookeeper能及时发现服务提供者的健康状态,一旦检测到...