zookeeper optimize

zookeeper参数说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
1.tickTime:Client-Server通信心跳时间
Zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳.tickTime以毫秒为单位
tickTime=2000

2.initLimit:Leader-Follower初始通信时限
集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量)
initLimit=5

3.syncLimit:Leader-Follower同步通信时限
集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数(tickTime的数量)
syncLimit=2

4.dataDir:数据文件目录
Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里
dataDir=/mnt/data/zookeeper

5.dataLogDir: 日志存放位置
Zookeeper保存日志存放位置,默认情况下,Zookeeper将写数据的日志文件放在dataDir目录里
dataLogDir=/mnt/log/zookeeper

6.clientPort:客户端连接端口
客户端连接Zookeeper服务器的端口,Zookeeper会监听这个端口,接受客户端的访问请求
clientPort=2181

7.globalOutstandingLimit: 最大请求堆积数.默认是1000.ZK运行的时候,尽管server已经没有空闲来处理更多的客户端请求了,但是还是允许客户端将请求提交到服务器上来,以提高吞吐性能.
globalOutstandingLimit=1000

8.preAllocSize:预先开辟磁盘空间,用于后续写入事务日志.默认是64M,每个事务日志大小就是64M.如果ZK的快照频率较大的话,建议适当减小这个参数

9.snapCount:每进行snapCount次事务日志输出后,触发一次快照(snapshot),此时,ZK会生成一个snapshot.*文件,同时创建一个新的事务日志文件log.*.默认是100000.

10.autopurge.snapRetainCount:指定了需要保留的文件数目
autopurge.snapRetainCount=3

7.服务器名称与地址:集群信息(服务器编号,服务器地址,LF通信端口,选举端口)
这个配置项的书写格式比较特殊,规则如下:
server.N=YYYY:A:B

N 表示服务器编号,需要在dataDir目录下创建myid文件,将N写入到myid文件内
YYYY 表示服务器地址
A 表示数据同步端口
B 表示选举端口

8.zookeeper集群为什么设置为奇数?
zookeeper有这样一个特性: 集群中只要有过半的机器是正常工作的,那么整个集群对外就是可用的.也就是说如果有2个zookeeper,那么只要有一个死了zookeeper就不能用了,因为一没有过半,所以2个zookeeper的死亡容忍度为0;同理,要是有3个zookeeper,一个死了,还剩下两个正常的,过半了,所以三个zookeeper的容忍度为1;同理你多列举几个(2 -> 0; 3 -> 1; 4 - >1; 5 -> 2; 6 -> 2):你会发现一个规律,2n和2n-1的容忍度是一样的,都是n-1,所以为了更加高效,何必增加那一个不必要的zookeeper呢.

zookeeper 参数调优

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1.zookeeper默认jvm没有配置Xmx,Xms等信息,可以在conf目录下创建java.env文件
[root@10 ~]# cat > /mnt/app/zookeeper/conf/java.env <<EOF
> export JAVA_HOME=/mnt/app/java
> export JVMFLAGS="-Xms1024m -Xmx1024m $JVMFLAGS"
> EOF


2.log4j配置,由于zookeeper是通过nohup启动的,会有一个zookeeper.out日志文件,该文件中记录的是输出到console的日志.log4j中只要配置输出到console即可,zookeeper.out会日积月累不断变大,要放在容量大的磁盘上.

3.zoo.cfg配置,dataDir是存放快照数据的,dataLogDir是存放写前日志的.这两个目录不要配置成一个路径,要配置到不同的磁盘上.如果磁盘是使用了raid,系统就一块磁盘,那配置到一块磁盘上也可以.写前日志的部分对写请求的性能影响很大,保证dataLogDir所在磁盘性能良好

4.zoo.cfg配置中skipACL=yes,忽略ACL验证,可以减少权限验证的相关操作,提升一点性能.

5.zoo.cfg配置中forceSync=no,这个对写请求的性能提升很有帮助,是指每次写请求的数据都要从pagecache中固化到磁盘上,才算是写成功返回.当写请求数量到达一定程度的时候,后续写请求会等待前面写请求的forceSync操作,造成一定延时.如果追求低延时的写请求,配置forceSync=no,数据写到pagecache后就返回.但是机器断电的时候,pagecache中的数据有可能丢失.

6.zookeeper的dataDir和dataLogDir路径下,如果没有配置zk自动清理,会不断的新增数据文件.可配置成zk系统自动清理数据文件,但是要求系统最高性能的话,建议人工手动清理文件:zkCleanup.sh -n 3

7.查看zk节点状态.重新启动zk节点前后,一定要查看状态

8.配置fsync.warningthresholdms=20,单位是毫秒,在forceSync=yes的时候,如果数据固化到磁盘的操作fsync超过20ms的时候,将会在zookeeper.out中输出一条warn日志.这个目前zk的3.4.5和3.5版本有bug,在zoo.cfg中配置不生效.我的做法是在conf/java.env中添加java系统属性:、
export JVMFLAGS="-Dfsync.warningthresholdms=20 $JVMFLAGS"