1. zookeeper的六大应用场景:
A. 数据的发布和订阅:一方发布数据,另一方得到数据
a) 数据的订阅有2种方法:推模式和拉模式。
a) 推模式:服务器主动向客户推送消息。
b) 拉模式:客户端主动去服务器获取数据(通常为定时轮询的方式)
b) 发布者将数据发布到zk集群节点上,订阅者通过告知服务器,对该节点感兴趣,则当服务器的该节点数据发生变化时,会通知客户端,则客户端,可以去服务器获取信息。
B. 负载均衡
a. DB在启动时,先在zk上注册成一个临时节点,(永久节点,临时节点),当db不可用时,节点会自动从zk删除,则zk上的服务列表是最新的可用列表
b. 客户端在读写db时,先去zk中得到所有可用的db连接信息(一张列表),并且随机选择一个与之建立连接。当客户端发现该链接不可用时,可再次从zk获取连接信息,再随机选择一个db与之连接。
C. 命名服务
即提供名称的服务,例如数据库表格id,常用的为2中id,一种是自动增长的id,一种是uuid。前者:局限于单库表中使用,不能再分布式中使用。后者:可在分布式中使用,但是id没有规律可循。
我们可借用zk来生成一个顺序增长的,可在集群环境下使用的id。
D. 分布式协调/通知
心跳检测:zk让所有机器都注册一个临时节点,通过ping该主机的方式,得到该主机是否可用,不可用的,则临时节点会自动删除。
E.配置管理
2. Zk的五大功能:
A.命令服务:
1) .树形名称结构
2) 类似于JNDI,均可以将目录结构关联到对应的资源,但是zk的NameService还可以形成不重复的名称(类似PK)且不关联资源
B.配置管理:
将配置信息保存在zk的某个目录节点中,所有server监控配置的信息状态,若变化,则从zk中获取新的配置信息应用到系统中。
C.集群管理:(group Members)
1) .1台server宕机,其他的server知道
原因:每个server创建目录节点的父节点上调用getChildren(String path,Boolean boolean);
2) LeaderElection:最小编号的server为master,可以避免单点故障。
原因:每个server创建一个Ephenmeral_sequential的目录节点,可编号,不断的选出最新编号,从而实现动态选择master。
D.共享锁:
原因:它在跨进程、不同的server中,不易实现,但是在zk中易实现。
方法:
有了zookeeper的一致性文件系统,锁的问题变得容易。锁服务可以分为两类,一个是保持独占,另一个是控制时序。
对于第一类,我们将zookeeper上的一个znode看作是一把锁,通过createznode的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。用完删除掉自己创建的distribute_lock 节点就释放出锁。
对于第二类, /distribute_lock 已经预先存在,所有客户端在它下面创建临时顺序编号目录节点,和选master一样,编号最小的获得锁,用完删除,依次方便。
E.队列管理:两种实现方式:
1) .当一个队列的成员都到齐时,该队列才可用,否则一直处于等待状态,此为同步队列
2) 队列按FIFO方式进行入队和出队的操作,实现生产者和消费者模型。
3.zk的角色描述:
4.Leader的主要功能:
1) .恢复数据;
2) .维持与Learner的心跳,接收Learner请求并判断Learner的请求消息类型;
3) .Learner的消息类型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根据不同的消息类型,进行不同的处理。
PING 消息是指Learner的心跳信息;
REQUEST消息是Follower发送的提议信息,包括写请求及同步请求;
ACK消息是 Follower的对提议的回复,超过半数的Follower通过,则commit该提议;
REVALIDATE消息是用来延长SESSION有效时间。
5.Follower主要有四个功能:
1).向Leader发送请求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息);
2).接收Leader消息并进行处理;
3).接收Client的请求,如果为写请求,发送给Leader进行投票;
4).返回Client结果。