• 实际工作中用到Zookeeper集群的地方很多, 也碰到过各种各样的问题, 在这里作个收集整理, 后续会一直补充;
  • 其中很多问题的原因, 解决方案都是google而来, 这里只是作次搬运工;
  • 其实很多问题都跟配置有关, 只怪自己没好好读文档;
  • 问题列表:
    1. 一台 zk 节点重启后始终无法加入到集群中, 无法对外提供服务
    2. zk的log和snapshot占用大量空间
    3. 某台客户端上有的进程可以连接到zk, 有的无法连接
    4. 一台zk服务器无法对外提供服务,报错"Have smaller server identifier, so dropping
    the connection."

    5. zk客户端偶尔无法成功连接到zk server

一台 zk 节点重启后始终无法加入到集群中, 无法对外提供服务
  • 现象: 使用zkCli.sh无法连接成功该zk节点
  • 日志: 首先想到的是将该节点restart, 但问题依旧, 故查看zk的log, 有大量的如下日志
2017-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)
2017-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)
2017-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)
2017-07-18 17:31:15,219 - INFO [QuorumPeer:/0.0.0.0:2181:FastLeaderElection@697] - Notification time out: 6400
zk的log和snapshot占用大量空间
  • 现象: zk的datadir下的version-2下有大量的log和snapshot文件, 占用大量的磁盘空间
  • 解决: 在配置文件里打开周期性自动清理的开关 autopurge.purgeInterval=1, 当然也可以通过 autopurge.snapRetainCount来设置需要保留的snapshot文件个数,默认是3;
某台客户端上有的进程可以连接到zk, 有的无法连接
  • 现象: 同一台客户端机器上启动多个相同的进程, 有些进程无法连接到zk集群
  • zk服务端日志:
Too many connections from /x.x.x.x - max is x
  • 解决: zk的配置中maxClientCnxns设置过小, 这个参数用来限制单个IP对zk集群的并发访问;
一台zk服务器无法对外提供服务,报错"Have smaller server identifier, so dropping the connection."
  • 现象:使用zkCli.sh无法连接成功该zk节点;
  • 日志: 大量报错:Have smaller server identifier, so dropping the connection.
  • 解决方案: 保持这台有问题zk的现状, 按myid从小到大依次重启其他的zk机器;
  • 原因: zk是需要集群中所有机器两两建立连接的, 其中配置中的3555端口是用来进行选举时机器直接建立通讯的端口, 大id的server才会去连接小id的server,避免连接浪费.如果是最后重启myid最小的实例,该实例将不能加入到集群中, 因为不能和其他集群建立连接
zk客户端偶尔无法成功连接到zk server
  • 现象: 同一台机器来运行的zk客户端, 偶发无法成功连接到zk server
  • 分析:
    1. 当时提供给业务一份sdk, sdk初始化时需要先连接zk, 初始化结束后断开zk的连接,业务将这份sdk用在了由fpm-php 处理的前端web请求的php代码中, 该业务的QPS在6K-8K左右, 相当于zk在处理大量的短连接请求;
    2. 在zk服务端监控下列命令的输出, overflowed和droped的数值在不断增加,说明 listen的accept queue有不断被打满的情况
[root@m1 ~]# netstat -s |grep -i listen
53828 times the listen queue of a socket overflowed
53828 SYNs to LISTEN sockets ignored
  • 解决:
    1. 调整相关内核参数:/proc/sys/net/ipv4/tcp_max_syn_backlog和net.core.somaxconn
    2. zk服务端listen时的backlog用的是默认值50, zk没参数用来设置这个,有这个issue:Configurable listen socket backlog for the client port, 里面提供了patch;
    3. 避免客户端有大量短连接的方式连接zk服务;

作者:扫帚的影子
链接:https://www.jianshu.com/p/88ffb54fb43a
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

Zookeeper运维问题集锦的更多相关文章

  1. zookeeper运维 --【】转】

     from:http://blog.csdn.net/hengyunabc/article/details/19006911  zookeeper运维 尽管zookeeper在编程上有很多的阱陷,AP ...

  2. zookeeper 运维

    尽管zookeeper在编程上有很多的阱陷,API也非常的难用,但zookeeper服务本身可以说是很牢靠的了,所以在网上貌似关于运维的文章比较少. 但省心并不代表不会出麻烦,下面总结下zookeep ...

  3. zookeeper运维(转)

    本文以ZooKeeper3.4.3版本的官方指南为基础:http://zookeeper.apache.org/doc/r3.4.3/zookeeperAdmin.html,补充一些作者运维实践中的要 ...

  4. ZooKeeper 运维经验

    转自:http://www.juvenxu.com/2015/03/20/experiences-on-zookeeper-ops/ ZooKeeper 运维经验 ZooKeeper 是分布式环境下非 ...

  5. Zookeeper 运维实践手册

    Zookeeper是一个高可用的分布式数据管理与协调框架,该框架能很好地保证分布式环境中数据一致性.一般用来实现服务发现(类似DNS),配置管理,分布式锁,leader选举等. 一.生产环境中Zook ...

  6. Zookeeper运维常用四字命令

    Zookeeper运维常用四字命令 echo stat|nc 127.0.0.1 2181 查看哪个节点被选择作为follower或者leader 使用echo ruok|nc 127.0.0.1 2 ...

  7. Zookeeper运维经验

    转自:http://www.juvenxu.com/2015/03/20/experiences-on-zookeeper-ops/ ZooKeeper 是分布式环境下非常重要的一个中间件,可以完成动 ...

  8. Zookeeper运维

    一.运维配置         参考:http://zookeeper.apache.org/doc/r3.4.6/zookeeperAdmin.html#sc_configuration 基础配置   ...

  9. Zookeeper运维的一些经验[转]

    Zookeeper是一个分布式协调框架,有不错的性能,也经过许多公司的验证,所以在很多场景都有使用.大家一般用Zookeeper来实现服务发现(类似DNS),配置管理,分布式锁,leader选举等.在 ...

随机推荐

  1. SQL Server - JOIN

    JOIN

  2. centos 6 部署Nodejs

    线上环境需要一套nodjs,没话说,那就部署唠. 一.下载编译包.解压.软链 nodjs历史版本连接:https://nodejs.org/zh-cn/download/releases/ cd /u ...

  3. 转 -Filebeat + Redis 管理 LOG日志实践

    Filebeat + Redis 管理 LOG日志实践 小赵营 关注 2019.01.06 17:52* 字数 1648 阅读 24评论 0喜欢 2 引用 转载 请注明出处 某早上,领导怒吼声远远传来 ...

  4. QML ListView json

    1.main.cpp #include <QGuiApplication> #include <QQmlApplicationEngine> #include <QQml ...

  5. java集合(list,set,map)

    集合 集合与数组 数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用. ...

  6. windows端口并结束其进程

  7. SSH阅读笔记

    1.SSH单阶人脸段检测器,在不同层检测不同scale的人脸,而不是使用mtcnn中金字塔的方式,从而实现加速. 2.SSH的整体结构,3个module的stride分别为8,16,32,使用不同的感 ...

  8. 关于 win10 系统中 Anaconda3 中修改 Jupyter Notebook 默认启动目录

    目标: 修改Anaconda3中自带的Jupyter Notebook默认启动目录. 步骤:     1.提前创建好你想要启动位置文件夹.     2.寻找配置文件,"jupyter_not ...

  9. python设计模式---创建型之工厂模式

    # coding = utf-8 from abc import ABCMeta, abstractmethod # 简单工厂模式 class Animal(metaclass=ABCMeta): @ ...

  10. sklearn交叉验证-【老鱼学sklearn】

    交叉验证(Cross validation),有时亦称循环估计, 是一种统计学上将数据样本切割成较小子集的实用方法.于是可以先在一个子集上做分析, 而其它子集则用来做后续对此分析的确认及验证. 一开始 ...