一.概述
ZooKeeper 是什么?
- 是一个开源的分布式协调服务。使用分布式系统就无法避免对节点管理的问题(需要实时感知节点的状态、对节点进行统一管理等等),而由于这些问题处理起来可能相对麻烦和提高了系统的复杂性,ZooKeeper作为一个能够通用解决这些问题的中间件就应运而生了。
- 从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,一旦这些数据的状态发生变化,Zookeeper 就 将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。
- 实现原理:zookeeper=文件系统+通知机制。
Zookeeper的作用(应用场景)?
- 统一配置管理:比如现在有A.yml,B.yml,C.yml配置文件,里面有一些公共的配置,但是如果后期对这些公共的配置进行修改,就需要修改每一个文件,还要重启服务器。比较麻烦,现在将这些公共配置信息放到ZK中,修改ZK的信息,会通知A,B,C配置文件。多方便
- 统一命名服务:这个的理解其实跟域名一样,在某一个节点下放一些ip地址,我现在只需要访问ZK的一个Znode节点就可以获取这些ip地址。
- 同一集群管理:分布式集群中状态的监控和管理,使用Zookeeper来存储。
- 分布式协调:这个是我们最常用的,比如把多个服务提供者的信息放在某个节点上,服务的消费者就可以通过ZK调用。
- 服务节点动态上下线:如何提供者宕机,就会删除在ZK的节点,然后ZK通知给消费者。
- 软负载均衡
- 动态选举Master:Zookeeper会每次选举最小编号的作为Master,如果Master挂了,自然对应的Znode节点就会删除。然后让新的最小编号作为Master,这样就可以实现动态选举的功能了。
- 分布式锁(后续出文章讲)
二.原理
之所以能做上述功能,主要是归功于ZK的文件系统和通知机制。下面我们来分析这两个机制
文件系统:
ZooKeeper的数据结构,跟Unix文件系统非常类似,可以看做是一颗树,每个节点叫做Znode。每一个Znode只能存1MB数据。数据只是配置信息。每一个节点可以通过路径来标识,结构图如下:
Znode节点主要有4中类型:
- 临时目录节点:客户端与Zookeeper断开连接后,该节点被删除
- 临时顺序编号目录节点:基本特性同临时节点,只是增加了顺序属性,节点名后边会追加一个由父节点维护的自增整型数字。
- 持久化目录节点:客户端与Zookeeper断开连接后,该节点依旧存在
- 持久化顺序编号目录节点:基本特性同持久节点,只是增加了