一、zk是什么:
1、个人理解zk=文件系统+通知机制。
2、zk是一个分布式的应用程序协调服务,我理解的就是有两台集器A、B,A对一个数据进行了操作,B是如何知道的,这个就需要zk的支持。
3、 分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协 调/通知、集群管理、Master 选举、配置维护,名字服务、分布式同步、分布式锁和分布式队列 等功能。
二、zk的初始化选举机制:
1、首先一般选举里面都有2N+1台集器,如果是三台机器的A、B、C,A和B都会选举自己,每次投票会包括推举的服务器的myid和zxid,使用(myid,zxid)来表示。
2、集群中的服务器都接受到投票时,首先判断投票的有效性,如检查是不是本轮的投票,是否是looking状态的机器。
3、处理投票,比较zxid大小,越大权重越大,如果相同再比较myid。
4、统计投票。
5、改变服务器的状态。
ps:注意:在这个过程中,有个重要的数据结构,electionEpoch即逻辑时钟,用来判断是否在同一轮选举周期中,每次进入新的一轮投票都会自增,还有一个state,表示当前服务器的状态。
三、zk的运行过程中leader崩溃选举机制:
1、状态变更,余下所有的observing服务器都会将自己的服务器状态变成looking状态。
2、每个server会发起投票。
3、接受各个服务器的投票。
4、处理投票。
5、统计投票。
6、改变服务器的状态。
注意:其实崩溃选举机制和初始化差不多,但是值得注意一点是每个机器中的electionEpoch,也就是逻辑时钟,如果有机器宕机的话,这个数值是和正常的机器不一样的,所以需要判断这个值不是正常值的机器投票数据是否是正常的。
四、zk中的znode节点:
1、四种类型:(1)、持久化目录节点。(2)、持久化顺序编号目录节点。(3)、临时目录节点。(4)、临时顺序编号目录节点。
五、zk中的监控原理:
1、zk类似于linux中的目录节点树方式的数据存储,即分层命名空间,zk并不是专门存储数据的,它的作用是主要是维护和监控存储数据的状态变化,通过监控这些数据状态的变化,从而可以达到基于数据的集群管理,zk中的杰点的数据上限时1M。
2、zk中的wathc机制:client端会对某个znode建立一个watcher事件,当该znode发生变化时,这些client会收到zk的通知,然后client可以根据znode变化来做出业务上的改变等。
3、图说明:
4、main方法会创建zkClient,在创建zkClient的时候,会创建出listener进程和connect进程。一个是监控进程一个是网络连接进程。当zkClient调用getChildren等方法注册监听器的时候,connect进程向zk注册监听器,注册后的缉监听器位于zk的监听器列表中,监听器列表中记录了zkClient的ip地址,端口号,要监控的目录,一旦目标文件发生了改变,zk就会把这条消息发送给对应的zkClient的listener进程,listener进程接受到后,就会执行process方法。在process方法中针对发生的事件进行处理。
六、zk的职者:
1、命名服务:命名服务是指通过指定的名字来获取资源或者服务的地址,利用zk创建一个全局的路径,即是唯一的路径,这个路径就可以作为一个名字,指向集群中的集群,提供的服务的地址,或者一个远程的对象等等。
2、配置管理(文件系统、通知机制):程序分布式的部署在不同的机器上,将程序的配置信息放在zk的znode下,当有配置发生改变时,也就是znode发生变化时,可以通过改变zk中某个目录节点的内容,利用watcher通知给各个客户端,从而更改配置。
3、集群管理:是否有机器退出和加入、选举master。对于机器的退出,所有机器约定在父目录下创建临时目录,对于新机器的加入,所有机器创建临时顺序编号目录节点。
4、分布式锁:分为两类,一个是保持独占:客户端需要的时候,就去通过createznode的方式实现,所有客户端都去创建/distribute_lock节点,用完就删除节点就行了。一个是控制时序,/distribute_lock已经预先存在,所有客户端在它下面创建临时顺序编号目录节点。主要流程是:客户端在获取分布式锁的时候在locker节点下创建临时顺序节点,释放锁的时候就删除,客户端首先调用createZnode放在在locker创建临时顺序节点,然后调用getChildren来获取locker下面的所有子节点,此时不用设置watch,客户端获取了所有子节点的path之后,反正最后要找到最小序号的那个节点,调用exist方法,同时对其注册事件监听器
5、队列管理:两种类型的队列,一种是同步队列,一个是按照FIFO方式进行入队和出队,第二种保证了队列消息的不会丢失,因为会在特定的目录下创建一个persistent_sequential节点,创建成功时watcher通知等待的队列,队列删除序列号最小的节点,此场景下,zk中的znode用于消息存储,znode存储的数据就是消息队列中的消息内容,sequential序列号就是消息的编号,按序列取出即可。
七、zk中的数据复制:
1、作用:(1)容错。(2)提高系统的扩展功能。(3)提高性能。
2、数据复制分为两种:
(1)、写主,对数据的修改提交给指定节点,读没有限制,可以在任意的节点读取数据。
(2)、写任意:对数据的修改提交给任意的节点,读也是任意节点。
八、zk的工作原理:
1、核心就是原子广播。在ZooKeeper中所有的事务请求都由一个主服务器也就是Leader来处理,其他服务器为Follower,Leader将客户端的事务请求转换为事务Proposal,并且将Proposal分发给集群中其他所有的Follower,然后Leader等待Follwer反馈,当有 过半数(>=N/2+1) 的Follower反馈信息后,Leader将再次向集群内Follower广播Commit信息,Commit为将之前的Proposal提交。
2、保证数据的一致性:
(1)、顺序的一致性。
(2)、原子性。
(3)、单一的系统映像。
(4)、持久性。
3、ZAB协议的两种实现方式:
(1)、恢复模式:当服务启动或在leader崩溃后,ZAB就进入了恢复模式,在leader选举出来之前,且大多数server完成和leader的状态同步以后,恢复模式就结束了。在这个过程中,要保证被leader提交的proposal最终被所有的follower执行,确保那些只在leader提出的proposal被丢弃。
(2)、广播模式:即leader提出一个决议,由follower进行投票,leader对投票结果进行计算决定是否通过决议,如果通过执行该决议,否则什么都不做。
九、zk的watch机制:
1、一次性触发数据改变时,一个watch event会被发送到client,但是client只会接收到一次这样的消息。
2、watch event异步发送到watcher的通知事件从server发送到client是异步的,但是可能由于网络延迟原因,所有导致客户端在不同时刻监听到事件,zk只保证最终的一致性,而无法保证强一致性。
3、数据监视由getData和exists方法,getchildren设置了子节点监视。
4、注册watcher:getData、exists、getChildren。
5、触发wathcer:create、delete、setData。