在上一篇博客中,我们讨论了HDFS cluster在集群模式下部署OpenTSDB需要它。继续本系列,我们将讨论ZooKeeper,它将由集群中的HBase和OpenTSDB使用。
在谈论ZooKeeper之前,我们先来解释一下分布式系统以及对ZooKeeper的需求。
当一个由独立的计算实体组成的软件系统通过计算机网络及其组件相互通信和协调以实现一个共同的目标时,这被称为分布式系统。(例如:多人在线游戏,如Clash of Clan)
可扩展性:我们可以通过在集群中添加更多的机器来轻松地扩展分布式系统。
冗余:集群中的所有机器都提供相同的服务,因此,如果其中任何一台机器不可用,则不会停止工作。
这些系统中的流程需要某种类型的协议才能正确有效地运行。这类协议也称为分布式协调。
然而,我们可以建立自己的协调系统,这将需要大量的工作,而且这不是一项微不足道的任务。问题在于实现一个正确的容错解决方案。
那么,有没有我们可以使用的替代方案呢?
我们可以使用像Zookeeper这样的健壮的协调服务。
ZooKeeper是一个集中服务维护配置信息,命名,提供分布式同步,和提供团体服务。ZooKeeper是简单,分布式,可靠和快速的。
ZooKeeper可以在复制模式下工作,也可以在独立模式下工作。
在复制模式中,涉及多个服务器。其中一个服务器被选为领导者,其他人为追随者。如果领导失败,其中一个追随者被选为主人。
群集中的服务器必须相互了解。它们维护内存中的状态映像,以及持久存储中的事务日志和快照。只要大多数服务器可用,ZooKeeper服务就可用。
客户端可以连接到单个ZooKeeper服务器。但是,当客户端启动时,会向它们提供一个服务器列表,因此当与连接的服务器的连接失败时,客户端可以连接到集群中的任何其他服务器。
读操作可以从群集中的任何服务器执行读操作,但写操作必须通过领导者。
ZooKeeper也可以在独立模式下运行。在这种模式下,所有客户机都连接到单个zookeeper服务器。
在这种模式下,我们失去了复制和高可用性的好处。
ZooKeeper有一个层次结构的命名空间。命名空间可以具有与其关联的数据以及子级数据。指向节点的路径总是表示为规范的,绝对的,斜杠分隔的路径;没有相对的参照物。这些名称空间的组织方式很像Linux中的文件系统。
ZooKeeper树中的每个节点都被称为znode。Znodes维护一个stat结构,其中包括数据更改的版本号,acl(Acess Controle List)更改。数据存储在znode。
要部署zookeeper,我们将使用官方zookeeper docker映像
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
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
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替换为它们各自的值。