ZooKeeper 这么牛逼,基本原理你懂吗?
共 7638字,需浏览 16分钟
·
2020-09-10 17:29
Java技术栈
www.javastack.cn
关注阅读更多优质文章
ZooKeeper 简介
ZooKeeper是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。
ZooKeeper 设计目的
1. 最终一致性:client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能。
2. 可靠性:具有简单、健壮、良好的性能,如果消息m被到一台服务器接受,那么它将被所有的服务器接受。
ZooKeeper数据模型
Persistent 节点,一旦被创建,便不会意外丢失,即使服务器全部重启也依然存在。每个 Persist 节点即可包含数据,也可包含子节点。
Ephemeral 节点,在创建它的客户端与服务器间的 Session 结束时自动被删除。服务器重启会导致 Session 结束,因此 Ephemeral 类型的 znode 此时也会自动删除。
Non-sequence 节点,多个客户端同时创建同一 Non-sequence 节点时,只有一个可创建成功,其它匀失败。并且创建出的节点名称与创建时指定的节点名完全一样。
Sequence 节点,创建出的节点名在指定的名称之后带有10位10进制数的序号。多个客户端创建同一名称的节点时,都能创建成功,只是序号不同。
ZooKeeper Session
ZooKeeper Watch
a watch event is one-time trigger, sent to the client that set the watch, whichoccurs when the data for which the watch was set changes。
(一次性触发)One-time trigger
(发送至客户端)Sent to the client
(被设置 watch 的数据)The data for which the watch was set
Consistency Guarantees
ZooKeeper的工作原理
角色:leader,follower,observer 状态:leading,following,observing,looking
Leader Election
Leader工作流程
恢复数据;
维持与follower的心跳,接收follower请求并判断follower的请求消息类型;
follower的消息类型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根据不同的消息类型,进行不同的处理。
PING消息是指follower的心跳信息;REQUEST消息是follower发送的提议信息,包括写请求及同步请求;
ACK消息是follower的对提议的回复,超过半数的follower通过,则commit该提议;
REVALIDATE消息是用来延长SESSION有效时间。
Follower工作流程
向Leader发送请求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息);
接收Leader消息并进行处理;
接收Client的请求,如果为写请求,发送给Leader进行投票;
返回Client结果。
PING消息:心跳消息 PROPOSAL消息:Leader发起的提案,要求Follower投票 COMMIT消息:服务器端最新一次提案的信息 UPTODATE消息:表明同步完成 REVALIDATE消息:根据Leader的REVALIDATE结果,关闭待revalidate的session还是允许其接受消息 SYNC消息:返回SYNC结果到客户端,这个消息最初由客户端发起,用来强制得到最新的更新。
Zab: Broadcasting State Updates
Leader给所有的follower发送一个PROPOSAL消息。 一个follower接收到这次PROPOSAL消息,写到磁盘,发送给leader一个ACK消息,告知已经收到。 当Leader收到法定人数(quorum)的follower的ACK时候,发送commit消息执行。
如果leader以T1和T2的顺序广播,那么所有的Server必须先执行T1,再执行T2。 如果任意一个Server以T1、T2的顺序commit执行,其他所有的Server也必须以T1、T2的顺序执行。
在新的leader广播Transaction之前,先前Leader commit的Transaction都会先执行。 在任意时刻,都不会有2个Server同时有法定人数(quorum)的支持者。
这里的quorum是一半以上的Server数目,确切的说是有投票权力的Server(不包括Observer)。
总结
参考
《ZooKeeper—Distributed Process Coordination》 by FlavioJunqueira and Benjamin Reed
http://zookeeper.apache.org/doc/trunk/zookeeperOver.html
http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/index.html
《ZooKeeper的一致性算法赏析》https://my.oschina.net/pingpangkuangmo/blog/778927
关注Java技术栈看更多干货