以下設置可以調整users.xml參數,或者使用SQL-driven來管理用戶權限,通過執行以下sql也可以達到同等效果。
一、HTTP協議(8123端口)
HTTP協議是ClickHouse在生產環境中最常使用的交互方式,包括官方提供的jdbc driver、阿里雲DMS、DataGrip,后台使用的都是HTTP協議。HTTP協議常用的端口號為8123。
1.如何處理distributed_ddl_task_timeout超時問題
-
分布式DDL查詢(帶有 on cluster clause)的執行等待時間,系統默認是180s。您可以執行以下命令來設置全局參數,設置后需要重啟集群。
set global on cluster default distributed_ddl_task_timeout = 1800;
由於分布式DDL是基於zookeeper構建任務隊列異步執行,執行等待超時並不代表查詢失敗,只表示之前發送還在排隊等待執行,用戶不需要重復發送任務。
2.如何處理max_execution_time超時問題
-
一般查詢的執行超時時間,默認設置是7200s,jdbc driver、DataGrip上默認是30s。超時限制觸發之后查詢會自動取消。用戶可以進行查詢級別更改,例如
select * from system.numbers settings max_execution_time = 3600
,也可以執行以下命令來設置全局參數。set global on cluster default max_execution_time = 3600;
3.如何處理socket_timeout超時問題
- HTTP協議在監聽socket返回結果時的等待時間,默認設置是7200s,jdbc driver、DataGrip上默認是30s。該參數不是Clickhouse系統內的參數,它屬於jdbc在HTTP協議上的參數,但它是會影響到前面的 max_execution_time參數設置效果,因為它決定了客戶端在等待結果返回上的時間限制。所以一般用戶在調整max_execution_time參數的時候也需要配套調整socket_timeout參數,略微高於max_execution_time即可。用戶設置參數時需要在jdbc鏈接串上添加socket_timeout這個property,單位是毫秒,例如:'jdbc:clickhouse://127.0.0.1:8123/default?socket_timeout=3600000'。
4.如何處理使用SLB鏈接時的異常斷鏈
-
SLB鏈接在長時間內沒有數據報文發送時會自動斷開鏈接,客戶端收到”read timeout“錯誤,查詢無法追蹤。對於這種情況可以執行以下命令來設置全局參數,設置后需要重啟集群。
set global on cluster default send_progress_in_http_headers = 1; set global on cluster default http_headers_progress_interval_ms = 60000; --對於最新版本您需要使用如下命令,設置失敗時可以先申請小版本升版。 set global on cluster default http_server_enable_tcp_keep_alive = 1; set global on cluster default tcp_keep_alive_timeout = 60;
開啟send_progress_in_http_headers后,ClickHouse服務端會不斷發送包含查詢進度的HTTP-Header報文給客戶端,這樣就會一直有數據報文流通,避免鏈接斷開。
因為各種原因客戶端失聯后,HTTP協議發送的查詢仍然會繼續執行。用戶可以在系統表追蹤到查詢是否成功執行。--查詢集群中所有實例當前正在running的查詢: select * from remote(default, system, processes) where query like 'XXX' --查詢當天的歷史查詢結果,包括是否成功、已經失敗的錯誤信息: select * from remote(default, system, query_log) where event_date = toDate(now()) and query like 'XXX'
二、TCP協議(9000端口)
TCP協議最常使用的場景是ClickHouse自帶的命令行工具進行交互分析時,常見端口號為9000。因為TCP協議里有鏈接定時探活報文,所以它不會出現socker層面的超時問題。只需關注distributed_ddl_task_timeout和max_execution_time參數的超時,設置方法和HTTP協議一致。