【发布时间】:2019-03-28 22:06:45
【问题描述】:
我正在尝试将 Cassandra 设置为跨 Azure VM 上的 2 个数据中心作为 docker 容器。我是按照位于此处的指南进行的:https://gokhanatil.com/2018/02/build-a-cassandra-cluster-on-docker.html。然而,我不明白的是,尽管指定了不同的数据中心,但该指南似乎在同一虚拟机上生成了 cas2 和 cas3 节点。尽管声称拥有不同的数据中心,但他们在物理上不会仍然在同一个位置吗?
我尝试在不同的虚拟机上启动 cas3 节点,同时在第一个数据中心 (cas1) 中指定种子节点的公共 IP。我还在 Azure UI 中将这两个 VM 上的公共 IP 和 Cassandra 端口(7000、7001、7199、9042、9160、9142)列入白名单,以便它们可以看到彼此。
cas1 和 cas2 作为单独的容器在同一个 VM 上生成,可以看到彼此并且都启动了,正如指南所声称的:
admin@cassandra-1:~$ sudo docker exec -ti cas1 nodetool status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 172.17.0.3 295.15 KiB 256 49.2% c79d0871-d4a3-4735-a0e0-80304009989d rack1
UN 172.17.0.2 263.4 KiB 256 50.8% 5990e65d-9a69-4fe1-8879-100382f38349 rack1
我在不同区域的 VM 上生成的 cas3,指定与 Azure 的 cassandra-1 VM 的外部 IP 匹配的 CASSANDRA_SEEDS 不断死亡,并出现以下错误:
Exception (java.lang.RuntimeException) encountered during startup: Unable to gossip with any peers
java.lang.RuntimeException: Unable to gossip with any peers
at org.apache.cassandra.gms.Gossiper.doShadowRound(Gossiper.java:1435)
at org.apache.cassandra.service.StorageService.checkForEndpointCollision(StorageService.java:566)
at org.apache.cassandra.service.StorageService.prepareToJoin(StorageService.java:823)
at org.apache.cassandra.service.StorageService.initServer(StorageService.java:683)
at org.apache.cassandra.service.StorageService.initServer(StorageService.java:632)
at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:388)
at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:620)
at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:732)
ERROR [main] 2019-03-28 21:01:19,890 CassandraDaemon.java:749 - Exception encountered during startup
java.lang.RuntimeException: Unable to gossip with any peers
at org.apache.cassandra.gms.Gossiper.doShadowRound(Gossiper.java:1435) ~[apache-cassandra-3.11.4.jar:3.11.4]
at org.apache.cassandra.service.StorageService.checkForEndpointCollision(StorageService.java:566) ~[apache-cassandra-3.11.4.jar:3.11.4]
at org.apache.cassandra.service.StorageService.prepareToJoin(StorageService.java:823) ~[apache-cassandra-3.11.4.jar:3.11.4]
at org.apache.cassandra.service.StorageService.initServer(StorageService.java:683) ~[apache-cassandra-3.11.4.jar:3.11.4]
at org.apache.cassandra.service.StorageService.initServer(StorageService.java:632) ~[apache-cassandra-3.11.4.jar:3.11.4]
at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:388) [apache-cassandra-3.11.4.jar:3.11.4]
at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:620) [apache-cassandra-3.11.4.jar:3.11.4]
at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:732) [apache-cassandra-3.11.4.jar:3.11.4]
INFO [StorageServiceShutdownHook] 2019-03-28 21:01:19,914 HintsService.java:209 - Paused hints dispatch
WARN [StorageServiceShutdownHook] 2019-03-28 21:01:19,914 Gossiper.java:1559 - No local state, state is in silent shutdown, or node hasn't joined, not announcing shutdown
INFO [StorageServiceShutdownHook] 2019-03-28 21:01:19,914 MessagingService.java:981 - Waiting for messaging service to quiesce
INFO [ACCEPT-/172.17.0.2] 2019-03-28 21:01:19,915 MessagingService.java:1336 - MessagingService has terminated the accept() thread
INFO [StorageServiceShutdownHook] 2019-03-28 21:01:23,224 HintsService.java:209 - Paused hints dispatch
我使用以下命令在第一个 VM 上创建了 2 个容器:
docker run --name cas1 -p 9042:9042 -e CASSANDRA_CLUSTER_NAME=cluster1 -e CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch -e CASSANDRA_DC=datacenter1 -d cassandra
docker run --name cas2 -e CASSANDRA_SEEDS="$(docker inspect --format='{{ .NetworkSettings.IPAddress }}' cas1)" -e CASSANDRA_CLUSTER_NAME=cluster1 -e CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch -e CASSANDRA_DC=datacenter1 -d cassandra
在容器一直无法连接的第二个虚拟机上执行以下命令:
docker run --name cas3 -e CASSANDRA_SEEDS="[cassandra-1-external-ip]" -e CASSANDRA_CLUSTER_NAME=cluster1 -e CASSANDRA_ENDPOINT_SNITCH=GossipingPropertyFileSnitch -e CASSANDRA_DC=datacenter2 -d cassandra
我没有指定 CASSANDRA_LISTEN_ADDRESS 或 CASSANDRA_BROADCAST_ADDRESS,因为说明声称默认值适用于大多数情况 (https://hub.docker.com/_/cassandra)。使用多数据中心设置时不是这种情况吗?
【问题讨论】: