I. 说明

ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

Zookeeper是Google的Chubby一个开源的实现.是高有效和可靠的协同工作系统.Zookeeper能够用来leader选举,配置信息维护等.在一个分布式的环境中,我们需要一个Master实例或存储一些配置信息,确保文件写入的一致性等.

特性

  • 最终一致性:为客户端展示同一视图,这是 ZooKeeper 最重要的性能。
  • 可靠性:如果消息被一台服务器接受,那么它将被所有的服务器接受。
  • 实时性:ZooKeeper 不能保证两个客户端同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。
  • 等待无关(wait-free):慢的或者失效的 client 不干预快速的client的请求。
  • 原子性:更新只能成功或者失败,没有中间其它状态。
  • 顺序性:对于所有Server,同一消息发布顺序一致。

II. 应用场景

i. 注册中心

Zookeeper一个最常用的使用场景就是用于担任服务生产者和服务消费者的注册中心,服务生产者将自己提供的服务注册到Zookeeper中心,服务的消费者在进行服务调用的时候先到Zookeeper中查找服务,获取到服务生产者的详细信息之后,再去调用服务生产者的内容与数据,简单示例图如下:

ii. 统一命名服务

  • 在分布式环境下,经常需要对应用/服务进行统一命名,便于识别不同服务。
    • 类似于域名与ip之间对应关系,ip不容易记住,而域名容易记住。
    • 通过名称来获取资源或服务的地址,提供者等信息。
  • 按照层次结构组织服务/应用名称。
    • 可将服务名称以及地址信息写到ZooKeeper上,客户端通过ZooKeeper获取可用服务列表类。

iii. 配置管理

  • 分布式环境下,配置文件管理和同步是一个常见问题。
    • 一个集群中,所有节点的配置信息是一致的,比如 Hadoop 集群。
    • 对配置文件修改后,希望能够快速同步到各个节点上。
  • 配置管理可交由ZooKeeper实现。
    • 可将配置信息写入ZooKeeper上的一个Znode。
    • 各个节点监听这个Znode。
    • 一旦Znode中的数据被修改,ZooKeeper将通知各个节点。

iv. 集群管理

  • 分布式环境中,实时掌握每个节点的状态是必要的。
    • 可根据节点实时状态做出一些调整。
  • 可交由ZooKeeper实现。
    • 可将节点信息写入ZooKeeper上的一个Znode。
    • 监听这个Znode可获取它的实时状态变化。
  • 典型应用
    • Hbase中Master状态监控与选举。

v. 分布式通知与协调

  • 分布式环境中,经常存在一个服务需要知道它所管理的子服务的状态。
    • NameNode需知道各个Datanode的状态。
    • JobTracker需知道各个TaskTracker的状态。
  • 心跳检测机制可通过ZooKeeper来实现。
  • 信息推送可由ZooKeeper来实现,ZooKeeper相当于一个发布/订阅系统。

vi. 分布式锁

处于不同节点上不同的服务,它们可能需要顺序的访问一些资源,这里需要一把分布式的锁。

分布式锁具有以下特性:

  • ZooKeeper是强一致的。比如各个节点上运行一个ZooKeeper客户端,它们同时创建相同的Znode,但是只有一个客户端创建成功。
  • 实现锁的独占性。创建Znode成功的那个客户端才能得到锁,其它客户端只能等待。当前客户端用完这个锁后,会删除这个Znode,其它客户端再尝试创建Znode,获取分布式锁。
  • 控制锁的时序。各个客户端在某个Znode下创建临时Znode,这个类型必须为CreateMode.EPHEMERAL_SEQUENTIAL,这样该Znode可掌握全局访问时序。

vii. 分布式队列

分布式队列分为两种:

  • 当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达,这种是同步队列。
    • 一个job由多个task组成,只有所有任务完成后,job才运行完成。
    • 可为job创建一个/job目录,然后在该目录下,为每个完成的task创建一个临时的Znode,一旦临时节点数目达到task总数,则表明job运行完成。
  • 队列按照FIFO方式进行入队和出队操作,例如实现生产者和消费者模型。

III. 安装

zookeeper 的安装模式有三种:

  • 单机模式( stand-alone):单机单 server;
  • 集群模式:多机多 server,形成集群;
  • 伪集群模式:单机多个 server,形成伪集群;

下载源码包,并解压

  1. wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/stable/zookeeper-3.4.14.tar.gz
  2. tar zxvf zookeeper-3.4.14.tar.gz
  3. mv zookeeper-3.4.14 /usr/local/zookeeper

修改环境变量

编辑 /etc/profile 文件, 在文件末尾添加以下环境变量配置:

  1. # ZooKeeper Env
  2. export ZOOKEEPER_HOME=/usr/local/zookeeper
  3. export PATH=$PATH:$ZOOKEEPER_HOME/bin

运行以下命令使环境变量生效: source /etc/profile

重命名配置文件

初次使用 ZooKeeper 时,需要将$ZOOKEEPER_HOME/conf 目录下的 zoo_sample.cfg 重命名为 zoo.cfg, zoo.cfg

  1. mv $ZOOKEEPER_HOME/conf/zoo_sample.cfg $ZOOKEEPER_HOME/conf/zoo.cfg

单机模式—修改配置文件

创建目录/usr/local/zookeeper/data 和/usr/local/zookeeper/logs 修改配置文件

  1. tickTime=2000
  2. initLimit=10
  3. syncLimit=5
  4. dataDir=/usr/local/zookeeper/data
  5. dataLogDir=/usr/local/zookeeper/logs
  6. clientPort=2181

如果是多节点,配置文件中尾部增加

  1. server.1=192.168.1.110:2888:3888
  2. server.2=192.168.1.111:2888:3888
  3. server.3=192.168.1.112:2888:3888

同时,增加

  1. #master
  2. echo "1">/usr/local/zookeeper/data/myid
  3. #slave1
  4. echo "2">/usr/local/zookeeper/data/myid
  5. #slave2
  6. echo "3">/usr/local/zookeeper/data/myid

启动 ZooKeeper 服务

  1. # cd /usr/local/zookeeper/zookeeper-3.4.11/bin
  2. # ./zkServer.sh start
  3. ZooKeeper JMX enabled by default
  4. Using config: /usr/local/zookeeper/zookeeper-3.4.11/bin/../conf/zoo.cfg
  5. Starting zookeeper ... STARTED
  6. zkServer.sh status
  7. ZooKeeper JMX enabled by default
  8. Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
  9. Mode: follower

验证zooKeeper服务

服务启动完成后,可以使用 telnet 和 stat 命令验证服务器启动是否正常:

  1. # telnet 127.0.0.1 2181
  2. Trying 127.0.0.1...
  3. Connected to 127.0.0.1.
  4. Escape character is '^]'.
  5. stat
  6. Zookeeper version: 3.4.11-37e277162d567b55a07d1755f0b31c32e93c01a0, built on 11/01/2017 18:06 GMT
  7. Clients:
  8. /127.0.0.1:48430[0](queued=0,recved=1,sent=0)
  9. Latency min/avg/max: 0/0/0
  10. Received: 1
  11. Sent: 0
  12. Connections: 1
  13. Outstanding: 0
  14. Zxid: 0x0
  15. Mode: standalone
  16. Node count: 4
  17. Connection closed by foreign host.

停止 ZooKeeper 服务

想要停止 ZooKeeper 服务, 可以使用如下命令:

  1. # cd /usr/local/zookeeper/zookeeper-3.4.11/bin
  2. # ./zkServer.sh stop
  3. ZooKeeper JMX enabled by default
  4. Using config: /usr/local/zookeeper/zookeeper-3.4.11/bin/../conf/zoo.cfg
  5. Stopping zookeeper ... STOPPED

IV. 应用

i. PHP Client

  1. pecl channel-update pecl.php.net
  2. pecl install zookeeper

参考