工作中遇到以下问题: 1、一台zk节点失联后,重启一直无法加入zk集群中,导致无法对外提供服务 2、zk的log和快照占大量空间 3、客户端连接有失败有成功 4、zk客户端偶尔会有失败连接 5、报错:smaller server identifier,so dropping

以上问题生产环境中经常会遇到

1. zk无法加入zk集群

现象: 使用zkCli.sh无法连接成功该zk节点 日志: 首先想到的是将该节点restart, 但问题依旧, 故查看zk的log, 有大量的如下日志

2018-07-18 17:31:12,015 - INFO  [WorkerReceiver Thread:FastLeaderElection@496] - Notification: 1 (n.leader), 77309411648 (n.zxid), 1 (n.round), LOOKING (n.state), 1 (n.sid), LOOKING (my state)
2018-07-18 17:31:12,016 - INFO  [WorkerReceiver Thread:FastLeaderElection@496] - Notification: 3 (n.leader), 73014444480 (n.zxid), 831 (n.round), LEADING (n.state), 3 (n.sid), LOOKING (my state)
2018-07-18 17:31:12,017 - INFO  [WorkerReceiver Thread:FastLeaderElection@496] - Notification: 3 (n.leader), 77309411648 (n.zxid), 832 (n.round), FOLLOWING (n.state), 2 (n.sid), LOOKING (my state)
2018-07-18 17:31:15,219 - INFO  [QuorumPeer:/0.0.0.0:2181:FastLeaderElection@697] - Notification time out: 6400

解决办法: 这个是在3.3.4版本中的一个bug,在新版本中3.5已经修复了,建议使用最新版本 如果你使用的是这个版本,那你只能通过重启leader来解决了

2. zk的log和快照占大量空间

现象:zk的datadir下的version-2下有很多快照,日志目录下有大日志文件(单个文件太大),有些东西是没有用的,所以建议定期清除 解决办法:在zk的配置文件中添加自动清理日志和快照的开关autopurge.purgeInterval=1,当然也可以中过个年autopurge.snapRetainCount来设置需要保留的snapshot文件个数,默认是3个。

3. 客户端连接有失败有成功

现象:客户端的连接有的可以连,有的连接失败 日志: Too many connection from 127.0.0.1 -max is 60 解决办法: 更改zk配置的连接数maxClientCnxns 加大这个值,默认是60,不建议设置的太大,防止DDOS×××

4. zk客户端偶尔会有失败连接

现象:有时客户端偶尔会连不上zk 原因:

这种情况比较复杂,跟代码及逻辑有关系了,以及当前的业务量有关系,比如zk处理大量的短连接请求时,SYN QUEUE的accept queue有时候被打满,这就尴尬了,直接导致连接失败。 详细可以查看这篇文章 https://blog.csdn.net/varyall/article/details/79681562 解决办法: syn队列的大小是系统用来限制网络的高并发的,具体参数如下: net.ipv4.tcp_max_syn_backlog和net.core.somaxconn,这两值设置为一样即可 如果太小了,会导致这种问题,需要按量提高,不要太高了。 生产环境中最终的解决办法是最好降低和zk的短连接数量,这样就基本不会出这种问题。

5. 报错:smaller server identifier,so dropping

现象:使用客户端连接没法连上,查看zk日志,发现很多报错报错:smaller server identifier,so dropping 解决办法: 按zk的myid的大小从小到大一次重启zk服务器,首先保证有问题的zk不重启。 分析原因:zk是需要集群中所有机器两两建立连接的, 其中配置中的3555端口是用来进行选举时机器直接建立通讯的端口, 大id的server才会去连接小id的server,避免连接浪费.如果是最后重启myid最小的实例,该实例将不能加入到集群中, 因为不能和其他集群建立连接