Linux Cassandra故障排查:日志分析、常见 OOM、GC 问题
一、Cassandra 日志体系详解
1.1 日志文件位置与类型
默认路径:/var/log/cassandra/(可cassandra.yaml配置)
主要文件:
- system.log:主日志,所有级别事件(INFO/WARN/ERROR)
- debug.log:调试级别(需启用,详细调用栈)
- gc.log:JVM GC日志(cassandra-env.sh配置)
- output.log:启动脚本输出(systemd下journal)
- commitlog/:CommitLog归档(可选)
5.0变化:日志格式更结构化,支持JSON输出(logback.xml配置)。
1.2 日志级别调整(logback.xml)
/opt/cassandra/conf/logback.xml:
<rootlevel="INFO"><appender-refref="STDOUT" /><appender-refref="SYSTEMLOG" /></root># 临时调试<loggername="org.apache.cassandra"level="DEBUG"/>
重启生效,或动态(JMX)。
生产建议:平时INFO,排查时DEBUG(注意磁盘爆炸)。
1.3 日志轮转
logback配置大小/时间轮转:
<appendername="SYSTEMLOG"class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${cassandra.logdir}/system.log</file><rollingPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${cassandra.logdir}/system.log.%d{yyyy-MM-dd}.%i.gz</fileNamePattern><maxFileSize>100MB</maxFileSize><maxHistory>30</maxHistory></rollingPolicy></appender>
二、system.log 关键模式分析
2.1 启动阶段日志
正常:
INFO [main] Starting listening for CQL clients...INFO [main] Binding thrift service to *:9160INFO [GossipStage] Node localhost/127.0.0.1 is now part of the cluster
常见错误:
- Bind失败:
java.net.BindException: Address already in use → 端口冲突(9042/7000) - JMX失败:
Failed to bind JMX service → 端口7199冲突或认证错误 - Config错误:
Invalid yaml → 检查cassandra.yaml缩进
2.2 运行阶段日志
- Gossip问题:
Unable to gossip with any peers → 种子/seeds配置错、网络不通 - Bootstrap失败:
Streaming failed → 网络/磁盘慢,检查netstats - Repair日志:
Repair session completed with differences → 不一致修复 - Compaction:
Compacting large partition → 大Partition警告 - Hinted Handoff:
Hinted handoff backlog → 节点恢复慢
grep模板:
grep "ERROR\|WARN\|Exception" system.log | tail -50grep "OOM\|OutOfMemory" system.loggrep "GC" system.log
2.3 debug.log 使用
启用DEBUG后:
- 读写路径:Mutation/ReadStage细节
场景:延迟高时,追踪慢查询
三、常见 OOM 问题诊断与调优
3.1 Heap OOM(最常见)
症状:java.lang.OutOfMemoryError: Java heap space,节点DOWN
原因:
- 大查询/Memtable膨胀(heap_buffers模式)
诊断:
- nodetool info:Heap Usage接近100%
调优:
3.2 Direct Memory OOM
症状:java.lang.OutOfMemoryError: Direct buffer memory
5.0常见(Trie offheap):
诊断:
-XX:NativeMemoryTracking=summary(JVM选项)- nodetool info:Off-heap usage
调优:
- 增加memtable_offheap_space_in_mb
- -XX:MaxDirectMemorySize=xxG
3.3 Metaspace/PermGen OOM(旧版)
4.x常见:类加载多
调优:-XX:MaxMetaspaceSize=512M
四、GC 问题诊断与调优
4.1 GC 日志配置(cassandra-env.sh)
JVM_OPTS="$JVM_OPTS -XX:+PrintGCDetails"JVM_OPTS="$JVM_OPTS -XX:+PrintGCDateStamps"JVM_OPTS="$JVM_OPTS -Xloggc:/var/log/cassandra/gc.log"JVM_OPTS="$JVM_OPTS -XX:+UseGCLogFileRotation"JVM_OPTS="$JVM_OPTS -XX:NumberOfGCLogFiles=10"JVM_OPTS="$JVM_OPTS -XX:GCLogFileSize=10M"
推荐G1GC(Java17默认)。
4.2 常见GC问题
原因:Heap过大(>31G)、大对象分配
调优:
Generational ZGC(Java21+,低暂停)
原因:写QPS高、Memtable flush慢
调优:offheap + 增加flush_writers
诊断工具:
jstat -gcutil <pid> 1s # 实时GCjmap -heap <pid> # Heap详情jstack <pid> > thread.dump # 线程栈
nodetool tpstats:GCStage pending
4.3 生产GC最佳实践
- 监控:jvm_gc_pause_seconds_sum
五、故障排查通用流程
- nodetool status/info/tpstats → 节点状态、线程池
- system.log尾部 → ERROR/WARN
- jstack/jmap → 线程/Heap dump