1,ACL:Access Control List
权限控制
world:默认方式,相当于全世界都能访问
auth:代表已经认证通过的用户(cli 中可以通过 addauth digest user:pwd 来添加当
前上下文中的授权用户)
digest:即用户名:密码这种方式认证,这也是业务系统中最常用的
ip:使用 Ip 地址认证
ACL 支持权限:
CREATE: 能创建子节点
READ:能获取节点数据和列出其子节点
WRITE: 能设置节点数据
DELETE: 能删除子节点
ADMIN: 能设置权限
2,watcher:监听
这个是在zk中很重要的一个概念,也是在实际的开发工作中经常用到,解决疑难杂症的一个解决方案,举一个场景:在分布式系统中,经常会碰到服务不可用,实时监听并剔除掉这个时候就需要用到协调器的监听,监听之后就在自己的服务列表中剔除,并通知用到该服务的消费者,告知这个服务不可用了。
看个例子:在my06这个服务器上添加一个临时节点songlj,内容是111
create -e /songlj 111
添加一个监听事件www
get /songlj www
image.png
接下来在my07这个服务器上修改节点songlj内容为222
set /songlj 222
image.png
在my06就会接受到NodeDataChanged监听事件,删除事件是:NodeDeleted
image.png image.png
接收到事件之后就可以做自己想做的事情了
ZAB协议:zookeeper原子广播
Zookeeper 的核心是原子广播,这个机制保证了各个 server 之间的同步。实现这个机制的协议叫做 Zab 协议。Zab 协议有两种模式,它们分别是恢复模式和广播模式。
当服务启动或者在领导者崩溃后,Zab 就进入了恢复模式,当领导者被选举出来,且大多数 server 的完成了和 leader 的状态同步以后,恢复模式就结束了。状态同步保证了 leader 和 server 具有相同的系统状态。一旦 leader 已经和多数的 follower 进行了状态同步后,他就可以开始广播消息了,即进入广播状态。
Leader选举
首先要明确zookeeper规定,可用server大于集群半数以上,zk集群才能正常工作,这样就要求zk集群是奇数最好,这里就不再赘述为什么是奇数,leader选举是这样的
#######1,启动的时候的leader选举过程:
选取3台机器组成的服务器集群为例。在集群初始化阶段,当有一台服务器Server1启动时,其单独无法进行和完成Leader选举,当第二台服务器Server2启动时,此时两台机器可以相互通信,每台机器都试图找到Leader,于是进入Leader选举过程。选举过程如下
(1) 每个Server发出一个投票。由于是初始情况,Server1和Server2都会将自己作为Leader服务器来进行投票,每次投票会包含所推举的服务器的myid和ZXID,使用(myid, ZXID)来表示,此时Server1的投票为(1, 0),Server2的投票为(2, 0),然后各自将这个投票发给集群中其他机器。
(2) 接受来自各个服务器的投票。集群的每个服务器收到投票后,首先判断该投票的有效性,如检查是否是本轮投票、是否来自LOOKING状态的服务器。
(3) 处理投票。针对每一个投票,服务器都需要将别人的投票和自己的投票进行PK,PK规则如下
· 优先检查ZXID。ZXID比较大的服务器优先作为Leader。
· 如果ZXID相同,那么就比较myid。myid较大的服务器作为Leader服务器。
对于Server1而言,它的投票是(1, 0),接收Server2的投票为(2, 0),首先会比较两者的ZXID,均为0,再比较myid,此时Server2的myid最大,于是更新自己的投票为(2, 0),然后重新投票,对于Server2而言,其无须更新自己的投票,只是再次向集群中所有机器发出上一次投票信息即可。
(4) 统计投票。每次投票后,服务器都会统计投票信息,判断是否已经有过半机器接受到相同的投票信息,对于Server1、Server2而言,都统计出集群中已经有两台机器接受了(2, 0)的投票信息,此时便认为已经选出了Leader。
(5) 改变服务器状态。一旦确定了Leader,每个服务器就会更新自己的状态,如果是Follower,那么就变更为FOLLOWING,如果是Leader,就变更为LEADING。
#######2,运行时,leader挂了的leader选举
2. 服务器运行时期的Leader选举
一旦Leader服务器挂了,那么整个集群将暂停对外服务,进入新一轮Leader选举,其过程和启动时期的Leader选举过程基本一致。假设正在运行的有Server1、Server2、Server3三台服务器,当前Leader是Server2,若某一时刻Leader挂了,此时便开始Leader选举。选举过程如下
(1) 变更状态。Leader挂后,余下的非Observer服务器都会讲自己的服务器状态变更为LOOKING,然后开始进入Leader选举过程。
(2) 每个Server会发出一个投票。在运行期间,每个服务器上的ZXID可能不同,此时假定Server1的ZXID为123,Server3的ZXID为122;在第一轮投票中,Server1和Server3都会投自己,产生投票(1, 123),(3, 122),然后各自将投票发送给集群中所有机器。
接下来就与启动的时候一致。
为什么优先选择ZXID大的呢?
ZXID是什么?
为了保证事务的顺序一致性,zookeeper采用了递增的事务id号(zxid)来标识事务
当leader挂了的时候,比较其他server哪个server上的数据比较新的依据,当leader接受写操作,只同步了一个server,这个时候挂了,那么这个最新的server就是下一个leader
网友评论