clickhouse-(06)-基於Grafana監控


利用Grafana與系統表監控ClickHouse查詢

前言

我們往往需要關心數據庫的查詢執行情況,特別是慢查詢。本文簡述配置ClickHouse查詢監控的一種傻瓜方法。

開啟查詢日志

打開各個ClickHouse實例的users.xml,在當前使用的profile(如default)中加入:

<log_queries>1</log_queries>

再去各個ClickHouse實例的config.xml中檢查一下查詢日志的配置,以下是默認啟用的配置:

<query_log>
    <database>system</database>
    <table>query_log</table>
    <partition_by>toYYYYMM(event_date)</partition_by>
    <flush_interval_milliseconds>7500</flush_interval_milliseconds>
</query_log>

<trace_log>
    <database>system</database>
    <table>trace_log</table>
    <partition_by>toYYYYMM(event_date)</partition_by>
    <flush_interval_milliseconds>7500</flush_interval_milliseconds>
</trace_log>

<query_thread_log>
    <database>system</database>
    <table>query_thread_log</table>
    <partition_by>toYYYYMM(event_date)</partition_by>
    <flush_interval_milliseconds>7500</flush_interval_milliseconds>
</query_thread_log>

其中,partition_by表示查詢日志表的分區列,語法與普通建表時相同,默認按月分區。flush_interval_milliseconds則表示日志刷入表中的周期,默認7.5秒。按需修改后,重啟ClickHouse實例,就會自動在system庫中創建對應的系統表,並寫數據。

關於查詢日志表(以及其他系統表)中各列的含義,可參見官方文檔,非常詳細。

創建分布式表、設定TTL

在集群中執行以下語句,創建query_log的分布式表query_log_all,這樣才能正確統計所有節點的查詢日志。

CREATE TABLE IF NOT EXISTS system.query_log_all
ON CLUSTER sht_ck_cluster_pro
AS system.query_log
ENGINE = Distributed(sht_ck_cluster_pro,system,query_log,rand());

查詢日志表沒有自動過期功能,為了防止日志太多占用大量磁盤空間,可以手動為每張query_log表設定TTL。建議也給其他系統日志表配置上TTL。

ALTER TABLE system.query_log
MODIFY TTL event_date + INTERVAL 15 DAYS;

下載、安裝、啟動Grafana

wget https://dl.grafana.com/oss/release/grafana-6.7.4-1.x86_64.rpm
yum -y localinstall grafana-6.7.4-1.x86_64.rpm
service grafana-server start

訪問<grafana_ip>:3000即可。

安裝與添加ClickHouse DataSource

ClickHouse DataSource是由Vertamedia開發的第三方插件(這家公司也開源了負載均衡組件CHProxy)。直接用grafana-cli安裝之。

grafana-cli plugins install vertamedia-clickhouse-datasource

然后在Grafana中添加數據源。

img

配置Grafana Dashboard

以慢查詢為例。先添加一個Query,指定庫名、表名、日期列和時間列。

img

然后點擊Go to Query按鈕,寫入如下SQL語句。

SELECT
  query,
  avg(query_duration_ms) AS duration_avg,
  max(query_duration_ms) AS duration_max,
  count() AS query_count
FROM $table
WHERE $timeFilter
AND type = 2
AND positionCaseInsensitive(query,'%system.%') = 0
GROUP BY query
ORDER BY duration_max DESC
LIMIT 10

$table和$timeFilter都是ClickHouse DataSource預置的宏,可以參見上面給出的傳送門。然后,將Format as選項設定為Table,就可以看到指定時間段內的慢查詢top 10了。截圖會涉及到敏感業務數據,就不貼了。

再舉個例子,繪制QPS的折線圖,SQL語句如下。

$rate(count() AS q)
FROM $table
WHERE $timeFilter
AND type = 2
AND positionCaseInsensitive(query,'%system.%') = 0

$rate是什么鬼?這個是ClickHouse DataSource提供的內置函數,上面的SQL語句在實際請求時會轉化成以下的語句。

SELECT t, q / runningDifference(t / 1000) qRate FROM (   SELECT (intDiv(toUInt32(event_time), 5) * 5) * 1000 AS t,   count() AS q   FROM system.query_log_all   WHERE event_date >= toDate(1592905770)   AND event_time >= toDateTime(1592905770)    AND type = 2   AND positionCaseInsensitive(query,'%system.%') = 0   GROUP BY t   ORDER BY t)

可見是先以5秒步長分組並統計查詢數,再借助runningDifference()函數推導出兩行之間時間的增量,進而得到QPS。在Grafana面板中可以通過調整"Resolution"參數來修改步長,如設定為1/4,步長就是20秒。

The End

作者:LittleMagic
鏈接:https://www.jianshu.com/p/6ffd403c249a
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM