zookeeper运维管理详解( 二 )


1. 集群中只有少部分的机器不可用 。这里说的不可用是指这些机器或者是本身down掉了,或者是因为网络原因,有一部分机器无法和集群中其它绝大部分的机器通信 。例如,如果ZK集群是跨机房部署的,那么有可能一些机器所在的机房被隔离了 。
2. 正确部署ZK server,有足够的磁盘存储空间以及良好的网络通信环境 。
下面将会从集群和单机两个维度来说明,帮助zookeeper管理员尽可能地提高ZK集群的可用性 。
2.1.1集群维度
在上面提到的"过半存活即可用"特性中已经讲到过,整个集群如果对外要可用的话,那么集群中必须要有过半的机器是正常工作并且彼此之间能够正常通信 。基于这个特性,那么如果想搭建一个能够允许F台机器down掉的集群,那么就要部署一个由2xF+1 台机器构成的ZK集群 。因此,一个由3台机器构成的ZK集群,能够在down掉一台机器后依然正常工作,而5台机器的集群,能够对两台机器down掉的情况容灾 。注意,如果是一个6台机器构成的ZK集群,同样只能够down掉两台机器,因为如果down掉3台,剩下的机器就没有过半了 。基于这个原因,ZK集群通常设计部署成奇数台机器 。
所以,为了尽可能地提高ZK集群的可用性,应该尽量避免一大批机器同时down掉的风险,换句话说,最好能够为每台机器配置互相独立的硬件环境 。举个例子,如果大部分的机器都挂在同一个交换机上,那么这个交换机一旦出现问题,将会对整个集群的服务造成严重的影响 。其它类似的还有诸如:供电线路,散热系统等 。其实在真正的实践过程中,如果条件允许,通常都建议尝试跨机房部署 。毕竟多个机房同时发生故障的机率还是挺小的 。
2.1.2 单机维度
对于ZK来说,如果在运行过程中,需要和其它应用程序来竞争磁盘,CPU,网络或是内存资源的话,那么整体性能将会大打折扣 。
首先来看看磁盘对于ZK性能的影响 。客户端对ZK的更新操作都是永久的,不可回退的,也就是说,一旦客户端收到一个来自server操作成功的响应,那么这个变更就永久生效了 。为做到这点,ZK会将每次更新操作以事务日志的形式写入磁盘,写入成功后才会给予客户端响应 。明白这点之后,你就会明白磁盘的吞吐性能对于ZK的影响了,磁盘写入速度制约着ZK每个更新操作的响应 。为了尽量减少ZK在读写磁盘上的性能损失,不仿试试下面说的几点:
A、使用单独的磁盘作为事务日志的输出(比如我们这里的ZK集群,使用单独的挂载点用于事务日志的输出) 。事务日志的写性能确实对ZK性能,尤其是更新操作的性能影响很大,所以想办法搞到一个单独的磁盘吧!ZK的事务日志输出是一个顺序写文件的过程,本身性能是很高的,所以尽量保证不要和其它随机写的应用程序共享一块磁盘,尽量避免对磁盘的竞争 。
B、尽量避免内存与磁盘空间的交换 。如果希望ZK能够提供完全实时的服务的话,那么基本是不允许操作系统触发此类swap的 。因此在分配JVM堆大小的时候一定要非常小心,具体在本文最后的"注意事项"章节中有讲到 。
2.2.1 清理数据目录
上文中提到dataDir目录指定了ZK的数据目录,用于存储ZK的快照文件(snapshot) 。另外,默认情况下,ZK的事务日志也会存储在这个目录中 。在完成若干次事务日志之后(在ZK中,凡是对数据有更新的操作,比如创建节点,删除节点或是对节点数据内容进行更新等,都会记录事务日志),ZK会触发一次快照(snapshot),将当前server上所有节点的状态以快照文件的形式dump到磁盘上去,即snapshot文件 。这里的若干次事务日志是可以配置的,默认是100000,具体参看下文中关于配置参数"snapCount"的介绍 。
考虑到ZK运行环境的差异性,以及对于这些历史文件,不同的管理员可能有自己的用途(例如作为数据备份),因此默认ZK是不会自动清理快照和事务日志,需要交给管理员自己来处理 。这里是我们用的清理方法,保留最新的66个文件,将它写到crontab中,每天凌晨2点触发一次:
#!/bin/bash
#snapshot file dir
dataDir=/home/yinshi.nc/test/zk_data/version-2
#tran log dir
dataLogDir=/home/yinshi.nc/test/zk_log/version-2
#zk log dir
logDir=/home/yinshi.nc/test/logs
#Leave 66 files
count=66
count=$[$count+1]
ls -t $dataLogDir/log.* | tail -n +$count | xargs rm -f
ls -t $dataDir/snapshot.* | tail -n +$count | xargs rm -f
ls -t $logDir/zookeeper.log.* | tail -n +$count | xargs rm -f
#find /home/yinshi.nc/taokeeper/zk_data/version-2 -name "snap*" -mtime +1 | xargs rm -f


推荐阅读