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