原文链接 译者:小村长
About
本项目是 Apache ZooKeeper官方文档的中文翻译版,致力于为有分布式协同项目需求和对 Apache Zookeeper 感兴趣的同学提供有价值的中文资料,希望能够对大家的工作和学习有所帮助。
Zookeeper对与做大数据的人来说在熟悉不过了,毕竟经常用于分布式协同服务中,比如Hbase,Strom等大数据组件中经常用到,但是大部分人仅仅把它当着一个小小的工具,从而很少发时间去深入了解它,今天让小村长为你揭开Zookeeper的神秘面纱。
这一章节主要让开发者对ZooKeeper服务器的所有操作,相对于前面提到的基本概念,它要比ZooKeeper API章节显得复杂一些,本章节主要包含一下内容 :
1、错误信息处理
java和C语言调用的时候可能会报道一个错误,java客户端调用的时候会产生一个异常KeeperException,当调用代码的时候会返回一个表示异常的错误代码。C语言调用时候会返回一个错误编码,这些编码定义在一个枚举ZOO_ERRORS中,不管是java还是C语言回调的时候都会返回结果信息。java开发组可以看javadoc文档,而C语言开发这可以看doxygen文档。通过查看文档可以了解更多的细节,以及每种错误编码所代表的错误信息。
2、ZooKeeper的连接
3、读写查看操作
4、各种各样的ZooKeeper操作
5、程序的结构和简单实例
性能和可伸缩性: 常遇到的问题和故障排查
现在你已经了解ZooKeeper,它很快而且很简单,你可以尝试着把它用于工作。但是当你使用ZooKeeper的时候,你可能会遇到一些陷阱。
1、当你想查看的时候,你必须寻找连接事件。当一个ZooKeeper的客户端从ZooKeeper服务器断开的时候,你接收不到任何通知直到你从新连接。你正在查看一个节点是否进入的时候,当你失去连接的时候你将接受不到任何通知当这个节点创建或者删除。
2、你必须测试ZooKeeper故障,因为当大部分ZooKeeper存活的时候,这个服务器就不会挂掉。现在的问题是:你能否处理它?在现实中ZooKeeper客户端连接会中断(ZooKeeper服务器故障和网络中断是主要原因),ZooKeeper客户端负责维护重新连接并告诉你发生了什么故障。但是你必须确定已经重新连接并了解是什么原因导致的,查明原因并且进行测试,并不是在生产中进行测试,测试几个服务器组成的集群并在主服务器上进行测试
3、被客户端使用的服务器必须和实际的服务器相匹配,尽管不是最优的,但是这样他们都能正常的工作。如果客户端罗列的是实际服务器的子集,如果客户端没有罗列那么集群上面也不会存在
4、了解你的事务日志存放的目录,ZooKeeper的性能可以通过事务日志体现出来,ZooKeeper必须同步到各个客户端才能给你一个相应,一个专门的事务日志是完整性能的保障,把一个日志放在一个很繁忙的设备上能够影响它的性能,如果你仅仅有一个存储设备,你可以把日志文件放到网络文件系统上面并增加一个文件切割点,虽然它并没有消除这个问题,但是它延缓问题。
5、正确的设置你的java堆,这个是很重要的对于避开交换区。不必要的磁盘交换也会影响性能,记住,在ZooKeeper里面每件事都是有序的。如果一个请求触及磁盘,其他也会这样做。为了避免数据交换,尝试着设置你的heapsize的大小通过设置你的物理内存,堆大小设置仅仅是运行你的测试,如果这样设置有困难,估算一下你能设置的合理数字,这个数字就是你机器使用交互区的下限,比如如果一台4G内存的机器,3G的堆设置就开始出现交换现象。
在正式的文档中,这里有一些其他的信息对于开发者非常有用:
ZooKeeper 白皮书 [tbd: find url]
Yahoo! Research写的ZooKeeper 设计和性能讨论
API Reference [tbd: find url]
ZooKeeper API参考手册
ZooKeeper Talk at the Hadoup Summit 2008 (视频资源已经找不到了)
Yahoo! Research的Benjamin Reed介绍ZooKeeper的视频
Flavio Junqueira写的优秀的Java教程 ,使用ZooKeeper上线简单的生产消费者队列和屏障
ZooKeeper – A Reliable, Scalable Distributed Coordination System
Todd Hoff的文章 (07/15/2008)
Pseudo-level discussion of the implementation of various synchronization solutions with ZooKeeper: Event Handles, Queues, Locks, and Two-phase Commits.