本文介绍如何通过设置云数据库ClickHouse超时相关的参数解决超时问题。

背景信息

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

HTTP协议

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

如何处理distributed_ddl_task_timeout超时问题
分布式DDL查询(带有 on cluster XXX)的执行等待时间,系统默认是180s。您可以使用set global on cluster default XXX=XX;修改该参数,修改完成后请提交工单联系技术支持进行重启。由于分布式DDL是基于zookeeper构建任务队列异步执行,执行等待超时并不代表查询失败,只表示之前发送还在排队等待执行,用户不需要重复发送任务。
如何处理max_execution_time超时问题
一般查询的执行超时时间,DMS平台上默认设置是7200s,jdbc driver、DataGrip上默认是30s。用户可以进行查询级别更改,例如select * from system.numbers settings 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的driver里配置socket_timeout这个propertity,单位是毫秒。
如何处理使用SLB链接时的异常断链
阿里云上的SLB链接在长时间内没有数据报文发送时会自动断开链接,导致查询无法追踪。对于这种情况用户可以尝试在查询后面添加参数send_progress_in_http_headers,例如:
select * from system.numbers settings send_progress_in_http_headers = 1
它会不断发送包含查询进度的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协议

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