动物园管理员简介


在上一篇博客中,我们讨论了HDFS cluster在集群模式下部署OpenTSDB需要它。继续本系列,我们将讨论ZooKeeper,它将由集群中的HBase和OpenTSDB使用。

在谈论ZooKeeper之前,我们先来解释一下分布式系统以及对ZooKeeper的需求。

分布式系统

当一个由独立的计算实体组成的软件系统通过计算机网络及其组件相互通信和协调以实现一个共同的目标时,这被称为分布式系统。(例如:多人在线游戏,如Clash of Clan

分布式系统的优点

  • 可扩展性:我们可以通过在集群中添加更多的机器来轻松地扩展分布式系统。

  • 冗余:集群中的所有机器都提供相同的服务,因此,如果其中任何一台机器不可用,则不会停止工作。

这些系统中的流程需要某种类型的协议才能正确有效地运行。这类协议也称为分布式协调。

然而,我们可以建立自己的协调系统,这将需要大量的工作,而且这不是一项微不足道的任务。问题在于实现一个正确的容错解决方案。

那么,有没有我们可以使用的替代方案呢?

我们可以使用像Zookeeper这样的健壮的协调服务。

什么是动物园管理员?

ZooKeeper是一个集中服务维护配置信息,命名,提供分布式同步,提供团体服务。ZooKeeper是简单,分布式,可靠和快速的。

  • 维护配置信息:它维护集群中所有节点共享的集群配置信息。
  • 命名:可以使用Zookeeper作为命名服务,这样集群中的一个节点可以找到大集群中的另一个节点例如:1000节点集群
  • 提供分布式同步:我们还可以使用zookeeper通过使用锁,队列等来解决集群中的分布式同步问题。
  • 提供群组服务:Zookeeper还在群组服务中帮助选择主人(领袖选举过程)。

ZooKeeper可以在复制模式下工作,也可以在独立模式下工作。

复制模式

在复制模式中,涉及多个服务器。其中一个服务器被选为领导者,其他人为追随者。如果领导失败,其中一个追随者被选为主人。

Image Credit: Zookeeper.apache.org


群集中的服务器必须相互了解。它们维护内存中的状态映像,以及持久存储中的事务日志和快照。只要大多数服务器可用,ZooKeeper服务就可用。

客户端可以连接到单个ZooKeeper服务器。但是,当客户端启动时,会向它们提供一个服务器列表,因此当与连接的服务器的连接失败时,客户端可以连接到集群中的任何其他服务器。

读操作可以从群集中的任何服务器执行读操作,但写操作必须通过领导者。

独立模式

ZooKeeper也可以在独立模式下运行。在这种模式下,所有客户机都连接到单个zookeeper服务器。

在这种模式下,我们失去了复制和高可用性的好处。

ZooKeeper数据模型

ZooKeeper有一个层次结构的命名空间。命名空间可以具有与其关联的数据以及子级数据。指向节点的路径总是表示为规范的,绝对的,斜杠分隔的路径;没有相对的参照物。这些名称空间的组织方式很像Linux中的文件系统。

Image Credit: Zookeeper.apache.org

zNode:

ZooKeeper树中的每个节点都被称为znode。Znodes维护一个stat结构,其中包括数据更改的版本号,acl(Acess Controle List)更改。数据存储在znode。

部署ZooKeeper:

要部署zookeeper,我们将使用官方zookeeper docker映像

在Server1中

version: '3.1'

services:
  zoo1:
    image: zookeeper:latest
    restart: always
    hostname: zoo1
    ports:
      - 2181:2181
      - 2888:2888
      - 3888:3888
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=0.0.0.0:2888:3888 server.2=server2IP:2888:3888 server.3=server3IP:2888:3888-

查看代码Gist

运行给定的yml服务器1docker-compose -f zoo1.yml up -d 

在Server2中

version: '3.1'

services:
  zoo2:
    image: zookeeper:latest
    restart: always
    hostname: zoo2
    ports:
      - 2181:2181
      - 2888:2888
      - 3888:3888
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=server1IP:2888:3888 server.2=0.0.0.0:2888:3888 server.3=server3IP:2888:3888

查看代码Gist

运行给定的yml服务器2docker-compose -f zoo2.yml up -d 

在服务器3中

version: '3.1'

services:
  zoo2:
    image: zookeeper:latest
    restart: always
    hostname: zoo2
    ports:
      - 2181:2181
      - 2888:2888
      - 3888:3888
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOO_MY_ID: 3
      ZOO_SERVERS: server.1=server1IP:2888:3888 server.2=server2IP:2888:3888 server.3=0.0.0.0:2888:3888

查看代码Gist

在server3中运行给定的ymldocker-compose -f zoo3.yml up -d 

查看动物园管理员的状态:

root@host:~# nc localhost 2181  
stats

您可以在所有服务器中尝试给定的命令,并检查模式在输出中找出哪个是领导者和跟随者。

*注意:将所有yml中的server1IP,server2IP和server3IP替换为它们各自的值。

参考文献