【问题标题】:Cassandra: nodes in 2nd datacenter failing to connectCassandra:第二个数据中心的节点无法连接
【发布时间】: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)。使用多数据中心设置时不是这种情况吗?

【问题讨论】:

    标签: azure docker cassandra


    【解决方案1】:

    对于您的问题,如果您只是在不同的虚拟机上运行 Cassandra,而不是使用 Docker,那么这是在不同节点上使用多数据中心的情况。但是你在 Docker 上运行 Cassandra。那么就遇到了容器通过多主机通信的问题。

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

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

    【讨论】:

      猜你喜欢
      • 2018-05-08
      • 2016-03-04
      • 2015-04-19
      • 2018-10-01
      • 1970-01-01
      • 2011-11-25
      • 1970-01-01
      • 1970-01-01
      • 2015-03-01
      相关资源
      最近更新 更多