用途跟功能不是一个意思咩?给我一个眼神,让我自己体会
2. 面试官:说下什么是命名服务,什么是配置管理,又什么是集群管理吧
「小菜鸡的我(幸好我刷过面试题),无所畏惧」
3. 面试官:你提到了znode节点,那你知道znode有几种类型呢?zookeeper的数据模型是怎样的呢?
「小菜鸡的我(我先想想):」
zookeeper的数据模型
ZooKeeper的视图数据结构,很像Unix文件系统,也是树状的,这样可以确定每个路径都是唯一的。zookeeper的节点统一叫做「znode」,它是可以通过「路径来标识」,结构图如下:
znode的4种类型
根据节点的生命周期,znode可以分为4种类型,分别是持久节点(PERSISTENT)、持久顺序节点(PERSISTENT_SEQUENTIAL)、临时节点(EPHEMERAL)、临时顺序节点(EPHEMERAL_SEQUENTIAL)
4、面试官:你知道znode节点里面存储的是什么吗?每个节点的数据最大不能超过多少呢?
「小菜鸡的我:」
znode节点里面存储的是什么?
Znode数据节点的代码如下
public class DataNode implements Record {
byte data[];
Long acl;
public StatPersisted stat;
private Set<String> children = null;
}
哈哈,Znode包含了「存储数据、访问权限、子节点引用、节点状态信息」,如图:
每个节点的数据最大不能超过多少呢
为了保证高吞吐和低延迟,以及数据的一致性,znode只适合存储非常小的数据,不能超过1M,最好都小于1K。
5、面试官:你知道znode节点上的监听机制嘛?讲下Zookeeper watch机制吧。
「小菜鸡的我:」
Watcher监听机制
Zookeeper 允许客户端向服务端的某个Znode注册一个Watcher监听,当服务端的一些指定事件触发了这个Watcher,服务端会向指定客户端发送一个事件通知来实现分布式的通知功能,然后客户端根据 Watcher通知状态和事件类型做出业务上的改变。
Watcher监听机制的工作原理
Watcher特性总结
6、面试官:你对Zookeeper的数据结构都有一定了解,那你讲下Zookeeper的特性吧
「小菜鸡的我:(我背过书,啊哈哈)」Zookeeper 保证了如下分布式一致性特性:
7、面试官:你刚提到顺序一致性,那zookeeper是如何保证事务的顺序一致性的呢?
「小菜鸡的我:(完蛋了这题不会)」
这道题可以看下这篇文章(本题答案来自该文章):聊一聊ZooKeeper的顺序一致性 https://time.geekbang.org/column/article/239261
ZXID的生成规则如下:
ZXID有两部分组成:
8、面试官:你提到了Leader,你知道Zookeeper的服务器有几种角色嘛?Zookeeper下Server工作状态又有几种呢?
「小菜鸡的我:」
Zookeeper 服务器角色
Zookeeper集群中,有Leader、Follower和Observer三种角色
「Leader」
「Follower」
「Observer」
Zookeeper下Server工作状态
9、面试官:你说到服务器角色是基于ZooKeeper集群的,那你画一下ZooKeeper集群部署图吧?ZooKeeper是如何保证主从节点数据一致性的呢?
「小菜鸡的我:」
ZooKeeper集群部署图
ZooKeeper集群是一主多从的结构:
ZooKeeper如何保证主从节点数据一致性
我们知道集群是主从部署结构,要保证主从节点一致性问题,无非就是两个主要问题:
Zookeeper是采用ZAB协议(Zookeeper Atomic Broadcast,Zookeeper原子广播协议)来保证主从节点数据一致性的,ZAB协议支持「崩溃恢复和消息广播」两种模式,很好解决了这两个问题:
10、面试官:Leader挂了,进入崩溃恢复,是如何选举Leader的呢?你讲一下ZooKeeper选举机制吧
「小菜鸡的我:」
服务器启动或者服务器运行期间(Leader挂了),都会进入Leader选举,我们来看一下~假设现在ZooKeeper集群有五台服务器,它们myid分别是服务器1、2、3、4、5,如图:
服务器启动的Leader选举
zookeeper集群初始化阶段,服务器(myid=1-5)「依次」启动,开始zookeeper选举Leader~
服务器运行期间的Leader选举
zookeeper集群的五台服务器(myid=1-5)正在运行中,突然某个瞬间,Leader服务器3挂了,这时候便开始Leader选举~
11、面试官: 你前面提到在项目中使用过Zookeeper的分布式锁,讲一下zk分布式锁的实现原理吧?
「小菜鸡的我:」Zookeeper就是使用临时顺序节点特性实现分布式锁的。
获取锁过程
释放锁
我们再来看看释放锁的流程,zookeeper的「客户端业务完成或者故障」,都会删除临时节点,释放锁。如果是任务完成,Client1会显式调用删除lock1的指令如果是客户端故障了,根据临时节点得特性,lock1是会自动删除的lock1节点被删除后,Client2可开心了,因为它一直监听着lock1。lock1节点删除,Client2立刻收到通知,也会查找locks下面的所有临时顺序子节点,发下lock2是最小,就获得锁。
同理,Client2获得锁之后,Client3也对它虎视眈眈,啊哈哈~
12. 面试官:好的,最后一道题,你说说dubbo和Zookeeper的关系吧,为什么选择Zookeeper作为注册中心?
小菜鸡的我(答了这么多道题,不会还不给我过吧?):
dubbo的注册中心可以选Zookeeper,memcached,redis等。为什么选择Zookeeper,因为它的功能特性咯~