[Java后端技术]23个带答案的Zookeeper经典面试题!( 四 )
![[Java后端技术]23个带答案的Zookeeper经典面试题!](/uploads/allimg/200307/11505455T-3.png)
文章图片
18、Zookeeper同步流程
选完Leader以后 , zk就进入状态同步过程 。
1)Leader等待server连接;
2)Follower连接leader , 将最大的zxid发送给leader;
3)Leader根据follower的zxid确定同步点;
4)完成同步后通知follower已经成为uptodate状态;
5)Follower收到uptodate消息后 , 又可以重新接受client的请求进行服务了 。
![[Java后端技术]23个带答案的Zookeeper经典面试题!](/uploads/allimg/200307/1150541b2-4.png)
文章图片
19、分布式通知和协调
对于系统调度来说:操作人员发送通知实际是通过控制台改变某个节点的状态 , 然后zk将这些变化发送给注册了这个节点的watcher的所有客户端 。
对于执行情况汇报:每个工作进程都在某个目录下创建一个临时节点 。 并携带工作的进度数据 , 这样汇总的进程可以监控目录子节点的变化获得工作进度的实时的全局情况 。
20、机器中为什么会有leader?
在分布式环境中 , 有些业务逻辑只需要集群中的某一台机器进行执行 , 其他的机器可以共享这个结果 , 这样可以大大减少重复计算 , 提高性能 , 于是就需要进行leader选举 。
21、zk节点宕机如何处理?
Zookeeper本身也是集群 , 推荐配置不少于3个服务器 。 Zookeeper自身也要保证当一个节点宕机时 , 其他节点会继续提供服务 。
如果是一个Follower宕机 , 还有2台服务器提供访问 , 因为Zookeeper上的数据是有多个副本的 , 数据并不会丢失;
如果是一个Leader宕机 , Zookeeper会选举出新的Leader 。
ZK集群的机制是只要超过半数的节点正常 , 集群就能正常提供服务 。 只有在ZK节点挂得太多 , 只剩一半或不到一半节点能工作 , 集群才失效 。
所以
3个节点的cluster可以挂掉1个节点(leader可以得到2票>1.5)
2个节点的cluster就不能挂掉任何1个节点了(leader可以得到1票<=1)
22、zookeeper负载均衡和nginx负载均衡区别
zk的负载均衡是可以调控 , nginx只是能调权重 , 其他需要可控的都需要自己写插件;但是nginx的吞吐量比zk大很多 , 应该说按业务选择用哪种方式 。
23、zookeeperwatch机制
Watch机制官方声明:一个Watch事件是一个一次性的触发器 , 当被设置了Watch的数据发生了改变的时候 , 则服务器将这个改变发送给设置了Watch的客户端 , 以便通知它们 。
Zookeeper机制的特点:
1)一次性触发数据发生改变时 , 一个watcherevent会被发送到client , 但是client只会收到一次这样的信息 。
2)watcherevent异步发送watcher的通知事件从server发送到client是异步的 , 这就存在一个问题 , 不同的客户端和服务器之间通过socket进行通信 , 由于网络延迟或其他因素导致客户端在不通的时刻监听到事件 , 由于Zookeeper本身提供了orderingguarantee , 即客户端监听事件后 , 才会感知它所监视znode发生了变化 。 所以我们使用Zookeeper不能期望能够监控到节点每次的变化 。 Zookeeper只能保证最终的一致性 , 而无法保证强一致性 。
3)数据监视Zookeeper有数据监视和子数据监视getdataandexists设置数据监视 , getchildren设置了子节点监视 。
4)注册watchergetData、exists、getChildren
5)触发watchercreate、delete、setData
6)setData会触发znode上设置的datawatch(如果set成功的话) 。 一个成功的create操作会触发被创建的znode上的数据watch , 以及其父节点上的childwatch 。 而一个成功的delete操作将会同时触发一个znode的datawatch和childwatch(因为这样就没有子节点了) , 同时也会触发其父节点的childwatch 。
7)当一个客户端连接到一个新的服务器上时 , watch将会被以任意会话事件触发 。 当与一个服务器失去连接的时候 , 是无法接收到watch的 。 而当client重新连接时 , 如果需要的话 , 所有先前注册过的watch , 都会被重新注册 。 通常这是完全透明的 。 只有在一个特殊情况下 , watch可能会丢失:对于一个未创建的znode的existwatch , 如果在客户端断开连接期间被创建了 , 并且随后在客户端连接上之前又删除了 , 这种情况下 , 这个watch事件可能会被丢失 。
推荐阅读
- 「A1canton」智慧酒店震撼来袭——虚拟现实VR篇,五大技术革新传统酒店
- 「北京头条客户端」科技部:将加大对前沿技术研发的攻关和支持力度
- 『财经涂鸦』三七互娱爆发的秘密:该用技术公司估值模型来看它了
- 2020年你应该关注的8大技术趋势,眺望曙光TVP线上技术闭门会纯享实录
- 十大突破性技术-NMN,叫你如何选择最好的NMN
- CNBC:京东智联云打造欧美企业在华首选技术服务平台
- 鲁信创投■60余家创投机构代表参加新能源与先进制造专场路演活动中国科协科学技术传播中心
- 产业气象站▲固守高端显示技术领先地位,三星、LGD皆弃LCD
- 『接风娱乐』人机对战协作新时期已经来临,提高智能化与人工智能技术趋于结合
- 安卓中国■Optimus技术,联想海外发布新款Legion游戏本,首发Advanced
