一:ZooKeeper 简介

ZooKeeper是一个分布式的,开源的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop(分布式系统基础架构)和Hbase(分布式数据库)的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务、分布式锁等。

ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。(服务的注册中心)

ZooKeeper包含一个简单的原语集,提供Java和C的接口。

Zookeeper是一个维护配置信息、命名、提供分布式同步和提供群组服务的高性能分布式系统协调服务。它暴露公共的服务:像命名、配置管理、同步、和群组服务。

二:ZooKeeper 的作用

        在我们的应用中除了代码外,还有一些就是各种配置。比如数据库连接等。一般我们都是使用配置文件的方式,在代码中引入这些配置文件。当我们只有一种配置,只有一台服务器,并且不经常修改的时候,使用配置文件是一个很好的做法.

        但是如果我们配置非常多,有很多服务器都需要这个配置,这时使用配置文件就不是个好主意了。这个时候往往需要寻找一种集中管理配置的方法,我们在这个集中的地方修改了配置,所有对这个配置感兴趣的都可以获得变更。

        Zookeeper 就是这种服务,它使用 Zab 这种一致性协议来提供一致性。现在有很多开源项目使用 Zookeeper 来维护配置,在开源的消息队列 Kafka 中,使用 Zookeeper 来维护 broker 的信息。在 Alibaba 开源的 SOA (面向服务的架构) Dubbo 中也广泛的使用 Zookeeper 管理一些配置来实现服务治理。

三:区别

mvc结构的服务调用:

        service<--调用--controller

分布式结构的服务调用:

名字服务

        名字服务这个就很好理解了。比如为了通过网络访问一个系统,我们得知道对方的 IP 地址,但是 IP 地址对人非常不友好,这个时候我们就需要使用域名来访问。但是计算机是不能是域名的。怎么办呢?

        如果我们每台机器里都备有一份域名到 IP 地址的映射,这个倒是能解决一部分问题,但是如果域名对应的 IP 发生变化了又该怎么办呢?

        于是我们有了 DNS 这个东西。我们只需要访问一个大家熟知的(known)的点,它就会告诉你这个域名对应IP 是什么。在我们的应用中也会存在很多这类问题,特别是在我们的服务特别多的时候,如果我们在本地保存服务的地址的时候将非常不方便,但是如果我们只需要访问一个大家都熟知的访问点,这里提供统一的入口,那么维护起来将方便得多了。

分布式锁

        目前几乎很多大型网站及应用都是分布式部署的,在一个分布式环境中,为了提高可靠性,集群的每台服务器上都部署着同样的服务。但是,一件事情如果集群中的每个服务器都进行的话,那相互之间就要协调,编程非常复杂。为了防止分布式系统中的多个进程之间相互干扰,我们需要一种分布式协调技术来对这些进程进行调度。

        而这个分布式协调技术的核心就是来实现这个分布式锁。

        保证在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行。

集群管理

        在分布式的集群中,经常会由于各种原因,比如硬件故障,软件故障,网络问题,有些节点会进进出出。有新的节点加入进来,也有老的节点退出集群。这个时候,集群中其他机器需要感知到这种变化,然后根据这种变化做出对应的决策。

        比如我们是一个分布式存储系统,有一个中央控制节点负责存储的分配,当有新的存储进来的时候我们要根据现在集群目前的状态来分配存储节点。

        这个时候我们就需要动态感知到集群目前的状态。还有,比如一个分布式的 SOA 架构中,服务是一个集群提供的,当消费者访问某个服务时,就需要采用某种机制发现现在有哪些znode节点可以提供该服务(这也称之为服务发现,

        比如 Alibaba 开源的 SOA 框架 Dubbo 就采用了 Zookeeper 作为服务发现的底层机制)。还有开源的 Kafka 队列也采用了 Zookeeper 作为 Cosnumer 的上下线管理。SpringCloudAlibaba则默认使用nacos作为服务注册中心

四:Zookeeper 的存储结构

Znode

  •         Zookeeper 底层是一套数据结构。这个存储结构是一个树形结构,其上的每一个节点,
  • 我们称之为“znode”
  •         zookeeper 中的数据是按照“树”结构进行存储的。而且 znode 节点还分为 4 中不同的类
  • 型。
  •         每一个 znode 默认能够存储 1MB 的数据(对于记录状态性质的数据来说,够了)
  •         可以使用 zkCli 命令,登录到 zookeeper 上,并通过 ls、create、delete、get、set 等命令操作这些 znode 节点
  • Znode 节点四种类型

    •         两个持久节点:

                PERSISTENT 持久化节点: 所谓持久节点,是指在节点创建后,就一直存在,直到有删除操作来主动清除这个节点。否则不会因为创建该节点的客户端会话失效而消失。

               PERSISTENT_SEQUENTIAL 持久顺序节点:这类节点的基本特性和上面的节点类型是一致的。额外的特性是,在 ZK 中,每个父节点会为他的第一级子节点维护一份时序,会记录每个子节点创建的先后顺序。基于这个特性,在创建子节点的时候,可以设置这个属性,那么在创建节点过程中,ZK 会自动为给定节点名加上一个数字后缀,作为新的节点名。这个数字后缀的范围是整型的最大值。 在创建节点的时候只需要传入节点 “/test_”,这样之后,zookeeper 自动会给”test_”后面补充数字。

        两个临时节点:             

        EPHEMERAL 临时节点:和持久节点不同的是,临时节点的生命周期和客户端会话绑定。也就是说,如果客户端会话失效,那么这个节点就会自动被清除掉(类似于request的生命周期)。注意,这里提到的是会话失效,而非连接断开。另外,在临时节点下面不能创建子节点.这里还要注意一件事,就是当你客户端会话失效后,所产生的节点也不是一下子就消失了,也要过一段时间,大概是 10 秒以内,本机操作生成节点,在服务器端用命令来查看当前的节点数目,你会发现客户端已经 stop,但是产生的节点还在。

        EPHEMERAL_SEQUENTIAL 临时自动编号节点:此节点是属于临时节点,不过带有顺序,客户端会话结束节点就消失。