什么是ZooKeeper,你真的了解它吗。我们一起来看看吧~
什么是 ZooKeeperZooKeeper 是 Apache 的一个顶级项目,为分布式应用提供高效、高可用的分布式协调服务,提供了诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知和分布式锁等分布式基础服务。由于 ZooKeeper 便捷的使用方式、卓越的性能和良好的稳定性,被广泛地应用于诸如 Hadoop、HBase、Kafka 和 Dubbo 等大型分布式系统中。
Zookeeper 有三种运行模式:单机模式、伪集群模式和集群模式。
单机模式:
这种模式一般适用于开发测试环境,一方面我们没有那么多机器资源,另外就是平时的开发调试并不需要极好的稳定性。
集群模式:
一个 ZooKeeper 集群通常由一组机器组成,一般 3 台以上就可以组成一个可用的 ZooKeeper 集群了。组成 ZooKeeper 集群的每台机器都会在内存中维护当前的服务器状态,并且每台机器之间都会互相保持通信。
伪集群模式:
这是一种特殊的集群模式,即集群的所有服务器都部署在一台机器上。当你手头上有一台比较好的机器,如果作为单机模式进行部署,就会浪费资源,这种情况下,ZooKeeper 允许你在一台机器上通过启动不同的端口来启动多个 ZooKeeper 服务实例,以此来以集群的特性来对外服务。
Zookeeper 中的角色:
领导者(leader):
负责进行投票的发起和决议,更新系统状态。
跟随者(follower):
用于接收客户端请求并给客户端返回结果,在选主过程中进行投票。
观察者(observer):
可以接受客户端连接,将写请求转发给 leader,但是observer 不参加投票的过程,只是为了扩展系统,提高读取的速度。
1.层次化的目录结构,命名符合常规文件系统规范,类似于 Linux。
2.每个节点在 Zookeeper 中叫做 Znode,并且其有一个唯一的路径标识。
3.节点 Znode 可以包含数据和子节点,但是 EPHEMERAL 类型的节点不能有子节点。
4.Znode 中的数据可以有多个版本,比如某一个路径下存有多个数据版本,那么查询这个路径下的数据就需要带上版本。
5.客户端应用可以在节点上设置监视器。
6.节点不支持部分读写,而是一次性完整读写。
ZooKeeper 的节点特性ZooKeeper 节点是生命周期的,这取决于节点的类型。在 ZooKeeper 中,节点根据持续时间可以分为持久节点(PERSISTENT)、临时节点(EPHEMERAL),根据是否有序可以分为顺序节点(SEQUENTIAL)、和无序节点(默认是无序的)。
持久节点一旦被创建,除非主动移除,不然一直会保存在 Zookeeper 中(不会因为创建该节点的客户端的会话失效而消失)。
Zookeeper 的应用场景ZooKeeper 是一个高可用的分布式数据管理与系统协调框架。基于对 Paxos 算法的实现,使该框架保证了分布式环境中数据的强一致性,也正是基于这样的特性,使得 ZooKeeper 解决很多分布式问题。
值得注意的是,ZooKeeper 并非天生就是为这些应用场景设计的,都是后来众多开发者根据其框架的特性,利用其提供的一系列 API 接口(或者称为原语集),摸索出来的典型使用方法。
数据发布与订阅(配置中心)发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到 ZooKeeper 节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新。例如全局的配置信息,服务式服务框架的服务地址列表等就非常适合使用。
应用中用到的一些配置信息放到 ZooKeeper 上进行集中管理。这类场景通常是这样:应用在启动的时候会主动来获取一次配置,同时在节点上注册一个 Watcher。这样一来,以后每次配置有更新的时候,都会实时通知到订阅的客户端,从来达到获取最新配置信息的目的。
分布式搜索服务中,索引的元信息和服务器集群机器的节点状态存放在 ZooKeeper 的一些指定节点,供各个客户端订阅使用。
分布式日志收集系统这个系统的核心工作是收集分布在不同机器的日志。收集器通常是按照应用来分配收集任务单元,因此需要在 ZooKeeper 上创建一个以应用名作为 path 的节点 P,并将这个应用的所有机器 IP,以子节点的形式注册到节点 P 上。这样一来就能够实现机器变动的时候,能够实时通知到收集器调整任务分配。