利用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中添加數據源。
配置Grafana Dashboard
以慢查詢為例。先添加一個Query,指定庫名、表名、日期列和時間列。
然后點擊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
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。