You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多区域Cassandra集群跨数据中心节点无法互联求助

跨数据中心部署Cassandra节点无法互相发现问题排查

在两个拥有公网IP(分别为111.111.111.x和222.222.222.x)的主机上,通过Docker容器部署Cassandra集群,每个数据中心(DC)部署3个节点,但跨DC的节点无法互相发现。同一主机部署多DC时可正常互联,nc测试显示对方主机7000端口可连通,Cassandra日志无报错。

DC1(111.111.111.x主机)docker-compose配置

version: '3.3'

services:
  cass1:
    image: cassandra
    container_name: cass1
    hostname: cass1
    healthcheck:
        test: ["CMD", "cqlsh", "-e", "describe keyspaces" ]
        interval: 5s
        timeout: 5s
        retries: 60
    networks:
      - cassandra
    ports:
      - "9042:9042"
      - "7000:7000"
    environment: &environment
        HEAP_NEWSIZE: 128M
        MAX_HEAP_SIZE: 2048M
        CASSANDRA_SEEDS: "cass1, cass2, 222.222.222.222"
        CASSANDRA_CLUSTER_NAME: ks
        CASSANDRA_DC: DC1
        CASSANDRA_RACK: West
        CASSANDRA_ENDPOINT_SNITCH: GossipingPropertyFileSnitch
        CASSANDRA_NUM_TOKENS: 256

  cass2:
    image: cassandra
    container_name: cass2
    hostname: cass2
    healthcheck:
        test: ["CMD", "cqlsh", "-e", "describe keyspaces" ]
        interval: 5s
        timeout: 5s
        retries: 60
    networks:
      - cassandra
    ports:
      - "9043:9042"
      - "7001:7000"
    environment: *environment
    depends_on:
      - cass1

  cass3:
    image: cassandra
    container_name: cass3
    hostname: cass3
    healthcheck:
        test: ["CMD", "cqlsh", "-e", "describe keyspaces" ]
        interval: 5s
        timeout: 5s
        retries: 60
    networks:
      - cassandra
    ports:
      - "9044:9042"
      - "7002:7000"
    environment: *environment
    depends_on:
      - cass2

networks:
  cassandra:

DC2(222.222.222.x主机)docker-compose配置

version: '3.3'

services:
  cass1:
    image: cassandra
    container_name: cass1
    hostname: cass1
    healthcheck:
        test: ["CMD", "cqlsh", "-e", "describe keyspaces" ]
        interval: 5s
        timeout: 5s
        retries: 60
    networks:
      - cassandra
    ports:
      - "9042:9042"
      - "7000:7000"
    environment: &environment
        HEAP_NEWSIZE: 128M
        MAX_HEAP_SIZE: 2048M
        CASSANDRA_SEEDS: "cass1, cass2, 111.111.111.111"
        CASSANDRA_CLUSTER_NAME: ks
        CASSANDRA_DC: DC2
        CASSANDRA_RACK: East
        CASSANDRA_ENDPOINT_SNITCH: GossipingPropertyFileSnitch
        CASSANDRA_NUM_TOKENS: 256

  cass2:
    image: cassandra
    container_name: cass2
    hostname: cass2
    healthcheck:
        test: ["CMD", "cqlsh", "-e", "describe keyspaces" ]
        interval: 5s
        timeout: 5s
        retries: 60
    networks:
      - cassandra
    ports:
      - "9043:9042"
      - "7001:7000"
    environment: *environment
    depends_on:
      - cass1

  cass3:
    image: cassandra
    container_name: cass3
    hostname: cass3
    healthcheck:
        test: ["CMD", "cqlsh", "-e", "describe keyspaces" ]
        interval: 5s
        timeout: 5s
        retries: 60
    networks:
      - cassandra
    ports:
      - "9044:9042"
      - "7002:7000"
    environment: *environment
    depends_on:
      - cass2

networks:
  cassandra:

DC1节点nodetool status输出

Datacenter: DC1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address     Load        Tokens  Owns (effective)  Host ID                               Rack
UN  172.18.0.4  108.81 KiB  256     60.1%             3ceecd38-0c30-4189-9a52-cb23465ca0ca  West
UN  172.18.0.3  113.77 KiB  256     70.4%             f1f6f63a-7cc5-4883-8b90-5159c6b6613c  West
UN  172.18.0.2  108.74 KiB  256     69.5%             94395942-8efa-447b-9961-2d80375bce35  West

nc端口连通性测试结果

nc -v 222.222.222.222 7000
Connection to 222.222.222.222 7000 port [tcp/*]
succeeded!

排查与修复建议

  • 修正节点地址宣告配置:当前Cassandra节点向集群广播的是Docker内部IP(如172.18.0.x),跨DC节点无法访问该私有IP。需在每个节点的环境变量中添加:

    CASSANDRA_LISTEN_ADDRESS: 0.0.0.0  # 让Cassandra监听所有容器内部地址
    CASSANDRA_BROADCAST_ADDRESS: 111.111.111.x  # DC1节点填所在主机公网IP,DC2填222.222.222.x
    

    该配置让节点对外宣告可被跨DC访问的公网IP,而非内部私有IP。

  • 调整种子节点列表:当前种子包含本地容器hostname(cass1、cass2),跨DC环境下无法解析这些本地名称。种子节点应仅保留公网IP的种子节点,例如:

    CASSANDRA_SEEDS: "111.111.111.x,222.222.222.x"
    

    确保两个DC的种子列表一致,且仅包含可跨网络访问的公网IP。

  • 验证端口映射完整性:除7000端口(Gossip通信)外,需确保9042(CQL)、7001(SSL Gossip,若启用)端口正确映射。但当前nc测试已确认7000连通,主要问题仍集中在地址宣告和种子配置。

修改后重启所有节点,再次执行nodetool status即可查看跨DC节点是否加入集群。

内容的提问来源于stack exchange,提问作者stroiker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 23:07:07