zoukankan      html  css  js  c++  java
  • 技术基础 | 重要指标和告警

    本文节选自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
     
  • 相关阅读:
    Day 12:枚举值、枚举类
    Day 11:静态导入、增强for循环、可变参数的自动装箱与拆箱
    Day 10:浅谈正则表达式
    Day 9:双列集合Map及实现该接口的类的常用方法
    Day 8:方法上自定义泛型、类上、接口上、泛型的上下限
    Day 7:TreeSet
    Day 6:Vector类和实现Hashset以及登录窗口的模拟
    Day 5 :ArrayList原理、LinkedList原理和方法和迭代器注意事项
    Day 4:集合——迭代器与List接口
    Day 3:集合
  • 原文地址:https://www.cnblogs.com/datastax/p/14126599.html
Copyright © 2011-2022 走看看