zookeeper注册中心服务异常下线原因排查
问题及原因
最近接手了一个旧项目,项目分为4个模块,模块之间的采用http通信。通信的http框架是自研的,使用了zookeeper作为注册中心。刚接手不免要debug调试,但是在测试环境debug打断点经过一段时间之后,项目之间调用时经常发生zk上服务找不到的情况,在项目重启之后服务又恢复正常。
排查发现,项目启动的时候在zookeeper上注册的是一个临时节点,当zk服务端与客户端连接中断时候,zk服务端会删除这个临时节点。在第一次创建连接时ZooKeeper都会为客户端分配一个全局唯一的sessionID,通过ping客户端保持会话。项目自研的http框架设置ping的时间间隔默认为30s,因为debug会中断其他线程运行,导致zk服务器与客户端通信中断,临时节点被删除。
排查到这里,我以为就结束了,当我把项目中的超时时间设定为120S之后,连接还是只保持了40S就中断了。原来zk服务端也有一个超时时间限制,在zk的/conf/zoo.cfg配置文件中,有一个tickTime参数,默认值为2000ms。这个参数限制了会话超时时间:默认为tickTime的 2到20倍,超时时间由客户端设置且不能超出最小最大范围(4S-40S)。
在我把服务端的tickTime参数调整到了5000ms,连接时间成功保持了120S。
附上部署zookeeper镜像的流程
# 拉取最新版镜像
docker search zookeeper
docker pull zookeeper
# 创建挂载目录
mkdir -p /usr/local/zookeeper/data
mkdir -p /usr/local/zookeeper/datalog
mkdir -p /usr/local/zookeeper/logs
# 运行镜像
docker run -itd -p 21813:2181 --restart always --name=zookeeper-dev --privileged=true \
-v /usr/local/zookeeper/data:/data \
-v /usr/local/zookeeper/datalog:/datalog \
-v /usr/local/zookeeper/logs:/logs \
-e "ZOO_STANDALONE_ENABLED=true" \
-e "TZ=Asia/Shanghai" \
-e "ZOO_4LW_COMMANDS_WHITELIST=*" \
-e "ZOO_AUTOPURGE_SNAPRETAINCOUNT=5" \
-e "ZOO_AUTOPURGE_PURGEINTERVAL=24" \
-e "ZOO_MAX_CLIENT_CNXNS=64" \
-e "ZOO_TICK_TIME=2000" \
-e "ZOO_INIT_LIMIT=100" \
-e "ZOO_SYNC_LIMIT=5" \
zookeeper:latest
# 把配置文件copy一份到本地
docker cp zookeeper-dev:/conf /usr/local/zookeeper/
# 编辑zoo.cfg文件
vi /usr/local/zookeeper/zoo.cfg
dataDir=/data
dataLogDir=/datalog
tickTime=5000
initLimit=100
syncLimit=5
autopurge.snapRetainCount=5
autopurge.purgeInterval=24
maxClientCnxns=64
standaloneEnabled=true
admin.enableServer=true
server.1=localhost:2888:3888;2181
4lw.commands.whitelist=*
# 重新运行docker镜像
docker stop zookeeper-dev
docker rm zookeeper-dev
docker run -itd -p 21813:2181 -p 8873:2888 -p 8872:3888 --restart always --name=zookeeper-dev --privileged=true \
-v /usr/local/zookeeper/conf/zoo.cfg:/conf/zoo.cfg \
-v /usr/local/zookeeper/data:/data \
-v /usr/local/zookeeper/logs:/datalog \
-e "TZ=Asia/Shanghai" \
-e "JAVA_OPTS=-server -Xms512m -Xmx512m -Xmn256m -Duser.home=/opt -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m -XX:+AlwaysPreTouch -XX:-UseBiasedLocking" \
zookeeper:latest