什么是Zookeeper?
Zookeeper是用于分布式协调和管理的框架,zookeeper的目的就是封装好容易出错复杂的关键服务,将功能稳定的系统提供给用户。
Zookeeper的职责
1.
命名服务:是指通过指定名字来获取资源或服务器的地址,;利用zookeeper创建一个全局的路径,也就是你唯一的路径,这个路径可以作为一个名字去指向集群中的集群,服务地址,或者是一个远程对象。
2.
配置管理:程序分配在不同电脑上,讲程序的配置信息放在zookeeper的znode上,当有配置发生改变时。可以通知zookeeper的某个znode发生改变,利用watcher,通知给各个客户端,从而更改配置信息。
3.
集群管理:是否有机器退出和加入,选举master,对于机器的退出,所有机器约定在父目录 下创建临时目录,对于新机器的加入,所有机器创建临时顺序编号目录节点。
4.
分布式锁:分为俩类,一个是独占锁,另一个是共享锁,独占锁一次只能给一个线程使用,读写锁是一个写,多个读。
Zookeeper的安装方式
单机模式:在一个节点上安装,往往只能启动框架上的一部分服务
伪分布式:在一个节点上安装,去模拟集群环境,往往能启动框架大部分服务或者全服务。
完全分布式:在分布式环境安装,能启动框架全部服务。
Zookeeper的特点:
Zookeeper本身是一个Znode树,根节点是/,每一个节点都叫做Znode,任何一个节点的路径都是唯一的。任何一个持久节点都可以挂载子节点。Znode树在磁盘和内存中,磁盘为了持久储存,内存为了读写快。Zookeeper把每一个写操作看成一个事务,为事务分配一个编号,为Zxid
Zookeeper节点类型:持久化节点,临时节点,持久化顺序节点,临时顺序节点。
Znode默认大小是1m
Watcher机制:(会在znode上建立一个wacther,当znode发生改变时候,这些client会收到zk的通知,然后对应做出业务的改变,)一次性触发数据改变时;一个watch event会被发送到client,但是client只会接受一次这样的消息。因为server到client是异步的,由于网络的原因导致客户端不能同时刻监听到事件Zookeeper只能保证最终一致性,而不能保证强一致性,,数据监视是由getData和exists方法,getchildren监视子节点,
注册watcher getDa exists getchildren
触发watcher
create delete setData
Zookeeper集群选举方式leader:
每一个zookeeper都会去参加选举,并且每一个都会推荐自己为leader,将自己的的选举信息发送给其他节点进行比较,如果比较失败就会成为follower,如果比较成功继续参加选举,直到选举出leader,其他的节点成为follower。
选举信息包括:
当前节点的最大事务id,自己的myid,控制选举轮数。。
先比最大事务id,谁大谁赢,事务id一样比较myid,谁大谁赢。一个节点要想成为leader就必须胜过一半的节点,过半性。如果一个集群已经选出了leader,剩下节点都会成为follower。
Zookeeper不存在单点故障,当zookeeper一个节点宕机,会选举出另一个leader,所有zookeeper不存在单点故障。
Zookeeper的节点个数是奇数过。
在zookeeper中当节点个数存活不到一半时,该集群不对外提供服务。
Zookeeper的脑裂。
一个集群由于环境因数网络波动产生了俩个leader 这种现象就是脑裂,
Zookeeper是怎么解决脑裂的:
它会对zookeeper每次选举的leader分配一个全局递增的epochid,当出现多个leader时 会保留最新的epochid,并且杀死其他leader。
Zookeeper节点的状态:
voting/looking
- 选举状态
follower
- 追随者/跟随者
leader
- 领导者
observer
- 观察者
观察者:一个节点一旦被视为观察者,就不参加任何选举投票,但是会对选举投票的监听。一般在集群中90的节点都会设置为观察者,会提高选举效率,在一个集群中,观察者是否存活不影响集群的操作
ZAB协议:
ZAB协议是一套专门为zookeeper进行崩溃恢复和原子广播的协议。它是基于2PC算法,利用了 Paxos进行了改进。
原子广播:用2PC算法,二阶段提交,核心思想就是一票否决。
请求阶段,当协调者受到请求后会发给每一个参与者,等待参与者的恢复。
提交阶段:如果每一个参与者都发送的yes,那么协调者要求所有的参与者执行请求,
终止阶段:如果协调者收到只有一个不是yes的那么会认为这个请求不能执行,并且要求每个参与者删除这个请求。
Zookeeper的数据一致性包括
顺序一致性。原子性。单一的系统映像,持久性。
原子广播的流程:原子广播是为了数据的一致性
当leader收到一个请求后,他会记录到本地的日志文件中,如果记录成功,那么就认为该请求可执行,那么会放到队列发送给每一个follower,follower收到以后也会在本地日志文件中记录,记录成功返回leader一个yes,否则返回no,当有一半返回yes时候就执行请求,否则不执行,那么要求所有follower删除这个请求。
如果leader就要执行这个请求:
那么follower会向leader发送信息,要求重新获取刚才的操作,如果因为磁盘满了,日志记录失败,那么leader就和follower频繁的发送信息。
崩溃恢复:当一个集群的leader丢失后,会自动选一个新leader,
当一个节点重新启动时候,
当旧的节点重新启动时候,会找到自己的最大事务id 请求leader判断最大事务id是否一致,如果一致那么说明,在此期间没有进行操作。如果不一致他会请求leader,leader会把中途的操作放在队列里发送给这个节点,让这个节点补齐,在此期间
,该节点不对外进行服务。