我正在尝试在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)。使用多数据中心设置时不是这种情况吗?
答案 0 :(得分:0)
对于您的问题,如果仅在不同的VM上而不是在Docker上运行Cassandra,则在不同的节点上使用多数据中心时就是这种情况。但是您可以在Docker上运行Cassandra。然后容器就会通过多主机进行通信。
通过多主机进行Docker容器通信,这是一个复杂的问题。您应该创建一个Docker集群,然后容器才能通过多主机进行通信。对您来说,这意味着Cassandra可以通过不同VM上的不同数据中心进行通信。
我建议您可以尝试在具有多个节点的AKS集群上运行Cassandra。