常用参数
tickTime:CS通信心跳数 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。tickTime以毫秒为单位。
initLimit:LF初始通信时限 集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量)。
syncLimit:LF同步通信时限 集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数(tickTime的数量)。
preAllocSize 用于配置ZooKeeper事务日志文件预分配的磁盘空间大小。默认的块大小是64M。改变块大小的其中一个原因是当数据快照文件生成比较频繁时可以适当减少块大小。比如 1000次事务会新产生一个快照(参数为snapCount),新产生快照后会用新的事务日志文件,假设一个事务信息大小100b,那么事务日志预分配的磁盘空间大小为100kb会比较好。
autopurge.snapRetainCount
启用后,ZooKeeper自动清除功能会在dataDir和dataLogDir中分别保留autopurge.snapRetainCount最新快照和相应的事务日志,并删除其余快照。
autopurge.purgeInterval 必须触发清除任务的时间间隔(以小时为单位)。设置为正整数(1或更大)以启用自动清除。
maxClientCnxns ZooKeeper服务器允许的最大客户端连接数。为避免耗尽允许的连接,请将其设置为0(无限制)。
globalOutstandingLimit 客户端提交请求的速度可能比ZooKeeper处理的速度快得多,特别是当客户端的数量非常多的时候。为了防止ZooKeeper因为排队的请求而耗尽内存,ZooKeeper将会对客户端进行限流,即限制系统中未处理的请求数量不超过globalOutstandingLimit设置的值。默认的限制是 1000。
server.N=YYY:A:B 每一个机器是ZooKeeper集群的一部分。他们应该知道集群中的其它机器。你使用server.id=host:port:port这样的形式来达到这样的目的, 其中id为server的唯一标识,第一个port为LF通信端口,第二个port为选举端口。参数host和port是直观的。需要创建一个名字为myid的文件来区分每一台机器的服务id,每一服务端一个,它放在服务端的配置文件指定的dataDir的参数的数据目录下。myid文件包含一个单行文本,它的值是机器的id。所以服务端1的myid将包含文本"1"而没有其它。这个id必须在集群中是唯一的并且是一个1到255之间的值。当一个ZK服务端实例启动的时候,它从myid文件中读它的id,然后使用这个id,从配置文件读取找出它应该监视的端口。
group.x=x❌x ”x” 是一个组的标识,等号右边的数字对应于服务器的标识。赋值操作右边是冒号分隔的服务器标识。注意:组必须是不相交的,并且所有组联合后必须是 ZooKeeper 集群。例如,我们有1、2、3、4、5、6、7七个节点。我们做如下配置:
group.1=1:2:3
group.2=4:5:6
group.2=7
将七台机器分为三个组,这时,只要三个组中的两个是稳定的,整个集群的状态就是稳定的。即有2n+1个组,只要有n+1个组是稳定状态,整个集群就是稳定的。也就是过半原则。
weight.x=x 和“group”一起使用,当形成集群时它给每个服务器赋权重值。这个值对应于投票时服务器的权重。ZooKeeper中只有少数部分需要投票,比如Leader选举以及原子的广播协议。服务器权重的默认值是1。如果配置文件中定义了组,但是没有权重,那么所有服务器的权重将会赋值为1。经过实际测试和翻阅zk的投票源码,Weight等于0的节点不参与投票,没有被选举权。而不影响投票的权重. 源码片段如下:
protected boolean totalOrderPredicate(long newId, long newZxid, long newEpoch,long curId, long curZxid, long curEpoch){
if (self.getQuorumVerifier().getWeight(newId) == 0){
return false;
}
return ((newEpoch > curEpoch) ||
(newEpoch == curEpoch && newZxid > curZxid) ||
(newZxid == curZxid && newId > curId));
}
Weight可以调节一个组内单个节点的权重,默认每个节点的权重是1(如果配置是0不参与leader的选举).每个组有一个法定数的概念,法定人数等于组内所有节点的权重之和.此时判断一个组是否稳定,是要判断存活的节点权重之和是否大于该组法定数的权重.
接上面的例子,我们做如下配置:
weight.1=3
weight.2=1
weight.3=1
weight.4=1
weight.5=1
weight.6=1
weight.7=1
此时Group1的法定数是:3+1+1=5,只要节点权重之和过半该组就是稳定的。也就是说,该组中,节点1(权重是3)只要存