Zookeeper知识点
一、zookeeper是什么?能做什么?
zookeeper是一个开源的,是用于维护配置信息,命名,提供分布式同步和提供组服务的集中式服务。可以基于zookeeper实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、master选举、分布式锁和分布式队列等功能
二、zookeeper的系统架构是怎么样的?
zookeeper分为服务端(server)和客户端(client),客户端可以连接到整个zookeeper服务的任意服务器上(除非leaderservers参数被显式设置,leader不允许接受客户端连接),客户端使用并维护一个TCP连接,通过这个连接发送请求、接受响应,获取观察的时间以及发送信息
三、zookeeper集群中server有三种角色
leader:负责投票的发起与决议,更新系统状态,写数据
follower:用于接收客户端请求兵用来返回结果,在选主过程中参加投票
observer:可以接受客户端连接,将写请求转发给leader节点,但不参与投票过程,之同步leader状态,主要存在目的就是为了提高读取效率
将server分为三种,是为了避免太多的从节点参与过半写的过程,导致影响性能,这样zookeeper只要使用一个几台机器的小集群就可以实现高性能了,如果要横向扩展的话,只需要增加observer节点即可
四、zookeeper初始化是如何进行leader选举的?
发起投票→收到投票→处理投票→统计投票→改变服务器状态
在集群初始化阶段,只有两台以上的zookeeper启动,才会发生leader选举过程如下:
(1)每个serve发出一个投票。初始选举zookeeper1和zookeeper2都会将自己作为leader服务起来进行投票,每次投票会包含所推举的服务器的(myid,ZXID),此时zookeeper1的投票为(1,0),zookeeper2的投票为(2,0),然后各自将这个投票发给集群中其他机器
(2)收到投票。集群的每个服务器收到投票后,首先判断该票的有效性,如检查是否是本轮投票、是否来自LOOKING状态的服务器
(3)处理投票。每个发起投票的服务器,需要将别人的投票和自己的投票进行比较,规则如下:优先检查ZXID。ZXID比较大的服务器优先作为leader。如果ZXID相同,那么就比较myid。myid较大的服务器作为leader服务器
(4)统计投票。每次投票后,服务器都会统计投票信息,判断是否已经有过半机器接收到相同的投票信息。对于zookeeper1,zookeeper2而言,都统计出集群中已经有两台机器接受了(2,0)的投票信息,此时便认为已经选出zookeeper作为leader
(5)改变服务器状态。一旦确定了leader,每个服务器就会更新自己的状态,如果是follower,那么久变更为FOLLWERING,如果是leader,就变更为LEADING。当新的zookeeper节点zookeeper3启动时,发现已经有leader了,不再选举,直接将直接的状态从LOOKING改为FOLLOWING
五、如果leader挂了,进入崩溃恢复,怎么选举leader?
变更状态→发起投票→接受投票→处理投票→统计投票→改变状态
(1)变更状态。leader挂后,余下的非observer夫妻都会将自己的服务器状态变更为looking,然后开始进入leader选举过程
(2)每个非observer的server会发出一个投票。和启动过程一致
(3)接收来自每个服务器的投票。与启动时过程相同
(4)处理投票。与启动时过程相同
(5)统计投票。与启动时过程相同
(6)改变服务器状态。与启动时过程相同
六、zookeeper有哪些特性呢?
顺序一致性:Leader会根据请求顺序生成ZXID来严格保障请求顺序下发执行
原子性:所有事物请求的处理结果在整个集群中所有机器上的应用情况是一致的,要么成功,要么就失败
单一视图:无论客户端连到哪一个zookeeper服务器上,看到的数据都是一致的
可靠性:一旦服务端成功的应用了一个事物,并完成对客户端的响应,那么该事务所引起的服务端状态变更,将会被一直保留下来
实时性:zookeeper仅仅能保证在这段时间内,客户端最终一定能够从服务端上获取到最新的数据状态
七、zookeeper如何请求的先后顺序?
Leader收到请求之后,会将请求分配一个全局唯一递增的事务ID:zxid ,然后把请求放入到一个FIFO的队列中,之后就会按照FIFO的策略发送给所有的follower
八、zookeeper会有数据不一致的情况发生吗?
还是会有的,因为zookeeper采用的是过半写机制,意味着三台服务器只要有两台写成的,就代表整个集群写成功,如果刚好有请求,打在这台还未写的服务器上就查询不到该数据,就会有数据不一致的情况产生
九、Zookeeper Watcher机制----数据变更通知
zookeeper允许客户端向服务端的某个Znode注册一个Watcher监听,当服务端的一些指定事件触发了这个Watcher,服务端会向指定客户端发送一个时间通知来实现分布式的通知功能,然后客户端根据Watcher,通知状态和事件类型,做出业务上的改变
十、zookeeper下server工作状态
(1)LOOKING:寻找leader状态。当服务器处于该状态时,它会认为当前集群中没有leader,因此需要进入leader选举状态
(2)FOLLOWING:跟随者状态。表明当前服务器角色是Follower
(3)LEADING:领导者状态。表明当前服务器角色是Leader
(4)OBSERVING:观察者状态。表明当前服务器角色是observer
十一、数据同步
整个集群完成leader选举之后,learner(Follower和Observer的统称),会向leader服务器进行注册。当learner服务器向leader服务器完成注册后,进入数据同步环节
十二、zookeeper的数据同步通常分为四类
①直接差异化同步(DIFF同步)
②先回滚在差异化同步(TRUNC+DIFF同步)
③仅回滚同步(TRUNC同步)
④全量同步(SNAP同步)
十三、zookeeper有哪几种部署模式?
单机模式、伪集群模式、集群模式
十四、zookeeper定义的几种权限
(1)CREATE:数据节点创建权限,允许授权对象在Znode下创建子节点
(2)DELETE:直接点删除权限,允许授权对象删除该数据节点的子节点
(3)READ:数据节点的读取权限,允许授权对象访问该数据节点并读取其数据内容或子节点列表等
(4)WRITE:数据节点更新权限,允许授权对象对该数据节点进行更新操作
(5)ADMIN:数据节点管理权限,允许授权对象,对该数据节点进行ACL,相关设置操作
十五、Znode的三种类型
(1)持久节点(persistent node)节点会变持久
(2)临时节点(ephemeral node),客户端断开连接后,zookeeper会自动删除临时节点
(3)顺序节点(sequential node),每次创建顺序节点时,zookeeper都会在路径后面自动添加上10位数字,从1开始,最大是2147483674(2的31次方减一)
十六、Znode的四种形式
(1)持久节点:如create/test/a “hello”,通过create参数指定为持久节点(持久化目录节点)
(2)持久顺序节点:通过create -s 参数指定为顺序节点(持久化顺序编号目录节点)
(3)临时节点:通过create -e 参数指定为顺序节点(临时目录节点)
(4)临时顺序节点:通过create -e -s 参数指定为临时及顺序节点(临时顺序编号目录节点)
十七、Znode里面储存了什么?
Znone包含了储存数据(data)、访问权限(acl)、子节点引用(child)、节点状态信息(stat)
data:Znone储存的业务数据信息
acl:记录客户端对Znone节点的访问权限,如IP等
child:当前节点的子节点引用
stat:包含Znone节点的状态信息,如事务id、版本号、时间戳等等
十八:zookeeper节点类型有哪些?(总体上分为2类,细分4类(如:十六))
持久节点:客户端和服务器断开连接后,创建的节点不删除
临时节点:客户端和服务器断开连接后,创建的节点自己删除