当前位置:首页>Linux>Linux Cassandra故障排查:日志分析、常见 OOM、GC 问题

Linux Cassandra故障排查:日志分析、常见 OOM、GC 问题

  • 2026-10-21 13:29:26
Linux Cassandra故障排查:日志分析、常见 OOM、GC 问题

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后:

  • 详细调用栈:Throwable堆栈
  • 读写路径:Mutation/ReadStage细节

场景:延迟高时,追踪慢查询


三、常见 OOM 问题诊断与调优

3.1 Heap OOM(最常见)

症状:java.lang.OutOfMemoryError: Java heap space,节点DOWN

原因:

  • Heap设置过小(MAX_HEAP_SIZE)
  • 大查询/Memtable膨胀(heap_buffers模式)
  • Row Cache(已废弃)

诊断:

  • gc.log:Full GC频繁
  • nodetool info:Heap Usage接近100%
  • 日志:Heap is full

调优:

  • 切换offheap_objects(第4篇)
  • 降低Heap到16-24G
  • 应用层分页/限流

3.2 Direct Memory OOM

症状:java.lang.OutOfMemoryError: Direct buffer memory

5.0常见(Trie offheap):

  • offheap_memtable空间不足
  • Netty缓冲泄漏

诊断:

  • -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问题

  • 长暂停:单次GC>5s → 延迟抖动

原因:Heap过大(>31G)、大对象分配

调优:

  • Heap限16G

  • -XX:MaxGCPauseMillis=500

  • Generational ZGC(Java21+,低暂停)

  • 频繁GC:Young GC每秒多次 → CPU高

原因:写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最佳实践

  • Java17 + G1(默认)
  • 大集群Java21 + ZGC(暂停<10ms)
  • 监控:jvm_gc_pause_seconds_sum

五、故障排查通用流程

  1. 监控告警触发 → 定位节点/指标
  2. nodetool status/info/tpstats → 节点状态、线程池
  3. system.log尾部 → ERROR/WARN
  4. gc.log分析 → GC暂停
  5. jstack/jmap → 线程/Heap dump
  6. 重启/干预 → drain + restart

最新文章

随机文章