ZooKeeper集群有2个节点 - 当一个节点以编程方式关闭时出现奇怪的行为

时间:2017-03-31 19:39:56

标签: apache-zookeeper

当我有两个节点运行时,一切都按预期工作

[dmitry@zk2-prod]/etc/supervisor.d% sudo /opt/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: leader

然而,只要我停止其中一个节点 zk1-prod (通过supervisord的supervisorctl)

[dmitry@zk2-prod]/etc/supervisor.d% sudo /opt/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Error contacting service. It is probably not running

hoewever

[dmitry@zk2-prod]/etc/supervisor.d% sudo supervisorctl status
zookeeper                        RUNNING   pid 4838, uptime 0:04:01

一旦我把奴隶带回来 - 我立即得到第一个输出(模式:领导者)

[dmitry@zk2-prod]/etc/supervisor.d% ps aufx G zoo
89:zookeep+  4838  0.2  1.4 2970424 56816 ?       Sl   19:32   0:00  \_ java -Dzookeeper.log.dir=. -Dzookeeper.root.logger=INFO,CONSOLE -cp /opt/zookeeper/bin/../build/classes:/opt/zookeeper/bin/../build/lib/*.jar:/opt/zookeeper/bin/../lib/slf4j-log4j12-1.6.1.jar:/opt/zookeeper/bin/../lib/slf4j-api-1.6.1.jar:/opt/zookeeper/bin/../lib/netty-3.10.5.Final.jar:/opt/zookeeper/bin/../lib/log4j-1.2.16.jar:/opt/zookeeper/bin/../lib/jline-0.9.94.jar:/opt/zookeeper/bin/../zookeeper-3.4.10.jar:/opt/zookeeper/bin/../src/java/lib/*.jar:/opt/zookeeper/bin/../conf: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false org.apache.zookeeper.server.quorum.QuorumPeerMain /opt/zookeeper/bin/../conf/zoo.cfg

我至少需要3个实例,所以 org.apache.zookeeper.server.quorum.QuorumPeerMain 可以选择一个领导者吗?

我认为一个实例将能够选择自己作为领导者并继续提供请求。

我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

  

我至少需要3个实例吗?   org.apache.zookeeper.server.quorum.QuorumPeerMain可以选择领导者吗?

是的,可以容忍丢失一台服务器。

在Zookeeper仲裁中,只要大多数服务器可用,zookeeper服务就可用。服务器不能选择自己作为领导者。

在这种情况下,2个服务器构成整体,2个占多数。当一个人迷路时,多数制造成员就会随之丢失。失去大多数被视为法定人数的失败。

更容易解释 3服务器方案,如果丢失仍有2个仍然保留大多数但是如果丢失2,则此3个成员仲裁中的多数成员将丢失这将导致无法使用zookeeper服务。