技术基础 | 重要指标和告警
本文节选自DataStax Cassandra文档,点击这里查看更多相关信息。
监控Apache Cassandra®和DataStax Enterprise(DSE)集群是一项非常重要的工作,它帮助您识别集群中的问题并及时地应对并缓解问题。
Apache Cassandra和DSE都公开了用于观察和分析的指标。Cassandra通过使用Java管理扩展(Java Management Extensions,即JMX)公开了各种指标、允许临时的配置更改(如更改压实操作的吞吐量),并支持操作的执行(如触发压实操作)。nodetool和其他Cassandra工具也使用JMX。Cassandra文档中描述了不同类型的公开指标。
注意:JMX是Java中的一项技术,它提供了用于管理和监控应用程序的工具。
您可以使用以下工具来收集指标以进行分析:
- 使用JMX的一次性分析工具,包括JConsole、jmxterm和nodetool sjk,我们会在下面介绍。
- DSE OpsCenter使用JMX收集指标并将其存储在DSE中,并将这些指标用于可视化和告警。指标收集功能要求DataStax Agent已经在DSE节点上运行。
- DSE Metrics Collector通过collectd从DSE和其他实体(例如CPU和磁盘)收集指标。
- DSE Metrics Collector还通过collectd插件与不同的监控系统集成。例如,您可以将指标数据暴露给Prometheus并通过Grafana使用预定义的监控图表(predefined dashboard)可视化。由于指标数据是直接暴露的,您不需要在节点上运行OpsCenter的DataStax Agent。
- 用于Apache Cassandra的Metrics Collector(即MCAC)与Prometheus和Grafana(也包含预定义的监控图表)提供与DSE Metrics Collector相同的功能。
- 如果需要使用跟像是Prometheus这样的监控系统集成的外部工具(比如JMX Exporter for Prometheus)或其他监控工具,可能需要进行其他调整或需要自行创建监控图表。
使用以上的任何一种方法,您都会获得很多信息。每个键空间(keyspace)大约有40个监控数据,每个数据库表有60至70个监控数据,另外不同的子系统还拥有更多的监控数据。本文旨在提供这方面的指导,帮助大家理解其中最重要的一些指标。
您需要监视什么?
需要监控的重要指标可以分为几组:
- 与客户请求相关的指标:从客户端程序的角度来看,系统的性能如何。
- 协调节点(Coordinator)层级上的读写操作延迟,尤其要关注P95和P99个百分位。
- 客户端连接数。
- 与处理数据并执行不同任务的线程池相关的监测数据:比如压实和数据的flush。
- 多少个线程处于阻塞(blocked)状态。例如:memtable flush writer、memtable池分配等。
- 多少个线程处于弃用(aborted)状态,例如弃用的压实。
- 有多少个线程处于待发生(pending)状态,例如待发生的压实和待发生的flush。
- 与Thread-per-Core(即TPC)相关的指标。
仅适用于DSE 6.0及更高版本。
- 与各个表相关的指标:跟踪最重要的表的这些指标非常有用,这样就可以确保满足SLA的要求,并避免出现问题。
- 分区大小。
- SSTable的整体数量。
- 每个请求读取的SSTable数。
- 读取请求扫描的墓碑数。
- 协调节点层级上的读写延迟。
- 与集群间通信有关的指标:这些指标提供关于集群中的数据交换的信息——数据复制(Replication)、Hinted Handoff等:
- 丢失的数据变更和其他消息的数量。
- 超时的总次数和每个主机的超时次数。
- 跨数据中心延迟。
- 磁盘上的hints数量。
- hints重传(失败和超时的hint信息的数量)。
- 与Java虚拟机(JVM)相关的指标:
- 内存的使用量。
- 垃圾回收引起的暂停时长。
- 与操作系统和硬件有关的指标:
- 节点的CPU使用率。
- 可用的磁盘空间。
通过JMX暴露的重要指标
DataStax建议使用以下指标来监控和生成超出阈值的警报。请注意,其中的一些数值(例如延迟)是一般性的建议,您可以根据要求降低或提高。
- 读写延迟(在协调节点层级)
延迟总计和每个键空间(Keyspace)或每个表的延迟。
在MBean org.apache.cassandra.metrics中的JMX:
type=ClientRequest,scope=Write,name=Latency ClientRequest,scope=Read,name=Latency type=Table,keyspace=ks,scope=*,name=ReadLatency type=Table,keyspace=ks,scope=*,name=WriteLatency
警报条件:99百分位上持续1分钟以上大于200ms
- 整体的节点间延迟
在MBean org.apache.cassandra.metrics中的JMX:
type=Messaging,name=CrossNodeLatency
- 通过“DC-Name”定位的数据中心内节点间延迟
在MBean org.apache.cassandra.metrics中的JMX:
type=Messaging,name=<DC-Name>-Latency
- 待处理的压实任务数
每个节点的总数和/或特定键空间(keyspace)中的所有表的这个指标。
在MBean org.apache.cassandra.metrics中的JMX:
type=Compaction,name=PendingTasks
type=Table,keyspace=ks,scope=*,name=PendingCompactions
警报条件:持续15分钟超过30个。
- 丢失的数据变更的数量
在指定键空间内的总数量和/或每个表的数量
在MBean org.apache.cassandra.metrics中的JMX:
type=Table,name=DroppedMutations
type=Table,keyspace=ks,scope=*,name=DroppedMutations
警报条件:非零值。
- 特定节点上发生的超时数
在MBean org.apache.cassandra.metrics中的JMX:
type=MessagingService,name=TotalTimeouts
type=MessagingService,name=TimeoutsPerHost
警报条件:最近的5到15分钟内,数量大幅增加。
必需采取的反应:可能是网络或类似的问题。
- 最大分区大小(以字节为单位)
在MBean org.apache.cassandra.metrics中的JMX:
Table,name=MaxPartitionSize
type=Table,keyspace=ks,scope=*,name=MaxPartitionSize
警报条件:分区大于100 Mb。
必需采取的反应:向开发团队发送警报,因为这表明数据模型存在问题。
- 系统中和每个表中的SSTable总数
在MBean org.apache.cassandra.metrics中的JMX:
type=Table,name=LiveSSTableCount
type=Table,keyspace=ks,scope=*,name=LiveSSTableCount
警报条件:每个表超过200个(取决于所使用的压实策略)。
必需采取的反应:大表太多,这将导致性能下降。
- 存储在单个节点上的hints的数量
在MBean org.apache.cassandra.metrics中的JMX:
type=Storage,name=TotalHints
警报条件:值大于零,表示某些节点联系不上。
- Hint重传的成功/失败/超时率
在MBean org.apache.cassandra.metrics中的JMX:
type=HintsService,name=HintsSucceeded type=HintsService,name=HintsFailed type=HintsService,name=HintsTimedOut
- 被memtable内存分配阻塞的线程数
在MBean org.apache.cassandra.metrics中的JMX:
type=MemtablePool,name=BlockedOnAllocation
警报条件:非零值
- 受阻的memtable flush writer的任务数
注意:这种情况可能导致严重的写入性能下降。
在MBean org.apache.cassandra.metrics中的JMX:
type=ThreadPools,path=internal,scope=MemtableFlushWriter,name=CurrentlyBlockedTasks
警报条件:非零值。
必需采取的反应:调查。 这种情况是由磁盘故障,磁盘操作过多等引起的。
- 受阻的压实任务的数目
在MBean org.apache.cassandra.metrics中的JMX:
type=ThreadPools,path=internal,scope=CompactionExecutor,name=CurrentlyBlockedTasks
警报条件:非零值。
- 废止的压实任务的数目
在MBean org.apache.cassandra.metrics中的JMX:
name=CompactionsAborted,type=Compaction
警报条件:非零值。
- 有关Java垃圾回收的信息
由Max GC Elapsed或者类似原因引起。
在MBean org.apache.cassandra.metrics中的JMX:
type=GCInspector
- 等待提交(commit)的片段的数目
在MBean org.apache.cassandra.metrics中的JMX:
type=CommitLog,name=WaitingOnCommit,name=Count
警报条件:最后一分钟计数很高。
- 等待提交时间的第99百分位数
在MBean org.apache.cassandra.metrics中的JMX:
type=CommitLog,name=WaitingOnCommit,name=99thPercentile
- 待发生的flush次数
在MBean org.apache.cassandra.metrics中的JMX:
type=Table,name=PendingFlushes
- 键缓存(KeyCache)的命中率
Cassandra和DSE 6.0之前的版本。
在MBean org.apache.cassandra.metrics中的JMX:
type=Cache,scope=KeyCache,name=HitRate
警报条件:命中率低于0.9。
必需采取的反应:如果缓存已满(容量等于大小),请增加键缓存的大小。
在OpsCenter中可视化重要指标
OpsCenter从集群中的所有节点收集指标(6.8 | 6.7 | 6.5 | 6.1),并将原始数据以及基于这些数据的总结数据,存储在DSE集群中。 然后这些数据将被用于创建图表和警报。使用OpsCenter进行监控时,以下指标/图表对设置集群的有效监控很有帮助:
- 活跃警报Active Alerts
- 集群健康 Cluster Health
- 存储容量 Storage Capacity
- 读写请求延迟 Read and Write Request Latency
- 读写请求 Read and Write Requests
- 数据大小 Data Size
- 待发生的压实操作 Compactions Pending
- 丢失的消息:数据变更 Dropped Messages: Mutations
- 丢失的消息:读取 Dropped Messages: Reads
- 原生协议的客户端 Native Clients
- 针对特定数据库表(最重要的表的设置):
- TBL(数据库表):每次读取请求所涉及的SSTables数量(百分位数) SSTables per read (percentiles)
- TBL(数据库表):每次读取请求所涉及的墓碑数(百分位数) Tombstones per read (percentiles)
- TBL(数据库表):分区大小(百分位数) Partition size (percentiles)
- 与hinted handoff有关的:
- 磁盘上存储的hints数据 Hints on Disk
- TP(线程池):hints的调度线程处于活跃状态 Hint Dispatcher Active
- TP(线程池):hints的调度线程已完成 Hint Dispatcher Completed
- 丢失的消息 Dropped Messages:hinted handoff
- 与操作系统有关的:
- 操作系统 OS:磁盘延迟 Disk Latency
- 操作系统 OS:负载 Load
- 操作系统 OS:CPU I/Owait
- 操作系统 OS:空闲的内存容量 Memory Free
- 与Java虚拟机有关的:
- 使用的堆空间 Heap Used
- JVM G1老年代回收的次数和时间 JVM G1 Old Collection Count and Time
- JVM G1新生代回收的次数和时间 JVM G1 Young Collection Count and Time
- 当DSE Search被启用时:
- 搜索 Search:索引库的大小 Core Size
- 搜索 Search:读取延迟 Read Latency
- 搜索 Search:超时 Timeouts
- 启用NodeSync后,与NodeSync相关的:
- TP(线程池):读取范围NodeSync活动线程 Read Range NodeSync Active
- NodeSync:未完成的页面、失败的页面 Uncompleted Pages, Failed Pages
OpsCenter中的告警
OpsCenter(6.8 | 6.7 | 6.5 | 6.1)在满足特定条件时会向管理员告警。示例包括节点宕机且长时间出现延迟时间过长的情况。OpsCenter可以通过电子邮件,SNMP和HTTP请求发送警报。
配置以下警报,以运维的方式应对DSE集群中的问题。
- 节点下线:当节点被OpsCenter标记为已下线时。
条件:“<event>”超过X <minutes|hours|days>
建议:X:“immediately(立即)”或“ 1 minute(1分钟)”(取决于是否可以对此情况有一定程度的容忍)
关键程度/通知频率:紧急
- 代理(Agent)问题:当DataStax Agent被监控到出现了一些问题时。
条件:“<event>”超过X <minutes|hours|days>
建议:X:“ 30 minutes (30分钟)”
关键程度/通知频率:低
- CPU使用率:占用的CPU的百分比。
条件:“<event>”超过X,持续了超过Y时间 <minutes|hours|days>
建议:X:100,Y:1小时
关键程度/通知频率:低
- 负载:计算机系统执行的总工作量。
条件:“<event>”超过X,持续了超过Y时间 <minutes|hours|days>
建议:X:0.7 x CPU内核总数,Y:1小时
关键程度/通知频率:高
- 写请求延迟(百分位数):成功写入操作的响应时间(以毫秒为单位)。
条件:对于选定的Z百分位数,“<event>”高于X ms/op,持续了超过Y <minutes|hours|days>
建议:X:<取决于应用程序SLA>,Y:4小时,Z:99
危险程度/通知频率:中
- 读取请求延迟(百分比):成功读取操作的响应时间(以毫秒为单位)。
条件:对于选定的Z百分位数,“ <event>”高于X ms / op,持续了超过Y <minutes|hours|days>
建议:X:<取决于应用程序SLA>,Y:4小时,Z:99
危险程度/通知频率:中
- 高级->系统->磁盘使用率(%):用于特定磁盘分区的磁盘百分比。
条件:“ <event>”超过了X%,持续了超过Y <minutes|hours|days>
建议:X:50,Y:4小时
危险程度/通知频率:中
- 高级->表-> TBL:每次读取的SSTable(百分位数):对于指定的百分位,一次读取操作访问了多少个SSTable。
条件:对于W表,在Z百分位数处,“ <event>”超过了X SSTables,持续了超过Y <minutes|hours|days>。
建议:X:10,Y:1天,W:自己指定的表,Z:99
关键程度/通知频率:低
- 高级->表-> TBL:每次读取的墓碑(百分位数):对于指定的百分位数,一次读取操作访问了多少个墓碑。
条件:对于W表,在Z百分点处,“ <event>”超过了X墓碑,持续了超过Y <minutes|hours|days>。
建议:X:cassandra.yaml中的tombstone_warn_threshold,Y:1天,W:自己指定的表,Z:99
关键程度/通知频率:低
- 高级->表-> TBL:分区大小(百分位数):对于指定的百分位数,此表的分区大小(以字节为单位)是多少。
条件:对于W表,在Z百分位数处,“<event>”超过X,持续了超过Y <minutes|hours|days>。
建议:X:200 MB(以字节为单位),Y:1天,W:自己指定的表,Z:99
关键程度/通知频率:低
用于JMX的工具
对特定指标进行一次性分析的工具有不少。通常,您仅在调试(debugging)时使用这些工具,因为它们不是用于代替监控解决方案的。 这些工具主要是能提供当下的某个特定时间点上的单个指标。 它们无法生成随时间变化的视图,也无法提供多个节点上的多个指标。
- JConsole
JConsole是在例如OpenJDK等Java发行版中包含的GUI工具。它可以轻松浏览指标并检查其值。它还可以将这些数据按时间顺序绘图。
注意:下图中列出了更多工具。
Java监控和管理控制台
要访问指标,JConsole需要在服务器上运行(通常需要安装GUI库);或者需要通过网络进行访问,那会将JMX暴露给外部,导致可能对安全性有所影响。
- Jmxterm
这是一个非常流行的JMX命令行工具。 下载后,可以轻松运行并连接到本地节点;或者如果JMX暴露给外部时,也可以连接到其他节点:
$>open localhost:7199 #Connection to localhost:7199 is opened
您可以使用以下命令访问特定指标:
$>get -b org.apache.cassandra.metrics:type=Cache,scope=KeyCache,name=Size Value #mbean = org.apache.cassandra.metrics:type=Cache,scope=KeyCache,name=Size: Value = 0;
如果想获取所有可用命令的清单,请在交互式控制台内运行“help”。除了获取属性值之外,您还可以设置属性值(如果它们是可设置的)或调用函数——借此,您可以临时性地修改Cassandra的行为(与nodetool命令相同)。
- nodetool sjk(DSE和Cassandra 4.0)
DSE提供了nodetool sjk (6.8|6.7|6.0|5.1),它是Swiss Java Knife (SJK) 这个知名的库的包装器 (wrapper)。 这个子命令非常方便,因为您无需指定DSE进程的PID或其他参数; 您只需提供必要的命令行参数(flags)。 例如,要获取键缓存(key cache)的命中率,请使用以下命令,其中-b参数指定了bean的名称,而-f指定了字段:
nodetool sjk mx -b "org.apache.cassandra.metrics:type=Cache,scope=KeyCache,name=Size" -mg -f Value
与jmxterm相似,您可以使用此命令来设置变量值(可设置时)或调用函数。
type=Table,name=DroppedMutations
type=Table,keyspace=ks,scope=*,name=DroppedMutations