zookeeper需要java1.6以上

调整好jvm大小,别放在引起swap环境,zookeeper的及时性,不允许swap

#################################################################################

zookeeper数据目录包含由服务器存储的持久化拷贝文件,包括:快照和事务日志文件

事务日志:znode的变化追加到事务日志

快照:事务日志达到一定大小后,写入系统,这个快照取代所有的以往日志

默认zookeeper配置不会删除老版本快照和日志文件,需要管理员手动删除

dataDir version目录下,log开头的是事务日志文件,snapshot开头的是快照


清理日志 dataDir存储快照snapshot目录,默认情况下,事物日志也在这个,可以给事物日志单独设置一个挂载点或者磁盘,提高zk性能(dataLogDir)

autopurge.snapRetainCount和autopurge.purgeInterval

可以在配置文件启用这两个参数来定时清理事务日志和快照

autopurge.purgeInterval  这个参数指定了清理频率,单位是小时,需要填写一个1或更大的整数,默认是0,表示不开启自己清理功能。

autopurge.snapRetainCount 这个参数和上面的参数搭配使用,这个参数指定了需要保留的文件数目。默认是保留3个。



监管进程,当zookeeper宕掉后,可以重新启动,加入集群

##################################################################################

1.安装daemontools 守护进程


mkdir /package

chmod 755 /package

cd /package

wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz

tar zxf daemontools-0.76.tar.gz

cd admin/daemontools-0.76

vim src/error.h 找到:extern int errno; 改成:#include <errno.h>

package/install


 


2.监控zookeeper

cd /service

mkdir zookeeper

cd zookeeper

vim run

chmod 755 run



run内容如下:


#!/bin/bash

exec 2>&1

exec  /root/zookeeper/zookeeper-3.4.5/bin/zkServer.sh start


3.运行supervise

亲测这个还是要一直输出日志,所以我启动的时候, supervise /service/zookeeper >>/dev/null &

nohup supervise /service/zookeeper & 这样启动,会在当前目录输出nohup.out日志

#####################################################################################


监控zookeeper

使用4字符命令或jmx,额,我用的4字符命令,个人感觉方便点╮(╯▽╰)╭

conf

输出相关服务配置的详细信息。


cons

列出所有连接到服务器的客户端的完全的连接 / 会话的详细信息。包括“接受 / 发送”的包数量、会话 id 、操作延迟、最后的操作执行等等信息。


dump

列出未经处理的会话和临时节点。


envi

输出关于服务环境的详细信息(区别于 conf 命令)。


reqs

列出未经处理的请求


ruok

测试服务是否处于正确状态。如果确实如此,那么服务返回“ imok ”,否则不做任何相应。


stat

输出关于性能和连接的客户端的列表。


wchs

列出服务器 watch 的详细信息。


wchc

通过 session 列出服务器 watch 的详细信息,它的输出是一个与 watch 相关的会话的列表。


wchp

通过路径列出服务器 watch 的详细信息。它输出一个与 session 相关的路径。


#################################################################################

故障排除

zookeeper集群,其中一个服务器里面的事务日志文件损坏,可能不能读取数据,在加载

Zookeeper数据库时你会看到一些IOException,这个用四字符命令,nc stat|nc ip port

查看其它节点是否正常, 如果正常,清理事物日志文件和快照,然后重启服务器即可


##################################################################################

最小配置

clientPort 监听客户端连接的端口


dataDir,存储内存数据库快照的位置,如果不配置dataLogDir的话,更新的事物日志也会存在这里

存放事物日志的地方,保持好良好的新能,不然储存到忙碌的地方,会降低性能


tikeTime,它是zookeeper使用的基本时间单位,毫秒,用于控制心跳和超时,如最小session超时是两倍的ticks


initLimit从leader那里同步数据的时间,不用特意在意,只有zookeeper比较大的时候,需要调整大一点


syncLimit检测心跳的时间,leander服务器发出心跳包,在超过这个时间还没有收到F服务器的反馈信息,那么就连接失败,不用设置过大,会掩盖一些问题


高级配置:

以下配置可选,可优化zookeeper的性能

dataLogDir,这个选项是把事物日志写到这个配置文件路径下,这就允许使用单独的日志设备,避免快照和日志之间竞争

注意:

专用日志设备对吞吐量和稳定的延迟有很多影响,建议使用专业的日志设备,并确保dataDir不在这个日志设备上


globalOutstandingLimit

客户端提交的请求速度快于zookeeper的处理速度,如果有很多客户端的时候,为了避免排队请求过多消耗内存,对客户端未完成的排队

请求不超过1千个(默认)


preAllocSize

为了避免在preAllocSize kb的块的事务日志里寻找分配的空间。默认此配置项是64M。

如果日志文件不会变得更大的话,可以减少这个配置项的值。因为在每一个快照结束时会开始生成一个新的日志文件,

如果在两次快照的间隔期间的那个事务日志大小达不到64M的话,那么需要调低这个值,以免造成空间浪费。

例如,如果我们每执行1000个事务就生成一次快照,一个事务的大小 平均为100字节,那么把preAllocSize配置成100KB就更合适。

默认的preAllocSize的值对于“默认的snapCount值,事务大小 平均值大于512字节”的情况是适用的。


snapCount

zookeeper记录事物到事物日志,到了snapCount个事物日志之后,会启动一个快照的创建

并新建一个事务日志,默认snapCount参数是100000


traceFile

会把操作打印调试信息,会影响性能,不建议和事物日志一个盘


maxClientCnxns

单个客户端并发数连接数,通过ip识别,默认限制数是60,如果设置为0,不对并发数做限制

测试:我设置我1的时候,只能连接两个客户端,当连接第三个的时候失败


maxSessionTimeout

最大session超时时间,默认是20倍的tickTime


fsync.warningthresholdms

事物日志所用的时间大于这个值的时候,会输入警告信息,单位毫秒,默认1000


autopurge.snapRetainCount

保留多少个最近的快照和各种对应的事物日志,并删除以前的,默认值是3,最小是3


syncEnabled

观察者记录事务和快照到硬盘。这降低观察者重启的恢复时间。设置"false"禁用这个功能。默认是"true"


#######################################################################################

集群选项

electionAlg

用于选举实现。"0"代表原始的UDP版本,"1"代表快速领导者选举的不授权的UDP版本,

"2"代表授权的快速领导者选举的UDP版本,"3"代表快速领导者选举的TCP版本。当前,默认值是3.

注意

领导者选举0,1,2的实现现在是弃用的。我们计划在下个发布版本里移除他们,到那时只有FastLeaderElection可用(只有3可用)。


initLimit

时间数量,单位是ticks,允许追随者连接和同步leader。根据需要增加这个值,如果Zookeeper管理的数据量非常大

和leader同步数据的时间,如果数据量比较大,可以设置大一些,默认为10,即10个ticktime


leaderServers

leader接收客户端连接,默认是yes

注意

Zookeeper集群大于3台机器时强烈建议开启领导者选举。

server.x=[hostname]:nnnnn[:nnnnn],等等

(没有Java系统属性)

组成Zookeeper机器的服务器。当服务启动时,通过查找数据目录里的myid文件确定它是哪个服务器。

那个文件包含服务器号,ASCII的形式,并且应该匹配左边server.x里的x。

使用Zookeeper服务的服务器的客户端必须匹配每个Zookeeper服务。

有两个端口号nnnnn。第一个用于连接领导者,第二个用于领导者选举。


领导者选举端口只在electionAlg是1、2、3时必要。如果electionAlg是0,第二个端口就没必要。

如果你想在单机上测试多服务,每个服务要使用不同的端口。


syncLimit

检测心跳。如果leader没有在这个时间内收到fllower的应答,则移除集群,所有

连接这个fllower的客户端全部转移到其它成员上


group.x=nnnnn[:nnnnn]


(没有Java系统属性)


启用分层的法定人数构造。"x"是group标识符,"="后面的数字对应服务标识符。

左边的任务是冒号分隔的服务标识符。注意groups必须是不相交的并且所有groups联盟必须是Zookeeper全体。


weight.x=nnnnn

兼用"group",当形成法定人数时它给服务分配一个权重。投票时这个值对应服务的权重。Zookeeper的一些部分要求投票如领导者选举和自动广播协议。

默认服务器的权重是1.如果配置定义了groups,但不是权重,将会给所有的服务器权重设置为1.

cnxTimeout

设置领导者选举通知打开连接的超时值。只适用于electionAlg3。

注意

默认值是5秒


##########################################################################

使用Netty框架通信


3.4新加入:Netty是一个基于NIO的客户端/服务端通信框架,它简化了Java应用很多复杂的网络层通信。此外Netty框架支持数据加密(SSL)和身份验证(证书)。还有可选择的功能可以独立的开启或关闭。


在版本3.4之前Zookeeper一直直接使用NIO,然而在版本3.4和以后的版本支持NIO选择Netty。NIO仍然是默认值,然而基于Netty的通信可以通过设置环境变量"zookeeper.serverCnxnFactory"为"org.apache.zookeeper.server.NettyServerCnxnFactory"使用。可以在客户端或服务端设置这个选项,一般两边都设置,这个由你决定。


TBD - netty的调优选项


TBD - 怎么管理数据加密


TBD - 怎么管理证书


###############################################################################

不安全选项


下面的选项可以用,但用的时候要小心。每个的风险说明和变量一起。

forceSync

(Java系统属性:zookeeper.forceSync)

在完成处理更新之前要求通过更新事务日志的媒介。如果这个选项设置为no,Zookeeper将不要求同步更新媒介。


jute.maxbuffer:

(Java系统属性:jute.maxbuffer)

此选择系可以通过Java系统属性设置。没有zookeeper前缀。它指定znode中可以存储的数据的最大值。默认是0xffffff,或低于1M。如果这个选项变了,系统属性必须在所有服务器和客户端上设置,否则会出现问题。这确实是一个合理性检查。Zookeeper用来存储数据大约在KB大小。


skipACL

(Java系统属性:zookeeper.skipACL)

跳过ACL检查。这会增加吞吐量,但是会像所有人打开完整的访问权限

quorumListenOnAllIPs

设置为true时,Zookeeper服务器将监听所有同行可用IP地址的连接,并且不只是服务器里配置的地址。它影响连接处理ZAB协议和快速领导者选举协议。默认是false。


##################################################################################

要避免的事情

下面的问题可以通过Zookeeper正确的配置避免:

不一致的服务器清单

客户端使用的Zookeeper服务器清单必须和每个Zookeeper服务的一致。每个Zookeeper服务配置文件的服务器清单应该和其他的一致。


不正确的事务日志放置

Zookeeper性能的关键部分是事务日志。Zookeeper在响应之前同步事务到媒介。一个专用的事务日志装置是保持良好性能的关键。将日志放置在繁忙的装置上会严重影响性能。如果你只有一个存储设备,将跟踪文件放置在NFS上并增加snapshotCount;这不能解决问题,但能改善。


不正确的Java堆大小

你应该特别注意正确的设置Java最大堆大小。特别的是,你不应该营造Zookeeper交换磁盘的情况。磁盘可让Zookeeper死亡。每个事情都是有序的,所以如果处理一个请求交换磁盘,所有其他队列里的请求很可能会做同样的事情。磁盘,不要SWAP。

保守估计:如果你有4G的RAM,不用设置Java最大堆大小为6G或4G。

例如,4G的机器更建议你使用3G的堆,因为操作系统和缓存也需要内存。

堆大小的最佳推荐,你的系统需要运行负载测试,然后确保使用在引起系统交换的限制以下。