Prometheus 监控 Cassandra 全栈实战:从读写延迟到压缩风暴的分布式可观测性

发布时间:2026/7/10 23:49:52
Prometheus 监控 Cassandra 全栈实战:从读写延迟到压缩风暴的分布式可观测性 Prometheus 监控 Cassandra 全栈实战从读写延迟到压缩风暴的分布式可观测性Apache Cassandra 作为高可用、可扩展的分布式 NoSQL 数据库其节点健康、读写延迟、压缩队列、GC 压力、Hint 堆积等指标直接决定集群的性能与稳定性。Prometheus 通过JMX Exporter或专为 Cassandra 优化的cassandra-exporter将 JMX MBean 和 CQL 查询转化为标准化指标让运维和 DBA 能够像监控微服务一样全局透视 Cassandra 集群。本文将覆盖从 JMX 导出到跨数据中心告警的全部实践。1. 方案选型JMX Exporter vs cassandra-exporter方案优点缺点适用场景JMX ExporterPrometheus 官方 Java 代理配置灵活无需额外进程随 Cassandra 启动可抓取任何 JMX MBean配置较复杂需编写 YAML 规则指标标签可能不如专用 exporter 友好通用 Java 监控已在 Cassandra 集群运行 JMX 的场景cassandra-exporter(Instaclustr/community)专为 Cassandra 设计指标带丰富的标签keyspace、table支持 CQL 查询指标如客户端请求延迟百分位部署简单Sidecar需维护额外进程版本兼容性可能滞后要求开箱即用、面向 DBA 的详细指标DataStax Metrics Collector与 DataStax Enterprise 集成支持 Prometheus仅限 DSE社区版不支持DSE 用户推荐通用场景首选 JMX Exporter零额外进程需要深度表级指标时再并行运行 cassandra-exporter。本文以 JMX Exporter 为主线。2. 使用 JMX Exporter 监控 Cassandra2.1 下载并配置 JMX Exporter在每台 Cassandra 节点上下载jmx_prometheus_javaagentjar 包和编写配置文件。wgethttps://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.20.0/jmx_prometheus_javaagent-0.20.0.jarsudomkdir/etc/cassandra/prometheussudomvjmx_prometheus_javaagent-0.20.0.jar /etc/cassandra/prometheus/创建配置文件/etc/cassandra/prometheus/cassandra_jmx.yml。此处提供一个精简但覆盖关键指标的模板---startDelaySeconds:0hostPort:127.0.0.1:7199# Cassandra JMX 端口默认 7199username:# 若 JMX 启用认证则填写password:ssl:falserules:# 存储与负载-pattern:org.apache.cassandra.metricstypeStorage, nameLoad(Count|Value)name:cassandra_storage_load_bytestype:GAUGE-pattern:org.apache.cassandra.metricstypeStorage, nameTotalDiskSpaceUsed(Count|Value)name:cassandra_storage_total_disk_space_used_bytestype:GAUGE# 读写延迟百分位-pattern:org.apache.cassandra.metricstypeClientRequest, scopeRead, nameLatency(.*)name:cassandra_clientrequest_read_latency_$1-pattern:org.apache.cassandra.metricstypeClientRequest, scopeWrite, nameLatency(.*)name:cassandra_clientrequest_write_latency_$1# 请求速率-pattern:org.apache.cassandra.metricstypeClientRequest, scope(Read|Write), nameLatency(Count)name:cassandra_clientrequest_$1_ops_totaltype:COUNTER# 压缩队列-pattern:org.apache.cassandra.metricstypeCompaction, namePendingTasks(Value)name:cassandra_compaction_pending_taskstype:GAUGE# GC 指标-pattern:java.langtypeGarbageCollector, name(.*)(CollectionCount|CollectionTime)name:jvm_gc_$1_$2# 内存-pattern:java.langtypeMemoryHeapMemoryUsage(used|max)name:jvm_memory_heap_$1# 节点状态 (UP/DOWN)-pattern:org.apache.cassandra.nettypeFailureDetector(.*)name:cassandra_fd_$1# Dropped 消息-pattern:org.apache.cassandra.metricstypeDroppedMessage, scope(.*), name(.*)(Count)name:cassandra_dropped_$1_$2type:COUNTER# 客户端连接-pattern:org.apache.cassandra.metricstypeClient, nameconnectedNativeClients(Value)name:cassandra_connected_native_clients# Hint 堆积-pattern:org.apache.cassandra.metricstypeStorage, nameTotalHintsInProgress(Count)name:cassandra_hints_in_progress# 读写异常-pattern:org.apache.cassandra.metricstypeClientRequest, scope(Read|Write), nameUnavailables(Count)name:cassandra_unavailables_$1type:COUNTER可以根据需要添加更多 MBean参考 Cassandra Metrics 文档。2.2 修改 Cassandra JVM 参数编辑cassandra-env.sh或jvm.options在 JVM 参数中加入代理在cassandra-env.sh的JVM_OPTS追加JVM_OPTS$JVM_OPTS-javaagent:/etc/cassandra/prometheus/jmx_prometheus_javaagent-0.20.0.jar9099:/etc/cassandra/prometheus/cassandra_jmx.yml这里监听端口设为9099避免与现有 Prometheus 端口冲突。重启 Cassandra 后curl http://localhost:9099/metrics即可看到指标。2.3 防火墙与安全Cassandra JMX 通常监听在127.0.0.1:7199JMX Exporter 在本机通过 JMX 获取数据再通过 HTTP 暴露。因此只需放行 9099 端口给 Prometheus 服务器。若 JMX 启用了认证配置文件中填写用户名密码。3. 配置 Prometheus 抓取scrape_configs:-job_name:cassandrascrape_interval:30sstatic_configs:-targets:-node1:9099-node2:9099-node3:9099labels:cluster:prod-clusterdc:dc1多数据中心可分组或添加标签。4. 核心监控指标与 PromQL分类关键指标 (上述规则生成)含义PromQL 示例节点存活cassandra_fd_*或直接up1可达up{jobcassandra}读写延迟 P99cassandra_clientrequest_read_latency_99thPercentile读延迟 P99 (微秒)单位转换为毫秒/ 1000读写请求速率cassandra_clientrequest_Read_ops_total/_Write_ops_total读写 QPSrate(cassandra_clientrequest_Read_ops_total[1m])压缩挂起任务cassandra_compaction_pending_tasks待处理的压缩任务数 50 可能存在问题存储负载cassandra_storage_load_bytes节点数据大小磁盘使用率结合node_filesystem_*不可用异常cassandra_unavailables_Read/_Write因一致性级别未满足的拒绝次数rate(...[5m]) 0告警Dropped 消息cassandra_dropped_*各类丢弃的消息如 MUTATIONrate(cassandra_dropped_MUTATION_... [5m])Hint 堆积cassandra_hints_in_progress待交付给故障节点的 Hint 数 0 需检查节点JVM GCjvm_gc_*_CollectionTime/_CollectionCountGC 暂停与次数rate(jvm_gc_PS_MarkSweep_CollectionTime[5m])注意指标名可能因配置的规则而异请根据实际生成的名称调整 PromQL。计算示例读 P99 延迟 (秒)cassandra_clientrequest_read_latency_99thPercentile / 1e6节点写速率rate(cassandra_clientrequest_Write_ops_total[1m])5. Grafana 仪表盘推荐Cassandra Cluster Dashboard (JMX Exporter)Dashboard ID5407经典全面展示节点状态、读写延迟、压缩、GC、磁盘等。Cassandra with PrometheusID2202备选。自建表级视图若使用 cassandra-exporter可用 ID12675。导入后修改变量cluster、instance即可展现整个集群的宏观与微观状态。6. 告警规则实战groups:-name:cassandra_alertsrules:-alert:CassandraNodeDownexpr:up{jobcassandra} 0for:1mlabels:severity:criticalannotations:summary:Cassandra 节点 {{ $labels.instance }} 下线-alert:CassandraHighReadLatencyexpr:cassandra_clientrequest_read_latency_99thPercentile / 1000100for:5mlabels:severity:warningannotations:summary:读 P99 延迟超过 100ms-alert:CassandraHighWriteLatencyexpr:cassandra_clientrequest_write_latency_99thPercentile / 100050for:5mlabels:severity:warningannotations:summary:写 P99 延迟超过 50ms-alert:CassandraCompactionBacklogexpr:cassandra_compaction_pending_tasks100for:10mlabels:severity:criticalannotations:summary:压缩挂起任务超过 100可能引发读性能下降-alert:CassandraUnavailableExceptionexpr:rate(cassandra_unavailables_Read[5m])0 or rate(cassandra_unavailables_Write[5m])0labels:severity:criticalannotations:summary:Cassandra 出现 Unavailable 异常一致性无法满足-alert:CassandraDroppedMutationsexpr:rate(cassandra_dropped_MUTATION_*[5m])0labels:severity:warningannotations:summary:Cassandra 有 Mutation 消息被丢弃可能存在过载-alert:CassandraHighHeapUsageexpr:jvm_memory_heap_used / jvm_memory_heap_max0.85for:10mlabels:severity:warningannotations:summary:Cassandra 堆内存使用率超过 85%可根据集群规模和负载调整阈值。7. 进阶cassandra-exporter 与多数据中心7.1 使用 cassandra-exporter 获取表级指标如果需要按 keyspace 和 table 的读写延迟、磁盘占用等可部署instaclustr/cassandra-exporterJava agent 模式或独立进程。它通过 CQL 查询system_views或 JMX 暴露更细粒度的指标。例如dockerrun-d\--namecassandra-exporter\-p8080:8080\-eCASSANDRA_HOSTlocalhost\-eCASSANDRA_PORT9042\instaclustr/cassandra-exporter:latestPrometheus 抓取http://node:8080/metrics可获得cassandra_table_read_latency等带keyspace和table标签的指标。7.2 跨数据中心监控在每个数据中心各部署 Prometheus Server 或采用联邦模式并在 Grafana 中通过变量区分dc标签。确保网络延迟允许跨 DC 抓取或使用远程写入。7.3 安全与性能JMX 认证在cassandra-env.sh启用 JMX 密码文件同时更新 JMX Exporter 配置中的用户名/密码。抓取间隔30s~60s 对 Cassandra 影响极小但要避免scrape_interval过于频繁导致 Exporter HTTP 请求积压。指标过滤如果某些 MBean 不需要不要写在规则中以减小指标数量和内存占用。部署完成后Cassandra 集群的节点健康、读写延迟尖峰、压缩拥塞、GC 停顿、Hint 堆积等所有关键信号都会被 Prometheus 捕获并呈现在 Grafana 大屏。任何异常都会通过 Alertmanager 触达团队让分布式数据库的运维从“事后追查”转向“主动防御”。这套可观测体系与你已有的服务器、应用监控无缝融合实现全栈统一监控。