分布式协调神器 ZooKeeper 之整体概述
Posted 分布式实验室
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式协调神器 ZooKeeper 之整体概述相关的知识,希望对你有一定的参考价值。
事务请求的唯一调度和处理者,保证集群事务处理的顺序性。
集群内部各服务器的调度者。
处理客户端非事务请求,转发事务请求给 Leader 服务器。
参与事务请求 Proposal 的投票。
参与 Leader 选举投票。
在 Client 向 Follower 发出一个写请求。
Follower 把请求转发给 Leader。
Leader 接收到以后开始发起投票并通知 Follower 进行投票。
Follower 把投票结果发送给 Leader。
Leader 将结果汇总后,如果需要写入,则开始写入,同时把写入操作通知给 Follower,然后 commit。
Follower 把请求结果返回给 Client。
顺序一致性,来自任意特定客户端的更新都会按其发送顺序被提交。也就是说,如果一个客户端将 Znode z 的值更新为 a,在之后的操作中,它又将 z 的值更新为 b,则没有客户端能够在看到z的值是b之后再看到值 a(如果没有其他对z的更新)。
原子性,每个更新要么成功,要么失败。这意味着如果一个更新失败,则不会有客户端会看到这个更新的结果。
单一系统映像,一个客户端无论连接到哪一台服务器,它看到的都是同样的系统视图。这意味着,如果一个客户端在同一个会话中连接到一台新的服务器,它所看到的系统状态不会比 在之前服务器上所看到的更老。当一台服务器出现故障,导致它的一个客户端需要尝试连接集合体中其他的服务器时,所有滞后于故障服务器的服务器都不会接受该 连接请求,除非这些服务器赶上故障服务器。
持久性,一个更新一旦成功,其结果就会持久存在并且不会被撤销。这表明更新不会受到服务器故障的影响。
ServerCnxnFactory,ZooKeeper服务端网络连接工厂。在早期版本中,ZooKeeper 都是自己实现 NIO 框架,从 3.4.0 版本开始,引入了 Netty。可以通过 zookeeper.serverCnxnFactory 来指定使用具体的实现。
SessionTracker,ZooKeeper 服务端会话管理器。创建时,会初始化 expirationInterval、nextExpirationTime、sessionsWithTimeout(用于保存每个会话的超时时间),同时还会计算出一个初始化的sessionID。
RequestProcessor,ZooKeeper的请求处理方式是典型的责任链模式,在服务端,会有多个请求处理器依次来处理一个客户的请求。在服务器启动的时候,会将这些请求处理器串联起来形成一个请求处理链。基本的请求处理链如下:
LearnerCnxAcceptor,Learner服务器(等于 Follower 服务器)连接请求接收器。负责 Leader 服务器和 Follower 服务器保持连接,以确定集群机器存活情况,并处理连接请求。
LearnerHandler,Leader 接收来自其他机器的连接创建请求后,会创建一个 LearnerHandler 实例。每个 LearnerHandler 实例都对应了一个 Leader 和 Learner 服务器之间的连接,其负责 Leader 和 Learner 服务器之间几乎所有的消息通信和数据同步。
ZKDatabase,ZooKeeper 内存数据库,负责管理 ZooKeeper 的所有会话记录以及 DataTree 和事务日志的存储。
FileTxnSnapLog,ZooKeeper 上层服务和底层数据存储之间的对接层,提供了一系列的操作数据文件的接口,包括事务文件和快照数据文件。ZooKeeper 根据 zoo.cfg 文件中解析出的快照数据目录 dataDir 和事务日志目录 dataLogDir 来创建 FileTxnSnapLog。
LeaderElection,ZooKeeper 会根据 zoo.cfg 中的配置,创建相应的 Leader 选举算法实现。在 ZooKeeper 中,默认提供了三种 Leader 选举算法的实现,分别是 LeaderElection、AuthFastLeaderElection、FastLeaderElection,可以通过配置文件中 electionAlg 属性来指定,分别用 0 ~ 3 来表示。从 3.4.0 版本开始,ZooKeeper 废弃了前两种算法,只支持 FastLeaderEletion 选举算法。
以上是关于分布式协调神器 ZooKeeper 之整体概述的主要内容,如果未能解决你的问题,请参考以下文章