前置条件
- 有一个正在运行的 ClickHouse server 实例
- 已安装
curl。在 Ubuntu 或 Debian 上,运行sudo apt install curl,或参阅此文档了解安装说明。
概述
clickhouse-server 监听以下端口:
- 8123 端口用于 HTTP
- 可启用 8443 端口用于 HTTPS
GET / 请求,则会返回 200 响应码以及字符串 “Ok.”:
http_server_default_response 中定义的默认值,可按需更改。
另请参见:HTTP 响应代码注意事项。
Web 用户界面
GET /ping 请求。此处理程序始终返回 “Ok.” (末尾带有一个换行符) 。自 18.12.13 版本起可用。另请参阅 /replicas_status 以检查副本延迟。
通过 HTTP/HTTPS 查询
- 将请求作为 URL 的 ‘query’ 参数发送
- 使用 POST 方法。
- 在 ‘query’ 参数中发送查询的开头部分,其余部分通过 POST 发送
默认情况下,URL 大小限制为 1 MiB,可通过
http_max_uri_size 设置修改。SELECT 1。请注意,空格需要进行 URL 编码:%20。
command
Response
-nv (非冗长) 和 -O- 参数将结果输出到终端。
在这种情况下,无需对空格进行 URL 编码:
command
command
response
curl 命令用起来有些不方便,因为空格必须进行 URL 转义。
虽然 wget 会自行转义所有内容,但我们不建议使用它,因为在使用 keep-alive 和 Transfer-Encoding: chunked 时,它通过 HTTP 1.1 的表现并不好。
TabSeparated 格式返回。
可在查询中使用 FORMAT 子句来指定其他任意格式。例如:
command
Response
default_format URL 参数或 X-ClickHouse-Format 请求头,将默认格式指定为 TabSeparated 以外的格式。
{name:Type}。参数值通过 param_name 传入:
通过 HTTP/HTTPS 执行插入查询
INSERT 查询时,必须使用 POST 方法传输数据。在这种情况下,你可以将查询开头部分写在 URL 参数中,再通过 POST 传递要插入的数据。要插入的数据例如可以是从 MySQL 导出的制表符分隔转储文件。这样,INSERT 查询就相当于替代了 MySQL 中的 LOAD DATA LOCAL INFILE。
示例
INSERT 查询插入数据:
INSERT INTO t VALUES 时使用的格式相同:
由于查询处理是并行进行的,数据会按随机顺序输出
压缩
clickhouse-compressor 程序来处理。该程序默认随 clickhouse-client 软件包一起安装。
为提高数据插入效率,请使用 http_native_compression_disable_checksumming_on_decompress 设置禁用服务器端的校验和验证。
如果您在 URL 中指定 compress=1,服务器会压缩发送给您的数据。如果您在 URL 中指定 decompress=1,服务器会解压您通过 POST 方法传入的数据。
您也可以选择使用 HTTP 压缩。ClickHouse 支持以下压缩方法:
gzipbrdeflatexzzstdlz4bz2snappy
POST 请求,请附加请求头 Content-Encoding: compression_method。
要让 ClickHouse 压缩响应,请在请求中附加 Accept-Encoding: compression_method 请求头。
您可以使用 http_zlib_compression_level 设置,为所有压缩方法配置数据压缩级别。
某些 HTTP 客户端可能默认会解压来自服务器的数据 (如
gzip 和 deflate) ,因此即使您正确使用了压缩设置,也可能收到解压后的数据。示例
默认数据库
database 或 X-ClickHouse-Database 请求头来指定默认数据库。
default。或者,你也可以始终在表名前加上点号来指定数据库。
身份验证
- 使用 HTTP Basic 身份验证。
- 在
user和passwordURL 参数中
- 使用 ‘X-ClickHouse-User’ 和 ‘X-ClickHouse-Key’ 请求头
default。如果未指定密码,则使用空密码。
你还可以使用 URL 参数,为处理单个查询指定任意设置,或指定整个 profile 的设置。
例如:
在 HTTP 协议中使用 ClickHouse 会话
session_id GET 参数。你可以使用任意字符串作为会话 ID。
默认情况下,会话在 60 秒无活动后终止。要更改此超时 (以秒为单位) ,请修改服务器配置中的 default_session_timeout 设置,或在请求中添加 session_timeout GET 参数。
要检查会话状态,请使用 session_check=1 参数。单个会话中一次只能执行一个查询。
你可以在 X-ClickHouse-Progress 响应请求头中获取有关查询进度的信息。为此,请启用 send_progress_in_http_headers。
下面是一个请求头序列示例:
如果 HTTP 连接丢失,正在运行的请求不会自动停止。解析和数据格式化都在服务器端完成,因此通过网络传输可能效率较低。
以下可选参数可用:
HTTP 接口支持传递外部数据 (外部临时表) 用于查询。更多信息,请参阅”External data for query processing”。
响应缓冲
buffer_sizewait_end_of_query
buffer_size 用于指定在服务器内存中为结果缓冲的字节数。如果结果体大于该阈值,缓冲区中的内容会写入 HTTP 通道,其余数据将直接发送到 HTTP 通道。
要确保整个响应都被缓冲,请设置 wait_end_of_query=1。在这种情况下,未存储在内存中的数据会缓冲到服务器上的临时文件中。
例如:
使用查询参数设置角色
SET ROLE 与该语句一并发送,因为不允许使用多语句:
role 查询参数:
SET ROLE my_role。
此外,还可以指定多个 role 查询参数:
?role=my_role&role=my_other_role 的效果类似于在执行该语句之前先执行 SET ROLE my_role, my_other_role。
HTTP 响应状态码注意事项
Native、TSV 还是 JSON;错误消息总是会出现在响应流的中间。
你可以通过启用 wait_end_of_query=1 (响应缓冲) 来缓解这个问题。在这种情况下,HTTP 请求头会延迟到整个查询处理完成后才发送。不过,这并不能彻底解决问题,因为结果仍然必须能够容纳在 http_response_buffer_size 中,而且像 send_progress_in_http_headers 这样的其他设置也可能会影响请求头的延迟发送。
当 http_write_exception_in_output_format=0 (默认值) 时,ClickHouse 中这类异常都会采用如下所示的一致格式,而与所使用的格式无关 (例如 Native、TSV、JSON 等) 。这使得客户端更容易解析并提取错误消息。
<TAG> 是一个 16 字节的随机标签,与响应请求头 X-ClickHouse-Exception-Tag 中返回的标签相同。
<error message> 是实际的异常消息 (其精确长度可在 <message_length> 中找到) 。上述整个异常块最大可达 16 KiB。
下面是一个 JSON 格式的示例
CSV 格式
带参数的查询
示例
URL 参数中的制表符
\N。这意味着制表符应编码为 \t (或 \ 后跟一个制表符) 。例如,下面的内容在 abc 和 123 之间包含一个实际的制表符,因此输入字符串会被拆分为两个值:
%09 对实际的制表符进行编码,就无法被正确解析:
\t 编码为 %5C%09。例如:
预定义 HTTP 接口
http_handlers 配置为包含多条 rule。ClickHouse 会将收到的 HTTP 请求与 rule 中预定义的类型进行匹配,首个匹配成功的规则会运行相应的处理程序。随后,如果匹配成功,ClickHouse 将执行对应的预定义查询。
config.xml
http_handlers 的配置选项如下所示。
rule 可配置以下参数:
methodheadersurlfull_urlhandler
-
method负责匹配 HTTP 请求中的方法部分。method完全符合 HTTP protocol 中 [method] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods) 的定义。这是一个可选配置。如果在 配置文件中未定义,则不会匹配 HTTP 请求的方法部分。 -
url负责匹配 HTTP 请求中的 URL 部分 (path 和 query string) 。 如果url带有regex:前缀,则使用 RE2 的正则表达式。 这是一个可选配置。如果在配置文件中未定义,则不会匹配 HTTP 请求的 URL 部分。 -
full_url与url相同,但包含完整 URL,即schema://host:port/path?query_string。 注意,ClickHouse 不支持“virtual hosts”,因此host是 IP 地址 (而不是Host请求头的值) 。 -
empty_query_string- 确保请求中没有 query string (?query_string) -
headers负责匹配 HTTP 请求的请求头部分。它兼容 RE2 的正则表达式。这是一个可选 配置。如果在配置文件中未定义,则不会匹配 HTTP 请求的请求头部分。 -
handler包含主要处理逻辑。 它可以具有以下type: 以及以下参数:query— 与predefined_query_handler类型一起使用,在调用处理程序时执行查询。query_param_name— 与dynamic_query_handler类型一起使用,提取并执行 HTTP 请求参数中参数名为query_param_name的值。status— 与static类型一起使用,表示响应状态码。content_type— 可与任何类型一起使用,表示响应的 content-type。http_response_headers— 可与任何类型一起使用,表示响应请求头映射。也可用于设置 content type。response_content— 与static类型一起使用,表示发送给客户端的响应内容;当使用前缀 ‘file://’ 或 ‘config://’ 时,会从文件或配置中查找内容并发送给客户端。user- 用于执行查询的用户 (默认用户为default) 。 注意,无需为该用户指定密码。
type 的配置方法。
predefined_query_handler
predefined_query_handler 支持设置 Settings 和 query_params 的值。你可以在 predefined_query_handler 类型中配置 query。
query 的值是 predefined_query_handler 的预定义查询;当 HTTP 请求匹配时,ClickHouse 会执行该查询并返回查询结果。这是必填配置项。
以下示例定义了 max_threads 和 max_final_threads 这两个设置的值,然后查询系统表,以检查这些设置是否已成功生效。
要保留默认的
handlers,例如 query、play、ping,请添加 <defaults/> 规则。虚拟参数 _request_body
predefined_query_handler 还支持一个特殊的虚拟参数 _request_body。
它以字符串形式包含原始 HTTP 请求体。
这样,你就可以创建灵活的 REST API,接受任意数据格式,并在查询中进行处理。
例如,你可以使用 _request_body 实现一个 REST 端点,在 POST 请求中接收 JSON 数据并将其插入表中:
在一个
predefined_query_handler 中,只支持一个 查询。dynamic_query_handler
dynamic_query_handler 中,查询以 HTTP 请求参数的形式传入。不同的是,在 predefined_query_handler 中,查询写在配置文件里。dynamic_query_handler 中可以配置 query_param_name。
ClickHouse 会从 HTTP 请求的 URL 中提取与 query_param_name 对应的值并执行。query_param_name 的默认值为 /query。这是一个可选配置;如果配置文件中未定义,就不会传递该参数。
要试用此功能,下面的示例定义了 max_threads 和 max_final_threads 的值,并查询这些设置是否已成功生效。
示例:
static
static 可返回 content_type、status 和 response_content。其中,response_content 用于返回指定的内容。
例如,要返回一条消息 “Say Hi!”:
http_response_headers 设置内容类型,而无需使用 content_type。
redirect
redirect 会将请求以 302 重定向到 location
例如,下面展示了如何为 ClickHouse play 自动向 play 添加 set user:
HTTP 响应头
http_response_headers 设置,该设置接受表示请求头名称及其值的键值对。此功能特别适合在整个 ClickHouse HTTP 接口中实现自定义安全响应头、CORS 策略或任何其他 HTTP 请求头要求。
例如,你可以为以下对象配置响应头:
- 常规查询端点
- Web UI
- 健康检查。
common_http_response_headers。这些响应头将应用于配置中定义的所有 HTTP 处理程序。
这些响应头会包含在每个已配置处理程序的 HTTP 响应中。
在下面的示例中,每个服务器响应都将包含两个自定义响应头:X-My-Common-Header 和 X-My-Custom-Header。
HTTP 流式传输期间发生异常时的有效 JSON/XML 响应
http_write_exception_in_output_format (默认禁用) ,该设置会指示 ClickHouse 以指定格式写出异常 (当前支持 XML 和 JSON* 格式) 。
示例: