zookeeper能启动但无法选举问题

今天一大早4点多就睡不着了,困绕了我近半年的zookeeper能启动但无法选举问题让我头疼。起床试试吧。

经过一天的奋战,试了无数种方法(当然因为zookeeper用途太广了,这半年也多次尝试,却都没有解决)。

现象:

1.QuorumPeerMain进程可能正常启动。但使用zkServer.sh status查看状态时报:[richard@richard3 zookeeper-3.4.6]$ bin/zkServer.sh status
JMX enabled by default
Using config: /home/richard/zookeeper-3.4.6/bin/../conf/zoo.cfg
Error contacting service. It is probably not running.

2.查看日志发现报错:

2016-01-16 19:04:51,488 [myid:0] - WARN  [WorkerSender[myid=0]:QuorumCnxManager@
382] - Cannot open channel to 2 at election address /192.168.1.112:3888
java.net.ConnectException: 拒绝连接
    at java.net.PlainSocketImpl.socketConnect(Native Method)  ............


我试过几种方案:

1.防火墙未关闭,因为我使用的是centos7,防火墙关闭方法与以前不一样了,从网上查了一下,使用chkconfig   iptables off关闭。问题未解决。

2.java版本太高?因为我用的是java8,所以怀疑java版本问题。降到java7。同样未能解决问题。

3.网上查到

1)打开zkServer.sh 找到
status)
    STAT=`echo stat | nc localhost $(grep clientPort "$ZOOCFG" | sed -e 's/.*=//') 2> /dev/null| grep Mode`
在nc与localhost之间加上 -q 1 (是数字1而不是字母l)
如果已存在则去掉
我用的是zookeeper-3.4.6,zkServer.sh脚本文件里根本没有这一行,我的zkServer.sh中是下面这样:

STAT=`"$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
             -cp "$CLASSPATH" $JVMFLAGS org.apache.zookeeper.client.FourLetterWordMain \
             $clientPortAddress $clientPort srvr 2> /dev/null    \
          | grep Mode`
    if [ "x$STAT" = "x" ]
    then
        echo "Error contacting service. It is probably not running."
        exit 1
    else
        echo $STAT
        exit 0
    fi

所以此法无效。


3.虚拟机的问题?我就装了windows 和linux双系统。

在纯linux下装了虚拟机也不管用。


。。。。。。。

今天经过一天的奋斗结果发现原因竟是最简单的问题:防火墙的问题。其实应该把iptables和firewall都关掉才行,而我只把iptables关闭了,而firewall却逍遥法外,应该用下面方法把firewall也关掉。

systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running)



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ZooKeeper 集群中,每个节点都可以成为 Leader 节点,它负责管理集群中所有的数据更新请求,并将更新结果通知给其他节点。当集群中没有 Leader 节点时,就需要进行选举操作。 ZooKeeper 选举算法的基本原理是:节点通过互相发送消息来确认自己是否为 Leader,只要某个节点收到了超过半数以上节点的确认消息,它就可以成为 Leader。 ZooKeeper启动时会执行以下步骤: 1. 每个节点先尝试连接集群中任意一个节点,如果连接成功,则表示当前节点是 Follower 节点,否则表示当前节点是 Candidate 节点。 2. Candidate 节点会向集群中的其他节点发送消息,要求它们确认自己是否可以成为 Leader。 3. 其他节点收到消息后,会检查当前节点的 zxid(ZooKeeper 事务 id)是否比自己的大,如果是,则表明当前节点的数据更新更加新,可以成为 Leader;如果不是,则拒绝当前节点成为 Leader。 4. 如果当前节点收到了超过半数以上节点的确认消息,则它成为 Leader,否则重新进行选举操作。 5. 新选出的 Leader 节点向集群中的其他节点发送消息,通知它们自己已经成为了 Leader。 以上就是 ZooKeeper 首次启动时进行选举的基本过程。需要注意的是,如果当前集群已经有了 Leader 节点,新加入的节点就不需要进行选举操作了,它会自动成为 Follower 节点并接受 Leader 的数据更新。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值