Kubernetes中3节点Cassandra集群出现本地暂停告警,求排查原因
问题背景
你通过Bitnami/Cassandra Helm Chart在Kubernetes中部署了3节点Cassandra集群,高请求量运行一段时间后出现了一系列告警,其中最核心的疑问是Not marking nodes down due to local pause告警的触发原因。结合你提供的日志、线程池状态和消息丢弃统计,我们来逐一拆解:
核心告警日志
WARN [GossipTasks:1] 2020-01-09 11:39:33,070 FailureDetector.java:278 - Not marking nodes down due to local pause of 8206335128 > 5000000000 WARN [GossipTasks:1] 2020-01-09 11:39:42,238 FailureDetector.java:278 - Not marking nodes down due to local pause of 6668041401 > 5000000000 WARN [GossipTasks:1] 2020-01-09 11:40:03,341 FailureDetector.java:278 - Not marking nodes down due to local pause of 15041441083 > 5000000000 WARN [PERIODIC-COMMIT-LOG-SYNCER] 2020-01-09 11:41:55,606 NoSpamLogger.java:94 - Out of 1 commit log syncs over the past 0.00s with average duration of 11850.79ms, 1 have exceeded the configured commit interval by an average of 1850.79ms WARN [GossipTasks:1] 2020-01-09 11:42:20,019 Gossiper.java:783 - Gossip stage has 1 pending tasks; skipping status check (no nodes will be marked down) INFO [RequestResponseStage-1] 2020-01-09 11:45:36,329 Gossiper.java:1011 - InetAddress /100.96.7.7 is now UP INFO [RequestResponseStage-1] 2020-01-09 11:45:36,330 Gossiper.java:1011 - InetAddress /100.96.7.7 is now UP INFO [ScheduledTasks:1] 2020-01-09 11:45:55,931 MessagingService.java:1236 - MUTATION消息在过去5000毫秒内被丢弃:0条内部消息,45条跨节点消息。平均内部丢弃延迟:0毫秒,平均跨节点丢弃延迟:2874毫秒 INFO [Service Thread] 2020-01-09 12:11:49,292 GCInspector.java:284 - ParNew GC耗时659ms。CMS Old Gen: 2056877512 -> 2057740336; Par Eden Space: 671088640 -> 0; Par Survivor Space: 2636992 -> 6187520
补充线程池状态
线程池名称 活跃数 等待数 已完成数 阻塞数 累计阻塞数 ReadStage 0 0 245904 0 0 MiscStage 0 0 0 0 0 CompactionExecutor 0 0 696906 0 0 MutationStage 0 0 244820 0 0 MemtableReclaimMemory 0 0 697 0 0 PendingRangeCalculator 0 0 9 0 0 GossipStage 0 0 3138625 0 0 SecondaryIndexManagement 0 0 0 0 0 HintsDispatcher 0 0 10 0 0 RequestResponseStage 0 0 364305 0 0 Native-Transport-Requests 0 0 11089339 0 241 ReadRepairStage 0 0 5395 0 0 CounterMutationStage 0 0 0 0 0 MigrationStage 0 0 6 0 0 MemtablePostFlush 0 0 725 0 0 PerDiskMemtableFlushWriter_0 0 0 697 0 0 ValidationExecutor 0 0 0 0 0 Sampler 0 0 0 0 0 MemtableFlushWriter 0 0 697 0 0 InternalResponseStage 0 0 869 0 0 ViewMutationStage 0 0 0 0 0 AntiEntropyStage 0 0 0 0 0 CacheCleanupExecutor 0 0 0 0 0
消息丢弃类型统计
READ 0 RANGE_SLICE 0 _TRACE 0 HINT 0 MUTATION 45 COUNTER_MUTATION 0 BATCH_STORE 0 BATCH_REMOVE 0 REQUEST_RESPONSE 0 PAGED_RANGE 0 READ_REPAIR 0
核心告警的本质原因
Not marking nodes down due to local pause这个告警,本质是Cassandra的**FailureDetector(故障检测器)**发现本地节点出现了长时间的进程停顿(日志里的停顿时间分别是8s、6s、15s,都超过了默认的5s阈值)。为了避免误判远程节点为故障(毕竟是本地自己卡了,不是对方节点真的挂了),所以Cassandra没有标记其他节点为Down。
结合Kubernetes环境的特性,主要有这几类诱因:
JVM GC停顿(最可能的原因)
从日志里的GC记录能看到,Old Gen内存已经接近满容(2057MB左右),虽然这次ParNew GC只耗时659ms,但大概率存在Full GC或者CMS并发模式失败导致的长时间停顿——这类停顿会让JVM完全无法处理Gossip心跳、消息收发等任务,直接触发告警。
另外线程池里Native-Transport-Requests有241次累计阻塞,也侧面证明请求处理曾被GC停顿打断过。Kubernetes节点资源限制与抢占
- 如果你的Cassandra Pod设置了严格的CPU/memory
limits,当节点资源紧张时,kubelet会对Pod进行CPU节流(CPU Throttling),或者触发OOM Killer前的内存回收,导致Cassandra进程出现长时间停顿。 - 节点上的其他高负载Pod抢占了磁盘IO、网络带宽,也会让Cassandra无法及时完成Commit Log同步(日志里已经出现Commit Log sync超时的告警)、Memtable刷盘等操作,进而阻塞整个进程。
- 如果你的Cassandra Pod设置了严格的CPU/memory
磁盘IO性能瓶颈
Kubernetes环境中如果使用共享存储(比如EBS、Ceph),高请求量下很容易碰到IOPS或带宽上限。Cassandra对磁盘IO非常敏感,一旦IO跟不上,Memtable刷盘、Commit Log同步、Compaction这些核心操作都会变慢,直接引发进程停顿。日志里的Commit Log sync耗时11.8s,远超配置间隔,就是磁盘IO不足的典型信号。Gossip消息堆积与网络延迟
日志里出现了Gossip stage has 1 pending tasks的告警,说明Gossip线程池无法及时处理心跳消息:- 集群内跨节点网络延迟过高(日志里跨节点消息丢弃平均延迟2874ms),导致Gossip消息积压;
- 本地节点CPU资源不足,无法及时处理Gossip任务,进而引发进程停顿。
Kubernetes环境下的排查与优化建议
- 优先搞定GC问题:
- 开启并收集Cassandra的GC日志,分析是否存在长时间的Full GC或CMS停顿;
- 调整JVM参数:增大堆内存(注意要匹配Kubernetes Pod的memory limits),调整CMS的
CMSInitiatingOccupancyFraction参数提前触发GC,或者改用G1GC来减少停顿时间。
- 检查Pod资源配置:
- 用
kubectl top pod查看Cassandra Pod的CPU/memory使用率,确认是否接近limits; - 查看节点的kubelet日志,是否有资源节流的记录;
- 放宽过于严格的资源限制,或者给Cassandra集群分配专属的节点池,避免和其他高负载组件抢占资源。
- 用
- 优化存储性能:
- 在Pod内用
iostat、iotop工具检查磁盘IO使用率,确认是否达到存储的IOPS/带宽上限; - 如果是云环境,考虑升级存储类型(比如AWS从GP2到GP3),或者使用本地存储(Local PV)来提升IO性能。
- 在Pod内用
- 优化网络与Gossip配置:
- 用
ping、traceroute检查集群内Pod的网络延迟,确认网络是否稳定; - 调整Cassandra的Gossip参数:比如增大
gossip_interval减少心跳频率,或者调整phi_convict_threshold(注意这个参数会影响故障检测的灵敏度,需谨慎调整)。
- 用
内容的提问来源于stack exchange,提问作者devopsdymyr




