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

使用Docker Swarm部署Cassandra集群失败:容器互连异常

Docker Swarm部署Cassandra集群节点连接失败排查

问题现象

使用Docker Swarm配置Cassandra集群时,容器反复停止重启,节点间无法建立连接,集群状态异常。执行nodetool describecluster输出:

root@f6d8d694f8d4:/# nodetool describecluster
Cluster Information:
    Name: Test Cluster
    Snitch: org.apache.cassandra.locator.SimpleSnitch
    DynamicEndPointSnitch: enabled
    Partitioner: org.apache.cassandra.dht.Murmur3Partitioner
    Schema versions:
        UNREACHABLE: [10.0.8.2, 10.0.2.2]

日志片段显示连接超时:

io.netty.channel.ConnectTimeoutException: connection timed out: /10.0.2.2:7000
    at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe$2.run(AbstractEpollChannel.java:576)
    at io.netty.util.concurrent.PromiseTask.runTask(PromiseTask.java:98)
    at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:170)
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472)
    at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:384)
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.base/java.lang.Thread.run(Unknown Source)
WARN  [OptionalTasks:1] 2022-10-19 20:29:55,349 CassandraRoleManager.java:344 - CassandraRoleManager skipped default role setup: some nodes were not ready

相关配置文件

Dockerfile

FROM cassandra:4.0.6
RUN apt -y update && apt -y install net-tools && apt install iputils-ping

存在问题的Docker Compose文件

version: '3.2'

services:
  cassandra0:
    image: my_cassandra:latest
    volumes:
      - ./cassandra/0:/var/lib/cassandra 
    networks:
      - cassandra
    environment:
      CASSANDRA_BROADCAST_ADDRESS: "cassandra0"
      HEAP_NEWSIZE: "128M"
      MAX_HEAP_SIZE: "512M"
    ports:
      - 7000
      - 9072
      - 7199
    deploy:
      restart_policy:
        condition: on-failure
        max_attempts: 3
        window: 120s
  cassandra1:
    image: my_cassandra:latest
    volumes:
      - ./cassandra/1:/var/lib/cassandra
    networks:
      - cassandra
    environment:
      CASSANDRA_BROADCAST_ADDRESS: "cassandra1"
      CASSANDRA_SEEDS: "cassandra0"
      HEAP_NEWSIZE: "128M"
      MAX_HEAP_SIZE: "512M"
    ports:
      - 7000
      - 9072
      - 7199
    deploy:
      restart_policy:
        condition: on-failure
        max_attempts: 3
        window: 120s
  cassandra2:
    image: my_cassandra:latest
    volumes:
      - ./cassandra/2:/var/lib/cassandra
    networks:
      - cassandra
    environment:
      CASSANDRA_BROADCAST_ADDRESS: "cassandra2"
      CASSANDRA_SEEDS: "cassandra0"
      HEAP_NEWSIZE: "128M"
      MAX_HEAP_SIZE: "512M"
    ports:
      - 7000
      - 9072
      - 7199
    deploy:
      restart_policy:
        condition: on-failure
        max_attempts: 3
        window: 120s
  cassandra3:
    image: my_cassandra:latest
    volumes:
      - ./cassandra/3:/var/lib/cassandra
    networks:
      - cassandra
    environment:
      CASSANDRA_BROADCAST_ADDRESS: "cassandra3"
      CASSANDRA_SEEDS: "cassandra0"
      HEAP_NEWSIZE: "128M"
      MAX_HEAP_SIZE: "512M"
    ports:
      - 7000
      - 9072
      - 7199
    deploy:
      restart_policy:
        condition: on-failure
        max_attempts: 3
        window: 120s
  cassandra4:
    image: my_cassandra:latest
    volumes:
      - ./cassandra/4:/var/lib/cassandra
    networks:
      - cassandra
    environment:
      CASSANDRA_BROADCAST_ADDRESS: "cassandra4"
      CASSANDRA_SEEDS: "cassandra0"
      HEAP_NEWSIZE: "128M"
      MAX_HEAP_SIZE: "512M"
    ports:
      - 7000
      - 9072
      - 7199
    deploy:
      restart_policy:
        condition: on-failure
        max_attempts: 3
        window: 120s
networks:
  cassandra:
          external: true

Overlay网络信息

...
"Name": "cassandra",
        "Id": "w4ooyvfgyuslnlhl0e9tmyfw2",
        "Created": "2022-10-19T22:37:14.60262042+02:00",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.0.10.0/24",
                    "Gateway": "10.0.10.1"
                }
            ]
        }
...

可正常运行的Docker Compose文件

version: "3.2"
  
services:  

  ################################################################
  # The Casandra cluster 
  #   - cassandra-node1
  ################################################################        
  cassandra-001:
    image: my_cassandra
    environment:
      CASSANDRA_BROADCAST_ADDRESS: "cassandra-001"
      HEAP_NEWSIZE: "128M"
      MAX_HEAP_SIZE: "1024M"
    volumes:
      - ./volumes/001:/var/lib/cassandra
    deploy:
      restart_policy:
        condition: on-failure
        max_attempts: 3
        window: 120s
    networks:
      - cluster_net

  ################################################################
  # The Casandra cluster 
  #   - cassandra-node2
  ################################################################        
  cassandra-002:
    image: my_cassandra
    environment:
      CASSANDRA_BROADCAST_ADDRESS: "cassandra-002"
      CASSANDRA_SEEDS: "cassandra-001"
      HEAP_NEWSIZE: "128M"
      MAX_HEAP_SIZE: "1024M"
    volumes:
      - ./volumes/002:/var/lib/cassandra
    deploy:
      restart_policy:
        condition: on-failure
        max_attempts: 3
        window: 120s
    networks:
      - cluster_net

  ################################################################
  # The Casandra cluster 
  #   - cassandra-node3
  ################################################################        
  cassandra-003:
    image: my_cassandra
    environment:
      CASSANDRA_BROADCAST_ADDRESS: "cassandra-003"
      CASSANDRA_SEEDS: "cassandra-001"
      HEAP_NEWSIZE: "128M"
      MAX_HEAP_SIZE: "1024M"
    volumes:
      - ./volumes/003:/var/lib/cassandra
    deploy:
      restart_policy:
        condition: on-failure
        max_attempts: 3
        window: 120s
    networks:
      - cluster_net

  ################################################################
  # The Casandra cluster 
  #   - cassandra-node4
  ################################################################        
  cassandra-004:
    image: my_cassandra
    environment:
      CASSANDRA_BROADCAST_ADDRESS: "cassandra-004"
      CASSANDRA_SEEDS: "cassandra-001"
      HEAP_NEWSIZE: "128M"
      MAX_HEAP_SIZE: "1024M"
    volumes:
      - ./volumes/004:/var/lib/cassandra
    deploy:
      restart_policy:
        condition: on-failure
        max_attempts: 3
        window: 120s
    networks:
      - cluster_net

  ################################################################
  # The Casandra cluster 
  #   - cassandra-node5
  ################################################################        
  cassandra-005:
    image: my_cassandra
    environment:
      CASSANDRA_BROADCAST_ADDRESS: "cassandra-005"
      CASSANDRA_SEEDS: "cassandra-001"
      HEAP_NEWSIZE: "128M"
      MAX_HEAP_SIZE: "1024M"
    volumes:
      - ./volumes/005:/var/lib/cassandra
    deploy:
      restart_policy:
        condition: on-failure
        max_attempts: 3
        window: 120s
    networks:
      - cluster_net

networks:
  cluster_net:
    external:
      name: cassandra 

问题排查与解决方案

对比两个Compose文件,核心差异及修复方案如下:

  • Java堆内存不足
    有问题的配置中MAX_HEAP_SIZE设为512M,远低于正常配置的1024M。Cassandra对内存需求较高,过小的堆内存会导致节点初始化失败、OOM或无法响应连接请求。
    修复:将所有节点的MAX_HEAP_SIZE调整为1024M。

  • 不必要的端口暴露干扰
    Docker Swarm的overlay网络内,服务间通信无需暴露端口。随机映射端口可能导致节点尝试通过宿主机端口通信,而非直接使用overlay网络,引发连接超时。
    修复:移除所有节点的ports配置项。

  • 遗留损坏数据干扰
    之前启动失败的节点可能留下损坏的数据卷,导致重启后无法正常加入集群。
    修复:清理所有节点的本地数据卷(./cassandra/0至./cassandra/4)。

  • 节点启动顺序混乱
    Swarm默认同时启动所有节点,seed节点未就绪时其他节点就尝试连接,导致失败。
    修复:为seed节点添加健康检查,其他节点依赖seed节点健康状态启动:

    cassandra0:
      # ...其他配置
      healthcheck:
        test: ["CMD", "nodetool", "status"]
        interval: 30s
        timeout: 10s
        retries: 5
    cassandra1:
      # ...其他配置
      depends_on:
        cassandra0:
          condition: service_healthy
    

最终修复步骤:

  1. 修改有问题的Compose文件,调整堆内存并移除ports配置
  2. 清理本地数据卷
  3. 重新部署集群:docker stack deploy -c docker-compose.yml cassandra-cluster

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:05:21