技術基礎 | 重要指標和告警

DataStax發表於2020-12-12

本文節選自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
 

相關文章