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

使用Docker Compose部署Cassandra三节点集群,如何避免节点分裂为独立环?

Cassandra集群节点分裂,无法形成完整环的解决方法

环境配置

  • 系统:已更新至最新版本的XUbuntu
  • Docker环境:已配置官方Docker仓库,安装了最新版Docker工具套件,通过apt-get安装docker-compose

使用的docker-compose.yaml文件

version: "3.3"
 
networks:
  cassandra-net:
    driver: bridge
    
services:
 
  cassandra-1:
    image: "cassandra:latest"
    container_name: "cassandra-1"
    ports:
      - "7000:7000"
      - "9042:9042"
    networks:
      - "cassandra-net"
    volumes:
      - ./volumes/cassandra-1:/var/lib/cassandra:rw      

  cassandra-2:
    image: "cassandra:latest"
    container_name: "cassandra-2"
    environment:
      - "CASSANDRA_SEEDS=cassandra-1"
    networks:
      - "cassandra-net"
    depends_on:
      - "cassandra-1"
    volumes:
      - ./volumes/cassandra-2:/var/lib/cassandra:rw      
 
  cassandra-3:
    image: "cassandra:latest"
    container_name: "cassandra-3"
    networks:
      - "cassandra-net"
    environment:
      - "CASSANDRA_SEEDS=cassandra-1"
    depends_on:
      - "cassandra-1"
    volumes:
      - ./volumes/cassandra-3:/var/lib/cassandra:rw

节点状态检查脚本

docker exec -it cassandra-1 nodetool status
docker exec -it cassandra-2 nodetool status
docker exec -it cassandra-3 nodetool status

实际输出结果

Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address     Load        Tokens  Owns (effective)  Host ID                               Rack 
UN  172.18.0.3  252.53 KiB  16      100.0%            640dbf8a-13bb-46e5-8b1e-4542ee3352c4  rack1
UN  172.18.0.2  189.34 KiB  16      100.0%            7807001a-1885-41d1-b661-bd6c7e0db239  rack1

Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address     Load        Tokens  Owns (effective)  Host ID                               Rack 
UN  172.18.0.4  178.24 KiB  16      100.0%            fe8fb5fe-7342-4eeb-92bb-01a755ecd8ad  rack1
UN  172.18.0.2  263.65 KiB  16      100.0%            7807001a-1885-41d1-b661-bd6c7e0db239  rack1

Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address     Load        Tokens  Owns (effective)  Host ID                               Rack 
UN  172.18.0.3  178.2 KiB   16      100.0%            640dbf8a-13bb-46e5-8b1e-4542ee3352c4  rack1
UN  172.18.0.2  263.65 KiB  16      100.0%            7807001a-1885-41d1-b661-bd6c7e0db239  rack1

问题描述

预期每个节点都能识别集群中的三个节点(172.18.0.2、172.18.0.3、172.18.0.4),但实际每个节点仅能看到自身和种子节点cassandra-1,集群分裂成多个独立小环,无法形成统一的Cassandra集群。

解决步骤

  1. 严格控制节点启动顺序与等待时间
    depends_on只保证容器启动顺序,不代表Cassandra服务完全就绪。正确启动流程:

    • 先启动cassandra-1:docker-compose up -d cassandra-1
    • 查看日志确认服务就绪:docker logs -f cassandra-1,直到出现Startup complete字样后,再启动其他节点:docker-compose up -d cassandra-2 cassandra-3
  2. 统一种子节点配置
    Cassandra种子节点用于集群发现,建议至少配置2个种子节点避免单点故障。修改docker-compose.yaml中各节点的环境变量:

    # cassandra-1的环境变量
    environment:
      - "CASSANDRA_SEEDS=cassandra-1,cassandra-2"
    # cassandra-2的环境变量
    environment:
      - "CASSANDRA_SEEDS=cassandra-1,cassandra-2"
    # cassandra-3的环境变量
    environment:
      - "CASSANDRA_SEEDS=cassandra-1,cassandra-2"
    
  3. 显式配置广播地址
    在Docker环境中,Cassandra默认的自动地址绑定可能导致节点发现异常,为每个节点添加广播地址配置(对应各自的container_name):

    # cassandra-1添加
    environment:
      - "CASSANDRA_LISTEN_ADDRESS=auto"
      - "CASSANDRA_BROADCAST_ADDRESS=cassandra-1"
    # cassandra-2添加
    environment:
      - "CASSANDRA_LISTEN_ADDRESS=auto"
      - "CASSANDRA_BROADCAST_ADDRESS=cassandra-2"
      - "CASSANDRA_SEEDS=cassandra-1,cassandra-2"
    # cassandra-3添加
    environment:
      - "CASSANDRA_LISTEN_ADDRESS=auto"
      - "CASSANDRA_BROADCAST_ADDRESS=cassandra-3"
      - "CASSANDRA_SEEDS=cassandra-1,cassandra-2"
    
  4. 清理旧数据重新初始化
    如果之前的错误启动导致数据不一致,先清理环境:

    # 停止所有容器
    docker-compose down
    # 删除本地挂载的数据目录
    rm -rf ./volumes/cassandra-1 ./volumes/cassandra-2 ./volumes/cassandra-3
    

    之后按照步骤1的正确顺序重新启动集群。

  5. 验证集群状态
    启动完成后,在任意节点执行docker exec -it cassandra-1 nodetool status,确认三个节点均显示为UN状态,且每个节点的状态输出中都包含另外两个节点的信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 12:19:53