Zookeeper使用上的注意事项
前段时间为Guang.com引入了Zookeeper,主要用于存储一些动态config/data,分布式锁,负载均衡,服务器监控等。现在,mark down一下zookeeper使用的注意事项和一些总结。
Zookeeper默认不会自动清理快照和事务日志,如果不用作数据备份,建议开启自动清理(3.4.0后可以使用)。
# The number of snapshots to retain in dataDir autopurge.snapRetainCount=3 # Purge task interval in hours autopurge.purgeInterval=1 # Set to "0" to disable auto purge feature
客户端调用getData(),ZK client不保证数据是最新的,有可能有延时latency情况,如果对数据精确性要求很高,需要先调用 sync()。
客户端对于ZK server list采用round robin 轮询方式连接。
watches 是 One-time trigger,在通知后,需重新注册watcher。
只要执行setData() ,不管data有没有改变,都会出发NodeDataChanged
数据被频繁多次修改,客户端可能只会收到一次watch event。
CONNECTION_LOSS后,在SESSION_TIMEOUT内,re-establish connection后,watches/EPHEMERAL 依然有效。
如果整个ZK集群down了,重启后,session 就算超过了timeout,session依然会有效,因为session timeouts 是 tracked by the leader,同理如果leader down了,在重新选leader过程所费时间也算在timeout。
ZK会将每次更新操作以事务日志的形式写入disk,所以disk的性能很影响ZK的性能,尽量使用单独disk来写事务日志。
有时候会由于数据文件出错(READ DATA LOG ERROR)导致无法启动ZK,在确保Leader正常运行情况下,可以删除本地data 和 dataLog,重新启动ZK,通过Leader同步数据。
一些常用的命令
echo stat|nc localhost 2281 //输出server简要状态和连接的客户端信息 echo conf|nc localhost 2281 //输出server的详细配置信息 echo cons|nc localhost 2281 //输出指定server上所有客户端连接的详细信息 echo wchs|nc localhost 2281 //列出所有watcher信息概要信息,数量等 echo wchc|nc localhost 2281 //列出所有watcher信息,以watcher的session为归组单元排列 echo mntr|nc localhost 2281 //输出一些ZK运行时信息,通过对这些返回结果的解析,可以达到监控的效果
watcher绑定与watches event触发对应关系表
“/path” | “/path/child” | |||||
---|---|---|---|---|---|---|
exists | getData | getChildren | exists | getData | getChildren | |
create(“/path”) | √ | √ | ||||
delete(“/path”) | √ | √ | √ | |||
setData(“/path”) | √ | √ | ||||
create(“/path/child”) | √ | √ | √ | |||
delete(“/path/child”) | √ | √ | √ | √ | ||
setData(“/path/child”) | √ | √ |