使用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集群。
解决步骤
严格控制节点启动顺序与等待时间
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
- 先启动cassandra-1:
统一种子节点配置
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"显式配置广播地址
在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"清理旧数据重新初始化
如果之前的错误启动导致数据不一致,先清理环境:# 停止所有容器 docker-compose down # 删除本地挂载的数据目录 rm -rf ./volumes/cassandra-1 ./volumes/cassandra-2 ./volumes/cassandra-3之后按照步骤1的正确顺序重新启动集群。
验证集群状态
启动完成后,在任意节点执行docker exec -it cassandra-1 nodetool status,确认三个节点均显示为UN状态,且每个节点的状态输出中都包含另外两个节点的信息。
内容的提问来源于stack exchange,提问作者tcs
相关产品推荐
相关产品推荐

