添加Cassandra节点后如何重平衡集群并回收磁盘空间
新节点加入集群后仅会接管对应token范围的读写请求,原节点上不再负责的存量数据不会自动清除,因此磁盘占用不会随扩容自动下降,可按以下优先级选择方案回收空间:
方案1:单线程分批执行nodetool cleanup(适配性最高)
你关注的cleanup临时磁盘升高问题可以通过参数控制大幅降低:
- 执行时添加
--jobs 1参数限制为单线程运行,全程临时磁盘占用最高仅等于集群中单张最大表的大小,远低于全量repair所需的多副本临时空间 - 执行顺序选择已完成数据同步的非种子节点逐个运行,每次仅操作1个节点,确认当前节点磁盘回收完成后再处理下一个,全程不影响线上业务可用性
- 若当前剩余空间不足,可以先清理未自动删除的历史snapshot、归档commitlog,腾挪出10%左右的可用空间即可支撑单线程cleanup运行
方案2:指定范围增量回收(适合剩余空间不足10%的极端场景)
如果连单线程全节点cleanup的空间都凑不出来,可以拆分操作粒度逐步回收:
- 先针对指定keyspace甚至单表执行cleanup:
nodetool cleanup <keyspace名称> <表名>,优先清理小表,回收部分空间后再处理大表 - 若有配置TTL的表,先执行单表压实
nodetool compact <keyspace名称> <表名>合并过期墓碑,这个操作临时空间占用比cleanup更低,可以快速腾出部分空间
不建议操作
- 现阶段不要执行全量
nodetool repair:repair需要跨节点对比多副本数据,生成大量临时Merkle树文件,临时空间占用通常是cleanup的2~3倍,完全不适合当前磁盘紧张的场景 - 不要手动删除data目录下的sstable文件,会直接导致数据丢失
后续扩容建议
你后续还有新增节点的计划,可以每新增2个节点就执行一轮逐节点cleanup,无需等所有节点扩容完成再处理,避免磁盘占用持续堆积。
内容的提问来源于stack exchange,提问作者Radhika
相关产品推荐
相关产品推荐

