HTTP协议
HTTP协议是
云数据库ClickHouse
在生产环境中最常使用的交互方式,包括官方提供的jdbc driver、阿里云DMS、DataGrip,后台使用的都是HTTP协议。HTTP协议常用的端口号为8123。
如何处理distributed_ddl_task_timeout超时问题
分布式DDL查询(带有 on cluster)的执行等待时间,系统默认是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;
对于20.8最新版本您需要使用如下命令,设置失败时可以先申请小版本升版。
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'
使用ClickHouse服务端IP直接链接时的Client异常hang住
阿里云上的ECS在跨安全组链接时,有可能陷入静默链接错误。具体原因是jdbc客户端所在ECS机器的安全组白名单并没有开放给ClickHouse服务端机器。当客户端的请求经过超长时间才得到查询结果时,返回的报文可能因为路由表不通无法发送到客户端。此时客户端就陷入了异常hang住状态。
该问题的处理办法和SLB链接异常断链问题一样,开启send_progress_in_http_headers可以解决大部分问题。在极少数情况下,开启send_progress_in_http_headers仍不能解决问题的,您可以尝试配置jdbc客户端所在ECS机器的安全组白名单,把ClickHouse服务端地址加入到白名单中。