整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

第十四章 关于 ZooKeeper

hadoop 花牛 12℃ 0评论

迄今为止,本书都是在教我们大规模数据处理技术。但本章的内容则有所不同,将介绍如何使用ZooKeeper来构建一般的分布式应用。ZooKeeperHadoop的分布式协调服务。

写分布式应用的主要困难在于会出现“部分失败”(partial failure)。当一条消息在网络中两个节点之间传送时,如果出现网络错误,发送者无法知道接收者是否已经收到这条消息。接收者可能在出现网络错误之前就已经收到这条消息,也有可能没有收到,又或者接收者的进程已经死掉。发送者能够获得真实情况的唯一途径就是重新连接接收者,并向它发出询问。这种情况就是部分失畋,即我们甚至不知道一个操作是否已经失败。

由于部分失败是分布式系统固有的特征,因此使用ZooKeeper并不能避免出现部分失败,当然它也不会隐藏部分失败。ZooKeeper可以提供一组工具,使你在构建分布式应用时能够对部分失败进行正确处理。

ZooKeeper具有以下特点。

ZooKeeper是简单的

ZooKeeper的核心是一个精简的文件系统,它提供一些简单的操作和一些额外的抽象操作,例如,排序和通知。

ZooKeeper是富有表现力的

ZooKeeper的基本操作是一组丰富的“构件”(building block),可用于实现多种协调数据结构和协议。相关的例子包括:分布式队列、分布式锁和一组节点中的“领导者选举”(leader election)

ZooKeeper具有高可用性

ZooKeeper运行于一组机器之上,并且在设计上具有高可用性,因此应用程序完全可以依赖于它。 ZooKeeper可以帮助系统避免出现单点故障,因此可以用于构建一个可靠的应用程序。

ZooKeeper采用松耦合交互方式

在ZooKeeper支持的交互过程中,参与者不需要彼此了解。例如,ZooKeeper可以被用于实现“数据汇集”(rendezvous)机制,让进程在不了解其他进程(或网络状况)的情况下能够彼此发现并进行信息交互。参与的各方甚至可以 不必同时存在,因为一个进程可以在ZooKeeper中留下一条消息,在该进程结束后,另外一个进程还可以读取这条消息。

ZooKeeper是一个资源库

ZooKeeper提供了一个通用协调模式实现方法的开源共享库,使程序员免于编写这类通用的协议(这通常 是很难写正确的)。所有人都能够对这个资源库进行添加和改进,久而久之,会使每个人都从中受益。

同时,ZooKeeper也是高性能的。在它的诞生地Yahoo!公司,对于以写操作为主的工作负载来说,ZooKeeper的基准吞吐量已经超过每秒10 000个操作,对于常规的以读操作为主的工作负载来说,吞吐量更是高出好几倍。

1. 安装和运行ZooKeeper

首次尝试使用ZooKeeper时,最简单的方式是在一台ZooKeeper服务器上以独立模式(standalone mode)运行。例如,可以在一台用于开发的机器上尝试运行。运行ZooKeeper需要Java 6,因此首先要确认已经安装了 Java 6。 ZooKeeper提供了 Windows版本的脚本,因此在Windows环境中运行 ZooKeeper时不需要Cygwin。(Windows只能被作为开发平台,而不能作为生产平台。)

可以从Apache的ZooKeeper发布页面下载ZooKeeper的一个稳定版本,然后在合适的位置将下载的压缩包解压:

% tar xzf zookeeper-x.y.z.tar.gz

ZooKeeper提供了几个能够运行服务并与之交互的二进制可执行文件,可以很方便地将包含这些二进制文件的目录加入命令行路径:

% export ZOOKEEPER_INSTALL=/home/tom/zookeeper-x.y.2

% export PATH=$PATH:$ZOOKEEPER_INSTALL/bin

在运行ZooKeeper服务之前,我们需要创建一个配置文件。这个配置文件习惯上被命名为zoo. cfg,并被保存在conf子目录中(也可以把它保存在/etc/zookeeper子目录中,如果设置了环境变量ZOOCFGDIR,也可以保存在该环境变量所指定的目录中)。配置文件的内容示例如下:

tickTime=2000

dataDir=/Users/tom/zookeeper

clientPort=2181

这是一个标准的Java属性文件,本例中所定义的三个属性是以独立模式运行ZooKeeper所需的最低要求。简单地说,tickTime属性指定了ZooKeeper中的基本时间单元(以毫秒为单位),dataDir属性指定了 ZooKeeper存储持久数据的本地文件系统位置;clientPort属性指定了ZooKeeper用于监听客户端连接的端口(通常使用2181端口)。用户应该将dataDir属性的值修改为自己系统所要求的合适位置。

定义好合适的配置文件之后,我们现在可以启动一个本地ZooKeeper服务器:

% zkServer.sh start

使用nc(telnet也可以)发送ruok命令(Are you OK?)到监听端口,检查ZooKeeper是否正在运行:

% echo ruok | nc localhost 2181

imok

imok是ZooKeeper在说“I'm OK”。还有其他一些用于管理ZooKeeper的命令,都采用类似的四字母组合,如表14-1所示。

表14_1. ZooKeeper命令:四字母组合

类别

命令

描述

服务器状态

ruok

如果服务器正在运行并且未处于出错状态,则输出imok

conf

输出服务器的配置信息(根据配置文件zoo.cfg)

envi

输出服务器的环境信息,包括ZooKeeper版本、Java版本 和其他系统属性

srvr

输出服务器的统计信息,包括延迟统计、znode的数量和 服务器运行模式(standaloneleader 或 follower)

stat

输出服务器的统计信息和已连接的客户端

srst

重置服务器的统计信息

isro

显示服务器是否处于只读(ro)模式(由于网络分区),或者读写(rw)模式

客户端连接

dump

列出集合体中的所有会话和短暂znode。必须连接到 leader才能够使用此命令(参考srvr命令)

cons

列出所有服务器客户端的连接统计信息

erst

重置连接统计信息

观察

wchs

列出服务器上所有观察的摘要信息

wchc

按连接列出服务器上所有的观察。注意:如果观察的数量 较多,此命令会影响服务器的性能

wchp

znode路径列出服务器上所有的观察。注意:如果观察 的数量较多,此命令会影响服务器的性能

监控

mntr

Java属性格式列出服务器统计信息。适合于用作 GangliaNagios等监控系统的信息源

 

除了mntr命令外,ZooKeeper还通过JMX来披露统计信息。从http://zookeeper.apache.org/上的ZooKeeper文档中可以获取详细的相关信息。在安装目录的src/contrib子目录中包含有相关的监控工具及方法。

2. 示例

假设有一组服务器用于为客户端提供某种服务。我们希望每个客户端都能找到其中一台服务器,这样它们就可以使用这项服务。在这个例子中,一个挑战是如何维护这组服务器的成员列表。

这组服务器的成员列表显然不能存储在网络中的单个节点上,否则该节点的故障将意味着整个系统的故障(我们希望这个成员列表是高度可用的)。我们先假设已经有了一种可靠的方法来解决成员列表的存储问题。接下来,如果其中一台服务器出现故障,我们需要解决如何从服务器成员列表中将它删除的问题。某个进程需要去负责删除故障服务器,但注意不能由故障服务器自己来完成,因为故障服务器已经不再运行!

我们所描述的不是一个被动的分布式数据结构,而是一个主动的、能够在某个外部事件发生时修改数据项状态的数据结构。ZooKeeper提供了这种服务,接下来让我们看看如何使用它来实现这种众所周知的组成员管理应用。

转载请注明:全栈大数据 » 第十四章 关于 ZooKeeper

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址