当所有nimbuses关闭时,nimbus leader锁队列没有重新填充

uklbhaso  于 2021-06-24  发布在  Storm
关注(0)|答案(0)|浏览(201)

我们正在尝试用docker swarm运行apache storm群集。通过设计,docker swarm可以删除任何容器,并从图像中创建一个新的容器。
为了手动测试行为,我创建了以下docker compose文件。 $PATH_TO_STORM 只是我克隆和编译官方存储库的目录https://github.com/apache/storm/


# !/bin/bash

docker rm -f my-zookeeper my-nimbus-1 my-nimbus-2 ui supervisor
docker run -d --restart always --network storm-cluster --hostname my-zookeeper --name my-zookeeper zookeeper
docker run -d --restart always --network storm-cluster --hostname my-nimbus-1 --name my-nimbus-1 storm storm nimbus -c storm.zookeeper.servers='["my-zookeeper"]'
docker run -d --restart always --network storm-cluster --hostname my-nimbus-2 --name my-nimbus-2 storm storm nimbus -c storm.zookeeper.servers='["my-zookeeper"]'
docker run -d -p 8081:8080 --restart always --network storm-cluster --name ui storm storm ui -c storm.zookeeper.servers='["my-zookeeper"]' -c nimbus.seeds='["my-nimbus-1", "my-nimbus-2"]'
docker run -d --restart always --network storm-cluster --name supervisor storm storm supervisor -c storm.zookeeper.servers='["my-zookeeper"]' -c nimbus.seeds='["my-nimbus-1", "my-nimbus-2"]'
docker run -it --rm -v $PATH_TO_STORM/examples/storm-starter/target/storm-starter-2.1.1-SNAPSHOT.jar:/topology.jar --network storm-cluster storm storm jar /topology.jar org.apache.storm.starter.WordCountTopology topology -c storm.zookeeper.server='["my-zookeeper"]' -c nimbus.seeds='["my-nimbus-1", "my-nimbus-2"]'

现在,当我移除两个nimbus容器并重新创建它们时,leader锁保持为空

docker rm -f my-nimbus-1
docker rm -f my-nimbus-2
docker run -d --restart always --network storm-cluster --hostname my-nimbus-1 --name my-nimbus-1 storm storm nimbus -c storm.zookeeper.servers='["my-zookeeper"]'
docker run -d --restart always --network storm-cluster --hostname my-nimbus-2 --name my-nimbus-2 storm storm nimbus -c storm.zookeeper.servers='["my-zookeeper"]'

以下是zookeeper的输出:

[zk: localhost:2181(CONNECTED) 0] ls /storm/nimbuses
[my-nimbus-1, my-nimbus-2]
[zk: localhost:2181(CONNECTED) 1] get /storm/nimbuses/my-nimbus-
my-nimbus-1   my-nimbus-2   
[zk: localhost:2181(CONNECTED) 1] get /storm/nimbuses/my-nimbus-1
�f`d``�����M*-�5�``b`�|������*&nV��V#==��$d1
[zk: localhost:2181(CONNECTED) 2] get /storm/nimbuses/my-nimbus-2
�f`d``�����M*-�5�``b`�|������F&nV��V#==l�O~1
[zk: localhost:2181(CONNECTED) 3] ls /storm/leader-lock
[]

(对编码问题表示歉意)
Zookeeper会挑选灵媒,但不会把它们列为合格的领队。
当我只关闭一个容器并重新创建它时,新的nimbus在leader锁中排队

docker rm -f my-nimbus-1
docker run -d --restart always --network storm-cluster --hostname my-nimbus-1 --name my-nimbus-1 storm storm nimbus -c storm.zookeeper.servers='["my-zookeeper"]'

当我只停止并重新启动nimbuses时,即使所有nimbuses同时关闭,集群也会恢复。

docker stop my-nimbus-1 my-nimbus-2
docker restart my-nimbus-1 my-nimbus-2

但是,当我关闭容器时,请移除它们并重新创建它们

docker stop my-nimbus-1 my-nimbus-2
docker rm -f my-nimbus-1
docker rm -f my-nimbus-2
docker run -d --restart always --network storm-cluster --hostname my-nimbus-1 --name my-nimbus-1 storm storm nimbus -c storm.zookeeper.servers='["my-zookeeper"]'
docker run -d --restart always --network storm-cluster --hostname my-nimbus-2 --name my-nimbus-2 storm storm nimbus -c storm.zookeeper.servers='["my-zookeeper"]'

我遇到了和以前一样的问题。
这告诉我一些事情:
只要有一个领头羊,一个新的光环就会被正确地拾取并排队
当没有前导并且出现前一个容器的相同示例时,它将有资格作为前导(即使它不是前一个前导)
这不会是释放锁的问题,因为在本例中,停止并重新创建容器应该是有效的
这告诉我zookeeper保存了一些特定于示例的信息
但是,我在zookeeper中找不到任何特定示例:leader\ u锁本身只包含hostname和portnumber,并且两者保持不变

[zk: localhost:2181(CONNECTED) 0] get /storm/leader-lock/_c_453939d7-e738-409e-bdd9-9f57a35714aa-latch-0000000000
my-nimbus-1:6627

前导锁名称中的数字是uuid,即使在重新启动容器时也会重新生成。


# After restart:

[zk: localhost:2181(CONNECTED) 2] get /storm/leader-lock/_c_ac566844-0355-4918-8ede-261c41f479da-latch-0000000002
my-nimbus-1:6627

leader info包含一个序列化的类,但是当停止的容器和以前不是leader的nimbus重新启动时,它会被简单地覆盖

[zk: localhost:2181(CONNECTED) 8] get /storm/storm/leader-info
��sr"org.apache.storm.nimbus.NimbusInfo��ӄ�7isLeaderIportLhosttLjava/lang/String;xp�t
                                                                                     my-nimbus-1

这就引出了我的问题:
风暴中的灵光领袖选举如何运作?假设保存了某些特定于示例的信息,对吗?如果是,在哪里?
我怎样才能让docker swarm中的集群保持活力?我需要保证总有一个能干的领导者吗?或者有没有一种方法可以在所有灵光一次被重建的情况下恢复?
我们正在运行风暴2.1

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题