多区域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
相关产品推荐
相关产品推荐

