为什么面试官喜欢问 ZooKeeper 基本原理?
点击“开发者技术前线”,选择“星标🔝”
让一部分开发者看到未来
来源:cnblogs.com/luxiaoxun/p/4887452.html
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。
Watch的三个关键点:
-
(一次性触发)One-time trigger
-
(发送至客户端)Sent to the client
-
(被设置 watch 的数据)The data for which the watch was set
Consistency Guarantees
Zookeeper是一个高效的、可扩展的服务,read和write操作都被设计为快速的,read比write操作更快。
顺序一致性(Sequential Consistency):从一个客户端来的更新请求会被顺序执行。
原子性(Atomicity):更新要么成功要么失败,没有部分成功的情况。
唯一的系统镜像(Single System Image):无论客户端连接到哪个Server,看到系统镜像是一致的。
可靠性(Reliability):更新一旦有效,持续有效,直到被覆盖。
时间线(Timeliness):保证在一定的时间内各个客户端看到的系统信息是一致的。
ZooKeeper的工作原理
-
角色:leader,follower,observer 状态:leading,following,observing,looking
Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议(ZooKeeper Atomic Broadcast protocol)。Zab协议有两种模式,它们分别是恢复模式(Recovery选主)和广播模式(Broadcast同步)。
当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。
为了保证事务的顺序一致性,zookeeper采用了递增的事务id号(zxid)来标识事务。所有的提议(proposal)都在被提出的时候加上了zxid。
实现中zxid是一个64位的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch,标识当前属于那个leader的统治时期。低32位用于递增计数。
Leader Election
当leader崩溃或者leader失去大多数的follower,这时候zk进入恢复模式,恢复模式需要重新选举出一个新的leader,让所有的Server都恢复到一个正确的状态。
Zk的选举算法有两种:一种是基于basic paxos实现的,另外一种是基于fast paxos算法实现的。
Leader工作流程
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
Zookeeper Server接收到一次request,如果是follower,会转发给leader,Leader执行请求并通过Transaction的形式广播这次执行。
Zookeeper集群如何决定一个Transaction是否被commit执行?通过“两段提交协议”(a two-phase commit):
-
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)。
总结
在这里,我为大家准备了一份2020年最新最全的《Java面试题及答案V3.0》,这套电子书涵盖了诸多后端技术栈的面试题和答案,相信可以帮助大家在最短的时间内复习Java后端的大多数面试题,从而拿到自己心仪的offer。
截了张图,大家可以仔细查看左边的菜单栏,覆盖的知识面真的很广,而且质量都很不错。
资料获取方法
扫描下方二维码
后台回复关键词:Java核心整理
历史推荐
点个在看吧
扫描下方二维码
后台回复关键词:Java核心整理