Cassandra集群CommitLog无法轮转、Hints目录膨胀致磁盘满求助
问题:Cassandra集群CommitLog无法轮转、Hints目录膨胀导致磁盘占满
Cassandra集群出现CommitLog持续增长无法自动轮转、Hints目录不断膨胀的问题,数小时内节点磁盘会被完全占满,目前只能通过手动执行flush和drain操作维持运行。
核心错误日志
ERROR [CommitLogArchiver:1] 2023-07-28 17:27:19,289 CassandraDaemon.java:244 - Exception in thread Thread[CommitLogArchiver:1,5,main] java.lang.RuntimeException: java.io.IOException: Exception while executing the command: ln /cassandra/commitlog/CommitLog-6-*****.log /cassandra/commitlog/CommitLog-6-*****.log, command error Code: 1, command output: ln: failed to create hard link ‘/cassandra/commitlog/CommitLog-6-****.log’: File exists
补充日志信息
... at org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:84) [apache-cassandra-3.11.10.jar:3.11.10] at java.lang.Thread.run(Thread.java:750) ~[na:1.8.0_342] Caused by: java.io.IOException: Exception while executing the command: ln /cassandra/commitlog/CommitLog-6-1690545624564.log /cassandra/commitlog/CommitLog-6-1690545624564.log, command error Code: 1, command output: ln: failed to create hard link ‘/cassandra/commitlog/CommitLog-6-1690545624564.log’: File exists . . . WARN [CompactionExecutor:80864] 2023-07-28 18:31:35,403 BigTableWriter.java:211 - Writing large partition *****:***_490267998772576797 (124.548MiB) to sstable /cassandra/data1/**/event_source-0b510d8003e811ecb8bb3d20c002593b/md-15942-big-Data.db INFO [ReadStage-3] 2023-07-28 18:32:03,841 NoSpamLogger.java:91 - Maximum memory usage reached (536870912), cannot allocate chunk of 1048576 WARN [CompactionExecutor:80864] 2023-07-28 18:32:36,245 BigTableWriter.java:211 - Writing large partition ***/***:2023-07-28:61:com.Ticket (112.067MiB) to sstable /cassandra/data1/****/****-869ff7d3f4d711ed9031839535e0fa8e/md-1381-big-Data.db ... INFO [HintsDispatcher:8394] 2023-07-28 18:44:12,914 HintsDispatchExecutor.java:282 - Finished hinted handoff of file 7c57e613-f0c6-4f67-9da5-3cfaad15de29-1690397494422-1.hints to endpoint /100.125.114.117: 7c57e613-f0c6-4f67-9da5-3cfaad15de29 INFO [ReadStage-2] 2023-07-28 18:47:05,188 NoSpamLogger.java:91 - Maximum memory usage reached (536870912), cannot allocate chunk of 1048576 WARN [CompactionExecutor:80867] 2023-07-28 18:47:24,120 BigTableWriter.java:211 - Writing large partition ***/event_source:comTicket:***_998981534549995600 (166.860MiB) to sstable /cassandra/data1/****/***-0b510d8003e811ecb8bb3d20c002593b/md-15947-big-Data.db ...
解决方案
1. 修复CommitLog无法轮转问题
- 检查归档配置:查看
commitlog_archiving.properties,确认是否误将归档目标路径设置为CommitLog目录本身(即/cassandra/commitlog/),这会导致Cassandra尝试创建硬链接时源文件和目标文件完全一致,触发报错中断归档流程。 - 临时恢复:
- 执行
nodetool flush将内存数据刷写到SSTable,确保CommitLog文件可安全删除。 - 手动删除已完成flush的CommitLog文件(避免删除最新的未flush文件)。
- 修改
commitlog_archiving.properties,注释掉错误的归档规则,或设置正确的归档目标路径(需与CommitLog目录不同)。 - 重启Cassandra节点,观察CommitLog是否正常轮转。
- 执行
2. 解决Hints目录膨胀问题
- 排查节点可用性:Hints积压通常是因为目标节点(如日志中的
/100.125.114.117)长期离线或故障,导致本地节点无法分发Hints。修复该节点的网络或服务故障,确保其稳定加入集群。 - 清理积压Hints:
- 若目标节点已恢复,等待Hints自动分发完成(可通过
nodetool statushints查看进度)。 - 若目标节点确认无法恢复,可手动删除对应节点ID的Hints文件(路径为
/cassandra/hints/下以节点UUID命名的文件),操作前需确认该节点的数据已无恢复必要,避免数据丢失。
- 若目标节点已恢复,等待Hints自动分发完成(可通过
3. 优化大分区与内存压力
- 大分区治理:
- 调整表的分区键设计,避免单分区数据量超过100MiB(日志中多次出现大分区写入警告)。例如,将时间维度加入分区键,拆分大分区为多个小分区。
- 开启大分区监控:设置
compaction_large_partition_warning_threshold参数(默认100MiB),及时发现并处理大分区。
- 内存调整:
- 日志中出现
Maximum memory usage reached提示,说明文件缓存不足。可修改cassandra.yaml中的file_cache_size_in_mb参数,从默认512MB调整为1GB左右(根据节点物理内存调整,建议不超过物理内存的1/4),缓解读取时的内存压力。
- 日志中出现
内容的提问来源于stack exchange,提问作者user101
相关产品推荐
相关产品推荐

