Cassandra:第二个数据中心中的节点无法连接

时间:2019-03-28 22:06:46

标签: azure docker cassandra

我正在尝试在Azure VM的2个数据中心上将Cassandra设置为docker容器。我正在浏览位于https://gokhanatil.com/2018/02/build-a-cassandra-cluster-on-docker.html的指南。但是,我不明白的是,尽管指定了不同的数据中心,但该指南似乎在同一VM上生成了cas2和cas3节点。尽管声称拥有不同的数据中心,他们是否仍会物理上位于同一位置?

我试图做的是在另一个VM上启动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,指定CASSANDRA_SEEDS匹配Azure的cassandra-1 VM的Azure外部IP时,就会死于以下错误:

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

在容器一直无法连接的第二台VM上执行以下命令:

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)。使用多数据中心设置时不是这种情况吗?

1 个答案:

答案 0 :(得分:0)

对于您的问题,如果仅在不同的VM上而不是在Docker上运行Cassandra,则在不同的节点上使用多数据中心时就是这种情况。但是您可以在Docker上运行Cassandra。然后容器就会通过多主机进行通信。

通过多主机进行Docker容器通信,这是一个复杂的问题。您应该创建一个Docker集群,然后容器才能通过多主机进行通信。对您来说,这意味着Cassandra可以通过不同VM上的不同数据中心进行通信。

我建议您可以尝试在具有多个节点的AKS集群上运行Cassandra。