1、zookeeper是什么框架?
ZooKeeper 是Hadoop下的一个子项目,它是一个针对大型分布式系统的可靠协调系统(服务);它提供的功能包括:配置维护、名字服务、分布式同步、组服务等; 它的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
Zookeeper一个最常用的使用场景就是用于担任服务生产者和服务消费者的注册中心,服务生产者将自己提供的服务注册到Zookeeper中心,服务的消费者在进行服务调用的时候先到Zookeeper中查找服务,获取到服务生产者的详细信息之后,再去调用服务生产者的内容与数据,简单示例图如下:
2、zookeeper原理和适用场景?
3、使用什么协议?
集群间通过
Zab协议
(Zookeeper Atomic Broadcast)来保持数据的一致性;
Zab协议包含两个阶段:leader election
阶段和Atomic Brodcast
阶段。a) 集群中将选举出一个leader,其他的机器则称为follower,所有的写操作都被传送给leader,并通过brodcast将所有的更新告诉给follower。
b) 当leader崩溃或者leader失去大多数的follower时,需要重新选举出一个新的leader,让所有的服务器都恢复到一个正确的状态。
c) 当leader被选举出来,且大多数服务器完成了 和leader的状态同步后,leadder election 的过程就结束了,就将会进入到Atomic brodcast
的过程。
d)Atomic Brodcast
同步leader和follower之间的信息,保证leader和follower具有形同的系统状态。
4、说说分布式一致性算法Paxos
太难了,我也不会啊
5、说一说选举算法及流程
当leader崩溃或者leader失去大多数的follower,这时候zk进入恢复模式,恢复模式需要重新选举出一个新的leader,让所有的Server都恢复到一个正确的状态。Zk的选举算法使用
ZAB协议
:
- 选举线程由当前Server发起选举的线程担任,其主要功能是对投票结果进行统计,并选出推荐的Server;
- 选举线程首先向所有Server发起一次询问(包括自己);
- 选举线程收到回复后,验证是否是自己发起的询问(验证
zxid
是否一致),然后获取对方的id(myid)
,并存储到当前询问对象列表中,最后获取对方提议的leader相关信息(id,zxid),并将这些信息存储到当次选举的投票记录表中;- 收到所有Server回复以后,就计算出zxid最大的那个Server,并将这个Server相关信息设置成下一次要投票的Server;
- 线程将当前
zxid
最大的Server设置为当前Server要推荐的Leader,如果此时获胜的Server获得n/2 + 1
的Server票数, 设置当前推荐的leader为获胜的Server,将根据获胜的Server相关信息设置自己的状态,否则,继续这个过程,直到leader被选举出来。通过流程分析我们可以得出:要使Leader获得多数Server的支持,则Server总数最好是奇数
2n+1
,且存活的Server的数目不得少于n+1
6、zookeeper有哪几种节点类型?
PERSISTENT
持久化节点
PERSISTENT_SEQUENTIAL
顺序自动编号持久化节点,这种节点会根据当前已存在的节点数自动加 1EPHEMERAL` 临时节点, 客户端session超时这类节点就会被自动删除
EPHEMERAL_SEQUENTIAL
临时自动编号节点
7、zookeeper对节点的watch监听通知是永久的吗?
不是。
不支持用持久Watcher的原因很简单,如果Watcher的注册是持久的,那么必然导致服务端的每次数据更新都会通知到客户端——这在数据变更非常频繁且监听客户端特别多的场景下,ZooKeeper无法保证性能。
8、有哪几种部署模式?
9、集群中的机器角色都有哪些?
启动 Zookeeper 服务器集群环境后,多个 Zookeeper 服务器在工作前会选举出一个
Leader
。选举出 leader 前,所有 server 不区分角色,都需要平等参与投票(ObServer
除外,不参与投票);
选主过程完成后,存在以下几种角色(节点):
角色 描述 领导者(leader) 一个ZooKeeper集群同一时间只会有一个实际工作的Leader,它会发起并维护与各Follwer及Observer间的心跳。所有的写操作必须要通过Leader完成再由Leader将写操作广播给其它服务器。 跟随者(Follower) 一个ZooKeeper集群可能同时存在多个Follower,它会响应Leader的心跳。Follower可直接处理并返回客户端的读请求,同时会将写请求转发给Leader处理,并且负责在Leader处理写请求时对请求进行投票。 观察者(Observer) 角色与Follower类似,但是无投票权。
10、集群最少要几台机器,集群规则是怎样的
至少需要3台,我们知道在Zookeeper中 Leader 选举算法采用了Zab协议。Zab核心思想是当多数 Server 写成功,则任>务数据写成功。
①如果有3个Server,则最多允许1个Server 挂掉。
②如果有4个Server,则同样最多允许1个Server挂掉。既然3个或者4个Server,同样最多允许1个Server挂掉,那么它们的可靠性是一样的,所以选择奇数个ZooKeeper Server即可,这里选择3个Server。
11、集群如果有3台机器,挂掉一台集群还能工作吗?挂掉两台呢?
同上
12、集群支持动态添加机器吗?
截止3.4.3版本的zookeeper,还不支持这个功能,在3.5.0版本开始,支持动态加机器了,期待下吧: https://issues.apache.org/jira/browse/ZOOKEEPER-107
13、ZooKeeper主要特点?
1)、最终一致性:为客户端展示同一视图,这是 ZooKeeper 最重要的性能。
2)、可靠性:如果消息被一台服务器接受,那么它将被所有的服务器接受。
3)、实时性:ZooKeeper 不能保证两个客户端同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。
4)、等待无关(wait-free):慢的或者失效的 client 不干预快速的client的请求。
5)、原子性:更新只能成功或者失败,没有中间其它状态。
6)、顺序性:对于所有Server,同一消息发布顺序一致。
14、chubby是什么,和zookeeper比你怎么看?
15、说几个zookeeper常用的命令。
16、zookeeper watch机制
所有对 ZooKeeper 的读操作,都可附带一个 Watch 。一旦相应的数据有变化,该 Watch 即被触发。
Watch 有如下特点:
1.主动推送
:Watch被触发时,由 ZooKeeper 服务器主动将更新推送给客户端,而不需要客户端轮询。
2.一次性
:数据变化时,Watch 只会被触发一次。如果客户端想得到后续更新的通知,必须要在 Watch 被触发后重新注册一个 Watch。
3.可见性
:如果一个客户端在读请求中附带 Watch,Watch 被触发的同时再次读取数据,客户端在得到 Watch 消息之前>肯定不可能看到更新后的数据。换句话说,更新通知先于更新结果。
4.顺序性
:如果多个更新触发了多个 Watch ,那 Watch 被触发的顺序与更新顺序一致。
参考