生产环境中的ZooKeeper
在生产环境中,应当以复制模式运行ZooKeeper。在这里,我们将讨论维护 ZooKeeper服务器的集合体时需要考虑的一些问题。但是,本节的内容不够详尽, 因此你应当参考“ZooKeeper管理员指南”来获得详细的最新操作指南,包括支持 的平台、推荐的硬件、维护过程和配置属性。
可恢复性和性能
在安放ZooKeeper所用的机器时,应当考虑尽量减少机器和网络故障可能带来的影 响。在实践过程中,一般是跨机架、电源和交换机来安放服务器,这样,这些设备 中的任何一个出现故障都不会使集合体损失半数以上的服务器。ZooKeeper需要在 集合体的所有服务器之间建立低延迟的连接,鉴于此,一个集合体只限于为一个数 据中心提供服务。
ZooKeeper是具有高可用性的系统,对它来说,最关键的是能够及时地履行其职能。因此,ZooKeeper应当运行在专用的机器上。如果有其他应用程序竞争资源, 会导致ZooKeeper的性能明显下降。
通过对ZooKeeper进行配置,可以使它的事务日志和数据快照分别保存在不同的磁 盘驱动器上。默认情况下,两者都保存在dataDir属性所指定的目录中,但是通 过为dataLogDir属性设置一个值,便可以将事务日志写在该值所指定的那个位 置。通过指定一个专用的设备(不只是一个分区),一个ZooKeeper服务器可以以最 大速率将日志写到磁盘,因为写日志是顺序写,并且没有寻址操作。由于所有的写 操作都是通过领导者来完成的,增加服务器并不能提高写操作的吞吐量,所以提髙 性能的关键是写操作的速度。
如果写操作的进程被交换到磁盘上,性能会受到不利的影响。这是可以避免的,将 Java堆的大小设置为小于机器上可用的物理内存即可。ZooKeeper脚本可以从它的 配置目录中获取一个名为Java.ewv的文件,这个文件用来设置]VMFLAGS环境变 量,包括设置Java堆的大小(和任何其他所需的JVM参数)。
配置
ZooKeeper服务器集合体中,每个服务器都有一个数值型的ID,服务器ID在集合 体中是唯一的,并且取值范围在1到255之间。可以通过一个名为myid的纯文本 文件设定服务器的ID,这个文件保存在dataDir参数所指定的目录中。
为每台服务器设置ID只完成了工作的一半。我们还需要将集合体中其他服务器的 ID和网络位置告诉所有的服务器。在ZooKeeper的配置文件中必须为每台服务器 添加下面这行配置:
seryer.n=hostname:port:port
n的值就是服务器的ID。这里有2个端口设置:第一个是跟随者用来连接领导者 的端口,第二个端口用于领导者选举。这里有一个包含有三台机器的复制模式下 ZooKeeper集合体的配置例子:
tickTime=2000dataDir=/disk1/zookeeperdataLogDir=/disk2/zookeeperclientPort=2181initLimit=5syncLimit=2server.1=zookeeper1: 2888:3888 server.2=zookeeper2: 2888:3888 server.3=zookeeper3: 2888:3888
服务器在3个端口上进行监听:2181端口用于客户端连接;对于领导者来说, 2888端口用于跟随者连接,3888端口用于领导者选举阶段的其他服务器连接。当 一个ZooKeeper服务器启动时,它读取myid文件用于确定自己的服务器ID,然后 通过读取配置文件来确定应当在哪个端口进行监听,同时确定集合体中其他服务器 的网络地址。
连接到这个ZooKeeper集合体的客户端在ZooKeeper对象的构造函数中应当使用 zookeeperl:2181, zookeeper2:2181 和 zookeeper3:2181 作为主机字符串。在复制模式下,有两个额外的强制参数:initLimit和syncLimit,两者都是以 滴答参数的倍数进行度量。
initLimit参数设定了允许所有跟随者与领导者进行连接并同步的时间。如果在 设定的时间段内,半数以上的跟随者未能完成同步,领导者便会宣布放弃领导地 位,然后进行另外一次领导者选举。如果这种情况经常发生(可以通过日志中的记 录发现这种情况),则表明设定的值太小。
syncLimit参数设定了允许一个跟随者与领导者进行同步的时间。如果在设定的 时间段内,一个跟随者未能完成同步,它将会自己重启。所有关联到这个跟随者的 客户端将连接到另一个跟随者。
这些是建立和运行一个ZooKeeper服务器集群所需的最少设置。“ZooKeeper管理 员指南”列出了更多的配置选项,特别是性能调优方面的。