天天看点

ZooKeeper 简介和使用场景

一、前言

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等(来源于百度百科)。

二、使用场景

  • 分布式配置中心(disconf)

    Distributed Configuration Management Platform(分布式配置管理平台) ,它是专注于各种分布式系统配置管理 的通用组件/通用平台, 提供统一的配置管理服务,是一套完整的基于zookeeper的分布式配置统一解决方案。

    流程如下图所示

    ZooKeeper 简介和使用场景

    启动事件A: 以下按顺序发生。

    A3:扫描静态注解类数据,并注入到配置仓库里。

    A4+A2:根据仓库里的配置文件、配置项,去 disconf-web 平台里下载配置数据。这里会有主备竞争

    A5:将下载得到的配置数据值注入到仓库里。

    A6:根据仓库里的配置文件、配置项,去ZK上监控节点。

    A7+A2:根据XML配置定义,到 disconf-web 平台里下载配置文件,放在仓库里,并监控ZK节点。这里会有主备竞争。

    A8:A1-A6均是处理静态类数据。A7是处理动态类数据,包括:实例化配置的回调函数类;将配置的值注入到配置实体里。

    更新配置事件B: 以下按顺序发生。

    B1:管理员在 Disconf-web 平台上更新配置。

    B2:Disconf-web 平台发送配置更新消息给ZK指定的节点。

    B3:ZK通知 Disconf-cient 模块。

    B4:与A4一样。

    B5:与A5一样。

    B6:基本与A4一样,唯一的区别是,这里还会将配置的新值注入到配置实体里。

    主备机切换事件C: 以下按顺序发生。

    C1:发生主机挂机事件。

    C2:ZK通知所有被影响到的备机。

    C4:与A2一样。

    C5:与A4一样。

    C6:与A5一样。

    C7:与A6一样。

    由以上流程可知,zookeeper在disconf中的主要作用是,存储数据和提供数据变更通知(watch机制)及挂机通知(临时节点特性)。

  • 服务注册与发现(dubbo)

    Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成。

    ZooKeeper 简介和使用场景

    Provider 暴露服务的服务提供方

    Consumer 调用远程服务的服务消费方

    Registry 服务注册与发现的注册中心

    Monitor 统计服务的调用次数和调用时间的监控中心

    Container 服务运行容器

    Dubbo目前支持4种注册中心,(multicast zookeeper redis simple)推荐使用Zookeeper注册中心。

    zookeeper在dubbo中的作用主要是服务注册和发现,Consumer在启动时向Registry订阅需要的服务获取Provider列表,根据配置的服务调用策略选择合适的Provider访问。同时,如果Provider掉线,临时节点被删除,Registry会通知Consumer更新服务列表。这里用的是zookeeper的临时节点特性和watch机制。

  • 服务协调(kafka)

    Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。

    Kafka 集群中有一个 broker 会被选举为 Controller,负责管理集群 broker 的上下线,所有 topic 的分区副本分配和 leader 选举等工作。Controller 的管理工作都是依赖于 Zookeeper 的。

Zookeeper在Kafka集群中主要用于协调管理,主要作用:

  1. Kafka将元数据信息(broker,topic,partition)保存在Zookeeper中
  2. 通过Zookeeper的协调管理来实现整个kafka集群的动态扩展
  3. 实现整个集群的负载均衡
  4. Producer通过 Zookeeper 感知 partition 的Leader
  5. 保存Consumer消费的状态信息
  6. 通过 Zookeeper管理集群配置,选举 Kafka Leader,以及在 Consumer Group 发生变化时进行 Rebalance

同样也是用了临时节点特性、watch机制还有选举

  • 分布式锁

    什么是分布式锁?

    应用分布式部署,不同进程的线程对同一资源改变,需要保证先后顺序。在同一个进程中,我们可以通过ReentrantLock和synchronized锁住资源,在不同进程中,线程级的锁已经失效。

分布式锁需要保证公平可重入,Zookeeper的临时顺序节点,是实现分布式锁的好苗子。原因如下:

  • ZooKeeper的每一个节点,都是一个天然的顺序发号器。
  • ZooKeeper节点的递增有序性,可以确保锁的公平
  • ZooKeeper的节点监听机制,可以保障占有锁的传递有序而且高效
  • ZooKeeper的节点监听机制,能避免羊群效应

    如下图所示

    ZooKeeper 简介和使用场景

也是用了临时顺序节点特性、watch机制

后续

本篇介绍了zookeeper的基本使用场景,后续文章将着重分析下zookeeper的源码、各种节点的原理和watch机制的实现。

继续阅读