2 个节点的 ZooKeeper 集群 - 当一个节点以编程方式关闭时的奇怪行为
ZooKeeper cluster of 2 nodes - strange behavior when one node is down programmatically
当我有两个节点运行时,一切都按预期工作
[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
然而
[dmitry@zk2-prod]/etc/supervisor.d% sudo supervisorctl status
zookeeper RUNNING pid 4838, uptime 0:04:01
只要我把 slave 带回来 - 我会立即得到第一个输出(模式:leader)
[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 可以 select 领导者吗?
我认为一个实例将能够 select 自己作为领导者并继续服务请求。
我是不是漏掉了什么?
Do I need 3 instances at least so
org.apache.zookeeper.server.quorum.QuorumPeerMain can select a leader?
是的,容忍丢失一台服务器的情况。
在 Zookeeper 仲裁中,只要大多数服务器可用,zookeeper 服务就可用。服务器无法选举自己作为领导者。
在这种情况下,2 台服务器构成整体,其中 2 台服务器占多数。当一个人丢失时,占多数的成员也随之丢失。失去多数被认为是法定人数的失败。
一个更容易解释的3服务器场景,如果一个输了仍然2保持多数,但是如果输了2个,这个3中的多数成员-member quorum丢失会导致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
然而
[dmitry@zk2-prod]/etc/supervisor.d% sudo supervisorctl status
zookeeper RUNNING pid 4838, uptime 0:04:01
只要我把 slave 带回来 - 我会立即得到第一个输出(模式:leader)
[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 可以 select 领导者吗?
我认为一个实例将能够 select 自己作为领导者并继续服务请求。
我是不是漏掉了什么?
Do I need 3 instances at least so org.apache.zookeeper.server.quorum.QuorumPeerMain can select a leader?
是的,容忍丢失一台服务器的情况。
在 Zookeeper 仲裁中,只要大多数服务器可用,zookeeper 服务就可用。服务器无法选举自己作为领导者。
在这种情况下,2 台服务器构成整体,其中 2 台服务器占多数。当一个人丢失时,占多数的成员也随之丢失。失去多数被认为是法定人数的失败。
一个更容易解释的3服务器场景,如果一个输了仍然2保持多数,但是如果输了2个,这个3中的多数成员-member quorum丢失会导致zookeeper服务不可用。