zoo.cfg
安装完ZooKeeper后在conf下有这样一个文件:
一般会将其重命名为zoo.cfg,在zoo.cfg钟有这样几个比较重要的配置:
- tickTime=2000
用于计算的时间单元,默认单位是毫秒,整个Zookeeper中的时间都是以tickTime为基准的。比如session超时:N*tickTime
- initLimit=10
用于集群,允许从节点连接并同步到master节点的初始化时间,以tickTime的倍数来表示,initLimit * tickTime,随ZK集群数据量适当增加值。这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过5个心跳的时间(也就是 tickTime)长度后 Zookeeper服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒。
- syncLimit=5
用于集群,Leader与从节点之间发送消息,请求和应答的时间长度(心跳机制,心跳机制超过一定时间,从节点就会被抛弃)。即Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长。以tickTime的倍数来表示,initLimit * tickTime,不适合太大,容易使Leader 误认为Follower 在线。
- dataDir/dataLogDir
dataDir是必须要配置的,用来存储ZooKeeper相关的一些数据,默认情况下,ZK的事务日志和数据快照都会保存在dataDir目录下。在集群zookeeper服务在启动的时候回去读取zoo.cfg这个文件,从这个文件中找到这个属性然后获取它的值也就是dataDir 的路径,它会从这个路径下面读取mydi这个文件,从这个文件中获取要启动的当前服务器的地址,当它找不到这个地址的时候就会抛出异常。dataLogDir事务日志输出目录,建议单独一个磁盘或挂载点,可极大的提升ZK性能,如果不配置会和dataDir公用。
官方建议不要使用/tmp来做存储快照的目录,/tmp这只是一个案例。
比如我这里配置的是:
里面有相关的日志记录:
- clientPort端口
在server启动完成后需要有一个客户端,默认是2181。
- #server.A=B:C:D
其中A是一个数字, 表示这是第几号server,是一个数字,与myid文件中的id是一致的。 B是该server所在的IP地址;C配置该server和集群中的leader交换消息所使用的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群(在单机模拟集群模式)的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。
除了修改 zoo.cfg 配置文件,集群模式下还要配置一个文件 myid,这个文件在 dataDir 目录下,这个文件里面就有一个数据就是 A 的值,Zookeeper 启动时会读取这个文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是那个 server。
- #maxClientCnxns=60
单个客户端与单台服务器之间的连接数的限制,默认是60,如果设置为0,那么表明不作任何限制。
- # Session超时时间限制
如果客户端设置的超时时间不在这个范围,那么会被强制设置为最大或最小时间。默认的Session超时时间是在2 * tickTime ~ 20 * tickTime 这个范围 。
minSessionTimeout=4000
maxSessionTimeout=40000
- #autopurge.snapRetainCount=3
这个参数和下面的参数搭配使用,这个参数指定了需要保留的文件数目。默认是保留3个。
- autopurge.purgeInterval=1
3.4.0及之后版本,ZK提供了自动清理事务日志和快照文件的功能,这个参数指定了清理频率,单位是小时,需要配置一个1或更大的整数,为0表示不开启自动清理功能。
其他属性
首先获取一个节点/test:
这里的1是value值;
- cZxid = 0x300000002
- 表示事务id,我们进行一个事务操作的时候,这里是create操作,相当于发起一个事务请求,会有一个事务id。
- ctime = Fri Oct 05 08:01:29 CST 2018
- 创建时间。
- mZxid = 0x300000002
- 即modify。如果我们没有修改过的话,create的id和modify的id是一样的。最后修改znode更改的事务id。
- mtime = Fri Oct 05 08:01:29 CST 2018
- 修改时间。
- pZxid = 0x300000002
- 表示当前/test节点下的子节点最后一次被修改的事务id。即只有子节点变更才会对pZxid有影响。
- cversion = 0
- 这里的vesion相当于是乐观锁的版本。当前节点的子节点的版本号。
- dataVersion = 0
- 当前数据的version。
- aclVersion = 0
- 当前节点acl变更的version。
这三个version可以控制数据的并发性。简单演示下:
- ephemeralOwner = 0x0
- 创建临时节点的时候,会有一个sessionId 。 该值存储的就是这个sessionid,即绑定当前会话。
简单演示下:
存储的就是会话信息,基于这个会话标识我们才能知道当前会话断开后将哪些节点删除。
- dataLength = 1
- 当前数据长度。
简单演示下:
- numChildren = 0
- 当前子节点的数量。