1.ZooKeeper投票机制?
本博客
2.客户端对 ZooKeeper 的 ServerList 的轮询机制?
随机,客户端在初始化的过程中,将所有 Server 保存在一个 List 中,然后随机打散,形成一个环。之后从 0 号位开始一个一个使用。
3.一个客户端修改了某个节点的数据,其他客户端能够马上获取到这个最新数据吗?
ZooKeeper 不能确保任何客户端能够获取(即 Read Request)到一样的数据,除非客户端自己要求,方法是客户端在获取数据之前调用 sync。通常情况下(这里所说的通常情况满足:1. 对获取的数据是否是最新版本不敏感,2. 一个客户端修改了数据,其它客户端是否需要立即能够获取最新数据),可以不关心这点。在其它情况下,最清晰的场景是这样:ZK 客户端 A 对 /my_test 的内容从 v1->v2, 但是 ZK 客户端 B 对 /my_test 的内容获取,依然得到的是 v1. 请注意,这个是实际存在的现象,当然延时很短。解决的方法是客户端 B 先调用 sync(), 再调用 getData()。
4.ZooKeeper 对节点的 watch 监听是永久的吗?为什么?
不是。
官方声明:一个 Watch 事件是一个一次性的触发器,当被设置了 Watch 的数据发生了改变的时候,则服务器将这个改变发送给设置了 Watch 的客户端,以便通知它们。为什么不是永久的,举个例子,如果服务端变动频繁,而监听的客户端很多情况下,每次变动都要通知到所有的客户端,这太消耗性能了。一般是客户端执行 getData(“/节点 A”,true),如果节点 A 发生了变更或删除,客户端会得到它的 watch 事件,但是在之后节点 A 又发生了变更,而客户端又没有设置 watch 事件,就不再给客户端发送。在实际应用中,很多情况下,我们的客户端不需要知道服务端的每一次变动,我只要最新的数据即可。
5.ZooKeeper 中使用 watch 的注意事项有哪些?
使用 watch 需要注意的几点:
① Watches 通知是一次性的,必须重复注册.
② 发生 CONNECTIONLOSS 之后,只要在 session_timeout 之内再次连接上(即不发生
SESSIONEXPIRED),那么这个连接注册的 watches 依然在。
④ 对某个节点注册了 watch,但是节点被删除了,那么注册在这个节点上的 watches 都会被移除。
⑤ 同一个 zk 客户端对某一个节点注册相同的 watch,只会收到一次通知。
⑥ Watcher 对象只会保存在客户端,不会传递到服务端。
6.能否收到每次节点变化的通知?
如果节点数据的更新频率很高的话,不能。原因在于:当一次数据修改,通知客户端,客户端再次注册 watch,在这个过程中,可能数据已经发生了许多次数据修改,因此,千万不要做这样的测试:”数据被修改了 n 次,一定会收到 n 次通知”来测试 server 是否正常工作。
7.能否为临时节点创建子节点?
ZooKeeper 中不能为临时节点创建子节点,如果需要创建子节点,应该将要创建子节点的节点创建为永久性节点。
8. 在 getChildren(String path, boolean watch)是注册了对节点子节点的变化,那么子节点的子节点变化能通知吗?
不能通知。
9.创建的临时节点什么时候会被删除,是连接一断就删除吗?延时是多少?
连接断了之后,ZK 不会马上移除临时数据,只有当 SESSIONEXPIRED 之后,才会把这个会话建立的临时数据移除。因此,用户需要谨慎设置 Session_TimeOut。
10.ZooKeeper 集群中服务器之间是怎样通信的?
Leader 服务器会和每一个 Follower/Observer 服务器都建立 TCP 连接,同时为每个 F/O都创建一个叫做 LearnerHandler 的实体。LearnerHandler 主要负责 Leader 和 F/O 之间的网络通讯,包括数据同步,请求转发和 Proposal 提议的投票等。Leader 服务器保存了所有 F/O 的 LearnerHandler。
11.ZooKeeper 是否会自动进行日志清理?如何进行日志清理?
zk 自己不会进行日志清理,需要运维人员进行日志清理。
12. 谈谈你对 ZooKeeper 的理解?
Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题。ZooKeeper 提供的服务包括:分布式消息同步和协调机制、服务器节点动态上下线统一配置管理、负载均衡、集群管理等。
ZooKeeper 提供基于类似于 Linux 文件系统的目录节点树方式的数据存储,空间。Zookeeper 并不是用来专门存储数据的,它的作用主要是用来维护和监控你存储的数据的状态变化,通过监控这些数据状态的变化,从而可以达到基于数据的集群管理
ZooKeeper 节点的数据上限是 1MB。
我们可以认为 Zookeeper=文件系统+通知机制。
13.ZooKeeper 节点类型?
1)Znode 有两种类型:
短暂(ephemeral):客户端和服务器端断开连接后,创建的节点自己删除 。
持久(persistent):客户端和服务器端断开连接后,创建的节点不删除 。
2)Znode 有四种形式的目录节点(默认是 persistent )
(1)持久化目录节点(PERSISTENT)
客户端与 zookeeper 断开连接后,该节点依旧存在 。
(2)持久化顺序编号目录节点(PERSISTENT_SEQUENTIAL)
客户端与 zookeeper 断开连接后,该节点依旧存在,只是 Zookeeper 给该节点名称进行顺
序编号 。
(3)临时目录节点(EPHEMERAL)
客户端与 zookeeper 断开连接后,该节点被删除 。
(4)临时顺序编号目录节点(EPHEMERAL_SEQUENTIAL)
客户端与 zookeeper 断开连接后,该节点被删除,只是 Zookeeper 给该节点名称进行顺序
编号。
14.请说明 ZooKeeper 的通知机制?
客户端会对某个znode建立一个watcher事件,当该znode发生变化时,这些客户端会收到zookeeper的通知,然后客户端可以根据znode变化来做出业务上的改变。
15.ZooKeeper 的监听原理是什么?
在应用程序中,mian()方法首先会创建 zkClient,创建 zkClient 的同时就会产生两个进程,即Listener 进程(监听进程)和connect 进程(网络连接/传输进程),当zkClient 调用getChildren()等方法注册监视器时,connect 进程向 ZooKeeper 注册监听器,注册后的监听器位于ZooKeeper 的监听器列表中,监听器列表中记录了 zkClient 的 IP,端口号以及要监控的路径,一旦目标文件发生变化,ZooKeeper 就会把这条消息发送给对应的zkClient 的Listener()进程,Listener 进程接收到后,就会执行 process()方法,在 process()方法中针对发生的事件进行处理。
16.请说明 ZooKeeper 使用到的各个端口的作用?
2888:Follower 与 Leader 交换信息的端口。
3888:万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的
Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
17. ZooKeeper 的部署方式有哪几种?集群中的角色有哪些?集群最少需要几台机器?
ZooKeeper 的部署方式有单机模式和集群模式,集群中的角色有 Leader 和 Follower,集群最少 3(2N+1)台,根据选举算法,应保证奇数。
19.zookeeper有哪些功能?
20.zookeeper怎么保证主从节点的状态同步?