本文介绍如何设置云数据库ClickHouse超时相关的参数以及遇到超时问题时如何查询后台状态。

背景信息

ClickHouse内核中有很多超时相关的参数设置,并且提供了多种协议进行交互,本文主要介绍如何设置HTTP协议和TCP协议的相关参数 。

HTTP协议(8123端口)

HTTP协议是ClickHouse在生产环境中最常使用的交互方式,包括官方提供的jdbc driver、阿里云DMS、DataGrip,后台使用的都是HTTP协议。HTTP协议常用的端口号为8123。

如何处理distributed_ddl_task_timeout超时问题

分布式DDL查询(带有 on cluster clause)的执行等待时间,系统默认是180s。您可以在DMS上执行以下命令来设置全局参数,设置后需要重启集群。

set global on cluster default distributed_ddl_task_timeout = 1800;

由于分布式DDL是基于zookeeper构建任务队列异步执行,执行等待超时并不代表查询失败,只表示之前发送还在排队等待执行,用户不需要重复发送任务。

如何处理max_execution_time超时问题
一般查询的执行超时时间,DMS平台上默认设置是7200s,jdbc driver、DataGrip上默认是30s。超时限制触发之后查询会自动取消。用户可以进行查询级别更改,例如select * from system.numbers settings max_execution_time = 3600,也可以在DMS上执行以下命令来设置全局参数。
set global on cluster default max_execution_time = 3600;
如何处理socket_timeout超时问题
HTTP协议在监听socket返回结果时的等待时间,DMS平台上默认设置是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'。
如何处理使用SLB链接时的异常断链
阿里云上的SLB链接在长时间内没有数据报文发送时会自动断开链接,客户端收到”read timeout“错误,查询无法追踪。对于这种情况您可以在DMS上执行以下命令来设置全局参数,设置后需要重启集群。
set global on cluster default send_progress_in_http_headers = 1; 
set global on cluster default http_headers_progress_interval_ms = 60000; 

开启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'
使用ClickHouse服务端IP直接链接时的Client异常hang住

阿里云上的ECS在跨安全组链接时,有可能陷入静默链接错误。具体原因是jdbc客户端所在ECS机器的安全组白名单并没有开放给ClickHouse服务端机器。当客户端的请求经过超长时间才得到查询结果时,返回的报文可能因为路由表不通无法发送到客户端。此时客户端就陷入了异常hang住状态。

该问题的处理办法和SLB链接异常断链问题一样,开启send_progress_in_http_headers可以解决大部分问题。在极少数情况下,开启send_progress_in_http_headers仍不能解决问题的,您可以尝试配置jdbc客户端所在ECS机器的安全组白名单,把ClickHouse服务端地址加入到白名单中。

TCP协议(3306端口)

TCP协议最常使用的场景是ClickHouse自带的命令行工具进行交互分析时,常见端口号为3306。因为TCP协议里有链接定时探活报文,所以它不会出现socker层面的超时问题。您只需关注distributed_ddl_task_timeoutmax_execution_time参数的超时,设置方法和HTTP协议一致。