当前位置: 首页 > 分布式系统 > 正文

zookeeper问题汇总

关键字:
1 星2 星3 星4 星5 星 (暂无评分)
Loading ... Loading ...
baidu_share

在此纪录线上出现的一些问题以及解决方法:

1.系统服务时间不对,导致ZooKeeper集群不可用

现象:zookeeper集群不可用,系统重启和zookeeper重启都不管用。相当于没有集群启动起来。

原因分析:3台集群时间每台都不一样,相差10几分钟。

解决:修改3台集群机器的系统时间一致,重启zookeeper集群。

建议:检查系统的时间是否一致.

2.DiskIO过大或者IO不正常,导致ZooKeeper集群不稳定

现象:ZooKeeper集群突然不稳定,net IO较大,TCP连接数不稳定,使用mntr命令查看ZooKeeper的情况,可以看到排队请求(zk_outstanding_request)有250+

原因分析:ZooKeeper的历史日志较多,可能部分数据放到系统的交换分区里影响到磁盘IO性能。

解决:删除不稳定的机器的历史日志,只保留了当日的日志,ZooKeeper集群的IO瞬间飙升至一个高点,四五分钟后,趋于平稳,使用mntr命令查看ZooKeeper的情况,可以看到已基本无排队请求(zk_outstanding_request)。

PS:后来又删除两个和ZooKeeper无关的大日志文件(70G),可能看到ZooKeeper集群相应有NetIO以及TCP链接数的变动,也是数分钟后又趋于平稳。

建议:通过ZooKeeper四字命令(如cons、mntr、ruok)监控ZooKeeper的当前运行状态;此外ZooKeeper日志配置要谨慎,日志目录与数据目录最好放在不同分区下,日志策略在配置时不必留太多日志,info级别、500M一个文件即可。

3.ZooKeeper客户端导致内存溢出

现象:客户端使用了netflix开源的curator客户端,在长时间运行、以及网络抖动情况下,很容易曝出connection loss错误并最终内存溢出

原因分析:curator对ZooKeeper的封装太复杂(PathCache),且其session过期处理有问题。

解决:自行基于官方客户端做简单封装,或者使用另一个非常简单的ZooKeeper-client。

建议: 谨慎选择ZooKeeper客户端,上线前务必经过严格的稳定性测试;

4.ZooKeeper session过期时间以及watch的使用

现象:客户端总是抱connection loss错误,在服务端发现客户端重连时setwatch失败

原因分析:客户端 session过期时间设置过短,在网络抖动时很容易导致session过期,此时重连接需要重建watch,watch数量过多,或者watch的路径过长,而ZooKeeper目前版本在处理长数据时有限制会导致失败。

解决:加长ZooKeeper session过期时间(60S或者更长),分析数据结构,减少watch数量。

建议: session过期时间要设长,此外watch要谨慎使用,数量过多会严重影响ZooKeeper性能;

5. 大量的CLOSE_WAIT连接

现象:长连接数大于5w,实际只有200,大量的CLOSE_WAIT连接

原因分析:很多链接其实已经断开,只是没销毁。

解决:vi /etc/sysctl.conf 加入如下参数

net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 0
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 100
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 20000
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 15

执行/sbin/sysctl -p 生效

重启网络 /etc/rc.d/init.d/network restart

建议重启zookeeper。

本文固定链接: http://www.chepoo.com/zookeeper-issue-summary.html | IT技术精华网

zookeeper问题汇总:等您坐沙发呢!

发表评论