如何高效利用 Grafana 監控分析 TiDB 指標

lvxfcjf發表於2021-09-09

作者介紹:李坤,PingCAP 網際網路架構師,TUG Ambassador,前美團、去哪兒資料庫專家。

一、概述

使用 TiDB Ansible 部署 TiDB 叢集,會同時部署一套 Grafana + Prometheus 的監控平臺,這套監控用來收集和展示 TiDB 叢集各個元件和機器的 metric 資訊,這些 metric 資訊非常豐富,可以幫助使用者分析 TiDB 叢集的狀態以及 Trouble shooting。隨著使用經驗的增多,我們積累了一些監控使用上的技巧,在這裡分享給大家。

二、監控架構

Prometheus 是一個擁有多維度資料模型的、靈活的查詢語句的時序資料庫。Grafana 是一個開源的 metric 分析及視覺化系統。

圖片描述

圖 1 TiDB 監控整體架構

從 TiDB 2.1.3 版本開始,監控採用 pull 的方式,而之前採用的是 push 的方式,這是一個非常好的調整,它解決了幾個問題:

  • 之前如果 Prometheus 需要遷移,需要重啟整個叢集,因為元件要調整 push 的目標地址。

  • 現在可以部署 2 套 Prometheus,防止監控的單點,因為 pull 的 source 端是可以多個。

  • 去掉了 PushGateWay 這個單點元件。

三、監控資料的來源與展示

TiDB 的 3 個核心元件(TiDB,TiKV,PD)可以透過 http 介面來獲取 metric 資料,這些指標都是從程式程式碼中統計上傳的,埠如下:

元件
tidb-server 10080
tikv-server 20181
pd-server 2379

用 tidb-server 舉例,我們透過 http 介面,看一個 statement QPS 的 metric:

# 可以看到實時 qps 的資料,區分不同的 type,value 是 counter 型別的累計值(科學計數法)
curl  |grep tidb_executor_statement_total
tidb_executor_statement_total{type="Delete"} 520197
tidb_executor_statement_total{type="Explain"} 1
tidb_executor_statement_total{type="Insert"} 7.20799402e+08
tidb_executor_statement_total{type="Select"} 2.64983586e+08
tidb_executor_statement_total{type="Set"} 2.399075e+06
tidb_executor_statement_total{type="Show"} 500531
tidb_executor_statement_total{type="Use"} 466016

這個資料會在 Prometheus 儲存下來,然後在 Grafana 展示,我們在皮膚上點選右鍵會出現 Edit 按鈕(或直接按 e),如下圖所示:

圖片描述

圖 2 metric 皮膚的編輯入口

我們可以在 Metric 皮膚上,看到利用該 metric 的 query 表示式。

皮膚上一些細節的含義:

  1. rate[1m]:表示 1 分鐘的增長速率,只能用於 counter 型別的資料。

  2. sum:表示 value 求和。

  3. by type:表示將求和後的資料按 metric 的原始值中的 type 進行分組。

  4. Legend format:表示指標名稱的格式。

  5. Resolution:預設打點步長是 15s,Resolution 表示是否分解。

圖片描述

圖 3 metric 皮膚中的表示式

Prometheus 支援很多表示式與函式,更多表示式請參考 。

四、Grafana 使用技巧

技巧 1:檢視所有維度並編輯表示式

如上一小節的例子,是按照 type 進行分組,是否還能用其他維度分組?如何能快速得知還有哪些維度呢?這裡推薦的技巧是,在 query 的表示式上只用指標名稱,不做任何計算,format 也留空,這樣就能顯示出原始的 metric 資料,比如下圖能看到有 3 個維度(instancejobtype)。

圖片描述

圖 4 編輯表示式並檢視所有維度

得到 instance 這個維度後,我們調整表示式,在原有的 type 後面加上 instance 這個維度,調整 legend format 格式增加 {{instance}},就可以看到每個 tidb-server 上執行的不同型別 SQL 的 QPS 了。如下圖:

圖片描述

圖 5 給表示式增加一個 instance 維度

技巧 2:調整 Y 軸標尺的計算方式

query duration 指標為例,預設的比例尺採用 2 的對數計算,顯示上會將差距縮小。為了觀察明顯的變化,可以將比例尺改為線性,透過下面兩張圖,可以看到顯示上的區別,明顯的發現那個時刻有個 SQL 執行較慢。

當然也不是所有場景都適合用線性,比如觀察 1 個月的效能趨勢,用線性可能就會有很多噪點,不好觀察。

圖片描述

圖 6 標尺預設的比例尺為 2 的對數

圖片描述

圖 7 調整標尺的比例尺為線性

提示:我們可以結合技巧 1,發現這裡還有一個 sql_type 的維度,可以立刻分析出是 select 慢還是 update 慢,並且可以分析出是在哪個 instance 上慢。

技巧 3:調整 Y 軸基線,放大變化

有一種情況:已經用了線性顯示,還是看不出變化趨勢。比如下圖中,我們在擴容後想觀察 Store size 的實時變化效果,由於基數較大,微弱的變化觀察不到。 這時我們可以將 Y 軸最小值從 0 改為 auto,將上部放大,觀察下面兩張圖的區別,可以觀察到資料已開始遷移了。

圖片描述

圖 8 基線預設為 0

圖片描述

圖 9 調整基線為 auto

技巧 4:標尺聯動

在 Setting 皮膚中,有 Graph Tooltip 的設定,預設使用 Default

圖片描述

圖 10 圖形展示工具

我們調整為 Shared crosshairShared Tooltip 分別試一下效果: 可以看到標尺可以聯動展示了,方便排查問題時,確認 2 個指標的關聯性。

圖片描述

圖 11 調整圖形展示工具為 Shared crosshair

圖片描述

圖 12 調整圖形展示工具為 Shared Tooltip

技巧 5:調整過濾項

PD 的 Dashboard,只展示當前 leader 的 metric 資訊,有時候會想看一下歷史上 pd-leader 當時的狀況,但是 instance 下拉選單中不存在這個成員了,我們也可以手動輸入 ip:2379 來看到當時的資料。

圖片描述

圖 13 手動輸入並檢視 metric

技巧 6:巧用 Avg 函式

通常預設圖例中只有 MaxCurrent,但有時指標波動較大時,我們可以增加 Avg 等其他彙總函式的圖例,可以看一段時間的整體趨勢。

圖片描述

圖 14 增加 Avg 等彙總函式

圖片描述

圖 15 增加 Avg 函式

技巧 7:使用 Prometheus 的 API 介面獲得表示式的結果

Grafana 透過 Prometheus 的介面獲取資料,我們也可以用該介面獲取資料,這個用法可以擴散出很多功能:

  • 自動化平臺獲取叢集規模、狀態等資訊。

  • 對錶達式稍加改動給報表提供資料,如統計每天的 QPS 總量、每天的 QPS 峰值、每天響應時間的彙總。

  • 將重要的指標進行定期健康巡檢。

圖片描述

圖 16 Prometheus 的 API 介面
curl -u user:pass '(tikv_engine_size_bytes%7Binstancexxxxxxxxx20181%22%7D)%20by%20(instance)&start=1565879269&end=1565882869&step=30' |python -m json.tool
{
    "data": {
        "result": [
            {
                "metric": {
                    "instance": "xxxxxxxxxx:20181"
                },
                "values": [
                    [
                        1565879269,
                        "1006046235280"
                    ],
                    [
                        1565879299,
                        "1006057877794"
                    ],
                    [
                        1565879329,
                        "1006021550039"
                    ],
                    [
                        1565879359,
                        "1006021550039"
                    ],
                    [
                        1565882869,
                        "1006132630123"
                    ]
                ]
            }
        ],
        "resultType": "matrix"
    },
    "status": "success"
}

五、總結

Grafana + Prometheus 是一套非常強大的組合,用好他們可以為我們的分析節省很多時間,提高效率,更重要的是能增加發現問題的可能性。在運維 TiDB 叢集時,尤其資料量大的時候,這套工具能派上大用場。這裡拋磚引玉,也希望大家也能提供一些技巧,一起共同學習。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3486/viewspace-2823721/,如需轉載,請註明出處,否則將追究法律責任。

相關文章