使用Docker-compose搭建三节点Cassandra集群是否需要额外配置
三节点Cassandra Docker集群随机缺节点问题解决方案
配置错误问题(核心诱因)
你当前的docker-compose配置存在4个直接导致随机故障的错误:
- 种子节点配置逻辑错误
Cassandra要求种子节点必须是集群中已就绪的节点,你当前配置存在三处问题:- node1未配置
CASSANDRA_SEEDS,自身加入集群时没有种子节点参考 - node2的种子列表包含还未启动的node3(172.30.0.4),node3的种子列表包含还未启动的node2(172.30.0.3),两个副本同时启动时必然有一个无法连接到未就绪的种子节点,直接导致节点加入集群失败
- 同时配置了废弃的
SEEDS变量和官方标准CASSANDRA_SEEDS变量,存在参数冲突
修正方法:三个节点的CASSANDRA_SEEDS统一配置为172.30.0.2(即先启动的node1地址),删除废弃的SEEDS参数
- node1未配置
- 数据目录挂载冲突
三个节点全部挂载了同一个本地目录./musicdb,Cassandra每个节点需要独立的存储空间,多节点往同一个目录写数据会直接导致文件锁冲突、元数据损坏,节点服务异常退出。
修正方法:每个节点挂载独立的本地目录,比如node1用./node1/data,node2用./node2/data,node3用./node3/data - 启动等待逻辑缺失
你配置的depends_on: node1仅会等待node1容器启动,不会等待node1内的Cassandra服务完全初始化完成。node1的Cassandra还没完成gossip初始化时,node2、node3就发起连接请求,会直接被拒绝导致加入集群失败,这就是故障有随机性的核心原因:node1启动速度快时集群就能正常组建,启动慢就会有节点加入失败。
修正方法:给node1添加健康检查,检测9042端口就绪后再启动node2、node3,避免并发连接压力 - 核心集群参数未统一配置
你注释掉了集群名称、数据中心、机架等核心参数,不同节点如果读取到的默认值不一致,会直接导致节点拒绝加入集群。
修正方法:三个节点统一显式配置相同的CASSANDRA_CLUSTER_NAME、CASSANDRA_DC、CASSANDRA_RACK参数
优化建议
- 不要使用
cassandra:latest镜像标签,固定具体版本号(比如cassandra:4.1),避免镜像滚动更新带来的兼容性问题 - 生产环境建议显式配置
MAX_HEAP_SIZE和HEAP_NEWSIZE,避免Cassandra自动分配的内存不符合宿主机资源限制,导致进程被OOM杀死 - 三个节点保持当前一致的
ulimits参数即可,不需要修改
修正后的核心配置参考
version: '3' services: node1: image: cassandra:4.1 container_name: coordinatorNode hostname: node1 networks: dc1ring: ipv4_address: 172.30.0.2 volumes: - ./node1/data:/var/lib/cassandra environment: - CASSANDRA_CLUSTER_NAME=dse_cluster - CASSANDRA_SEEDS=172.30.0.2 - CASSANDRA_BROADCAST_ADDRESS=172.30.0.2 - CASSANDRA_DC=DC1 - CASSANDRA_RACK=RAC1 expose: - 7000 - 7001 - 7199 - 9042 - 9142 ports: - 9042:9042 ulimits: memlock: -1 nproc: 32768 nofile: 100000 healthcheck: test: ["CMD-SHELL", "cqlsh -u cassandra -p cassandra -e 'describe cluster'"] interval: 15s timeout: 30s retries: 10 restart: always node2: image: cassandra:4.1 container_name: replicantNode1 hostname: node2 networks: dc1ring: ipv4_address: 172.30.0.3 volumes: - ./node2/data:/var/lib/cassandra environment: - CASSANDRA_CLUSTER_NAME=dse_cluster - CASSANDRA_SEEDS=172.30.0.2 - CASSANDRA_BROADCAST_ADDRESS=172.30.0.3 - CASSANDRA_DC=DC1 - CASSANDRA_RACK=RAC1 expose: - 7000 - 7001 - 7199 - 9042 - 9142 ports: - 9043:9042 ulimits: memlock: -1 nproc: 32768 nofile: 100000 depends_on: node1: condition: service_healthy restart: always node3: image: cassandra:4.1 container_name: replicantNode2 hostname: node3 networks: dc1ring: ipv4_address: 172.30.0.4 volumes: - ./node3/data:/var/lib/cassandra environment: - CASSANDRA_CLUSTER_NAME=dse_cluster - CASSANDRA_SEEDS=172.30.0.2 - CASSANDRA_BROADCAST_ADDRESS=172.30.0.4 - CASSANDRA_DC=DC1 - CASSANDRA_RACK=RAC1 expose: - 7000 - 7001 - 7199 - 9042 - 9142 ports: - 9044:9042 ulimits: memlock: -1 nproc: 32768 nofile: 100000 depends_on: node1: condition: service_healthy restart: always networks: dc1ring: ipam: driver: default config: - subnet: 172.30.0.0/16
注意:首次启动前请删除之前生成的./musicdb目录,避免残留损坏数据影响集群启动
内容的提问来源于stack exchange,提问作者Felipito
相关产品推荐
相关产品推荐

