工作流程
Leader工作流程
Leader 主要有三个功能:
1.恢复数据
2.维护与Leader的心跳,接收Learner 请求并判断Learner 的请求消息类型
3.Learner 的消息类型主要有PING 消息、REOUEST消息、ACK消息、REVALIDATE消息,根据不同的消息类型,进行不同的处理
PING 消息是指Learner的心跳信息:REQUEST消息是Follower 发送的提议信息,包括写请求及同步请求;ACK消息是Follower对提议的回复,超过半数的Follower 通过,则commit 该提议;REVALIDATE 消息用来延长SESSION 有效时间。
Follower 工作流程
Follower 主要四个功能;
1.向Leader 发送请求(PING消息、REQUEST消息、ACK消息、REVALIDATE 消息)
2.接收Leader 消息并进行处理
3.接收Client 的请求,如果为写请求,就发送给Leader 进行投票
4.返回Client 结果
Follower 的消息循环处理以下几种来自于Leader 的消息;
1.PING 消息:心跳消息
2.PROPOSAL消息:Leader 发起提案,要求Follower 投票
3.commit 消息:服务器端最新一次提案的信息
4.UPTODATA消息:表明同步完成
5.REVALIDATE消息:根据Leader 的REVALIDATE 结果,决定是关闭等待REVALIDATE的SESSION 还是允许其接受消息
6.SYNC消息:返回SYNC结果到客户端,该消息最初由客户端发起,用来强制得到最新的更新。
Zookeeper 数据模型
Zookeeper 数据模型Znode
Zookeeper 拥有一个层次的命名空间,这和标准的文件系统非常相似,Zookeeper 的数据模型在结构上和标准文件的非常相似,都是采用树行层次结构,Zookeeper 树中的每个节点被称为Znode 。和文件系统的目录树一样,Zookeeper 树中每个节点可以拥有子节点。但标准文件系统也有不同之处,表现在
1.引用方式
Znode 通过路径引用,如同Linux 中的文件路径,路径必须有斜杠来开头。除此之外,路径必须是惟一的,在Zookeeper 中,路径是由Unicode 字符串组成,并且有一些限制。字符串“/Zookeeper"用以保存管理信息,比如关键配额信息。
2.Znode 结构
Zookeeeper 命名空间中的Znode 兼具文件和目录两种特点。既像文件一样维护着数据,元信息,ACL,时间戳等数据结构,又像目录一样作为路径标识的一部分。每个Znode 由3个部分组成:
1.stat:描述该Znode 的版本,版权等信息
2.data:与该Znode 关联的数据
3.children:该Znode 下的子节点
Zookeeper 虽然可以关联一些数据,但没有被设计为常规的数据库或者大数据存储,相反,它是用来管理调度数据,比如分布式应用中的配置文件信息,状态信息,汇集位置等。这些数据的共同特征就是他们都很小,通常以KB为单位。Zookeeper 的服务器和客户端都被设计为严格检查并限制为每个Znode 的数据大小至多1M,但实际使用中要远小于此值。
3.数据访问
Zookeeper 中的每个节点存储的数据都要被原子性操作,。每个节点都拥有自己的ACL ,这个列表规定了用户的权限,却限制了特定用户对目录节点可以执行的操作。
4.节点类型
Zookeeper 中的节点有两种,分别为临时节点和永久节点。节点类型在创建过程是即被确定,并且不能被改变。
临时节点:该节点的生命周期依赖于他们创建的会话。一旦会话结束,临时节点将自动删除,或者也可以手动删除。虽然每个临时的Znode 都会绑定到一个客户端会话,但他们对所有的客户端还是可见的。另外,Zookeeper 的临时节点不允许拥有子节点。
永久节点:该节点的生命不依赖于会话,并且只有在客户端显式的执行删除的时候,这些节点才能删除。
5.顺序节点
当创建Znode 的时候,用户可以请求Zookeeper 的路径结尾添加一个递增的计数,这个计数对于此节点的父节点来说是惟一的,它的格式为“%10d”(10位数字,没有数值的数位用0补充)
6.监视器
客户端可以在节点上设置watch ,称为监视器。当节点状态发生改变时(Znode的增,删,改)将会触发watch 所对应的操作。当watch 被触发时,Zookeeper 将会向客户端发送且发送一条通知,因为watch 只会被触发一次,这样可以减少网络流量。
Zookeeper 中的时间
zookeeper 有多种记录时间形式,其中包括以下几种属性:
1.Zxid
使得Zookeeper 节点状态改变的每一个操作都将使得节点接收到一个Zxid 格式的时间戳,并且这个时间戳全部有序。czxid是节点的创建所对应的zxid 格式时间戳。mzxid 是修改节点所对应的zxid 格式时间戳。
Zxid 是一个64位的数字,它高32位是epoch 用来标识leader 关系是否改变,每次一个Leader 被选出来,都会有一个新的epoch,低32位是一个递增计数。
2.版本号
对于每个节点操作都会将致使这个节点的版本号增加。每个节点维护着是哪个版本号,它们分别为:
1.version :节点数据版本号
2.cversion:子节点版本号
3.aversion:节点所拥有的ACL 版本号