사전 준비 사항
- 실행 중인 ClickHouse 서버 인스턴스
curl이 설치되어 있어야 합니다. Ubuntu 또는 Debian에서는sudo apt install curl을 실행하거나, 설치 방법은 이 문서를 참조하십시오.
개요
clickhouse-server는 다음 포트에서 수신 대기합니다:
- HTTP용 포트 8123
- HTTPS를 활성화하면 포트 8443
GET / 요청을 보내면 문자열 “Ok.”와 함께 200 응답 코드가 반환됩니다:
http_server_default_response에 정의된 기본값으로, 필요에 따라 변경할 수 있습니다.
참고: HTTP 응답 코드 주의사항.
웹 사용자 인터페이스
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를 작성할 때와 동일한 ‘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)의 압축을 해제할 수 있으므로, 압축 설정을 올바르게 사용하더라도 압축 해제된 데이터를 받게 될 수 있습니다.예시
gunzip으로 압축 해제된 데이터를 받으려면:
기본 데이터베이스
database URL 매개변수 또는 X-ClickHouse-Database 헤더를 사용해 기본 데이터베이스를 지정할 수 있습니다.
default라는 이름의 데이터베이스가 사용됩니다. 또는 테이블 이름 앞에 점을 사용해 데이터베이스를 언제든지 지정할 수 있습니다.
인증
- HTTP 기본 인증을 사용하는 방법입니다.
user및passwordURL 매개변수에서
- ‘X-ClickHouse-User’ 및 ‘X-ClickHouse-Key’ 헤더 사용
default 사용자 이름이 사용됩니다. 비밀번호를 지정하지 않으면 빈 비밀번호가 사용됩니다.
또한 URL 매개변수를 사용해 단일 쿼리를 처리하기 위한 설정이나 설정 프로필 전체를 지정할 수 있습니다.
예시:
HTTP 프로토콜에서 ClickHouse 세션 사용하기
session_id GET 매개변수를 추가해야 합니다. 세션 ID로는 임의의 문자열을 사용할 수 있습니다.
기본적으로 세션은 60초 동안 비활성 상태이면 종료됩니다. 이 timeout(초 단위)을 변경하려면 서버 구성에서 default_session_timeout 설정을 수정하거나 요청에 session_timeout GET 매개변수를 추가하십시오.
세션 상태를 확인하려면 session_check=1 매개변수를 사용하십시오. 하나의 세션에서는 한 번에 하나의 쿼리만 실행할 수 있습니다.
X-ClickHouse-Progress 응답 헤더에서 쿼리 진행 상태 정보를 받을 수 있습니다. 이렇게 하려면 send_progress_in_http_headers를 활성화하십시오.
아래는 헤더 시퀀스의 예시입니다:
| Header field | Description |
|---|---|
read_rows | 읽은 행 수입니다. |
read_bytes | 읽은 데이터의 바이트 단위 크기입니다. |
total_rows_to_read | 읽을 전체 행 수입니다. |
written_rows | 기록한 행 수입니다. |
written_bytes | 기록한 데이터의 바이트 단위 크기입니다. |
elapsed_ns | 쿼리의 나노초 단위 런타임입니다. |
memory_usage | 쿼리에서 사용한 메모리의 바이트 수입니다. (v25.11부터 사용 가능) |
| Parameters | Description |
|---|---|
query_id (optional) | 쿼리 ID로 전달할 수 있습니다(임의의 문자열). replace_running_query |
quota_key (optional) | 쿼터 키로 전달할 수 있습니다(임의의 문자열). “쿼터” |
응답 버퍼링
buffer_sizewait_end_of_query
buffer_size는 결과를 서버 메모리에 버퍼링할 바이트 수를 결정합니다. 결과 본문이 이 임계값보다 크면 버퍼는 HTTP 채널에 기록되고, 나머지 데이터는 HTTP 채널로 직접 전송됩니다.
응답 전체가 버퍼링되도록 하려면 wait_end_of_query=1로 설정하십시오. 이 경우 메모리에 저장되지 않는 데이터는 서버의 임시 파일에 버퍼링됩니다.
예시:
쿼리 매개변수로 역할 설정
SET ROLE과 SQL 문을 함께 전송할 수 없습니다.
role 쿼리 매개변수를 사용하십시오:
SET ROLE my_role를 실행하는 것과 같습니다.
또한 role 쿼리 매개변수를 여러 개 지정할 수도 있습니다:
?role=my_role&role=my_other_role는 해당 SQL 문을 실행하기 전에 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 같은 다른 설정이 헤더 전송 지연에 영향을 줄 수 있기 때문입니다.
ClickHouse에서 이러한 예외는 http_write_exception_in_output_format=0(기본값)일 때 사용한 포맷(Native, TSV, JSON 등)과 관계없이 아래와 같이 일관된 예외 포맷을 가집니다. 따라서 클라이언트 측에서 오류 메시지를 파싱하고 추출하기 쉽습니다.
<TAG>는 16바이트 무작위 태그이며, X-ClickHouse-Exception-Tag 응답 헤더로 전송되는 태그와 동일합니다.
<error message>는 실제 예외 메시지입니다(정확한 길이는 <message_length>에서 확인할 수 있습니다). 위에서 설명한 전체 예외 블록의 크기는 최대 16 KiB입니다.
다음은 JSON 포맷 예시입니다.
CSV 포맷을 사용한 유사한 예시입니다
매개변수가 있는 쿼리
예시
URL 매개변수의 탭
\N을 NULL로 명확하게 파싱할 수 있다는 점 등 몇 가지 장점이 있습니다. 즉, 탭 문자는 \t(또는 \와 탭 문자)로 인코딩해야 합니다. 예를 들어, 다음 예시에서는 abc와 123 사이에 실제 탭이 포함되어 있으므로 입력 문자열이 두 개의 값으로 분할됩니다.
%09를 사용해 실제 탭 문자를 인코딩하려고 하면 제대로 파싱되지 않습니다:
\t를 %5C%09로 인코딩해야 합니다. 예를 들면 다음과 같습니다:
미리 정의된 HTTP 인터페이스
http_handlers는 여러 개의 rule을 포함하도록 구성됩니다. ClickHouse는 수신한 HTTP 요청을 rule에 미리 정의된 유형과 일치시키고, 가장 먼저 일치한 규칙의 핸들러를 실행합니다. 그런 다음 일치에 성공하면 해당하는 미리 정의된 쿼리를 실행합니다.
config.xml
http_handlers의 구성 옵션은 다음과 같습니다.
rule에서 다음 매개변수를 구성할 수 있습니다.
methodheadersurlfull_urlhandler
-
method는 HTTP 요청의 메서드 부분을 매칭합니다.method는 HTTP 프로토콜의 [method] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods) 정의를 완전히 따릅니다. 이는 선택적 구성입니다. 설정 파일에 정의하지 않으면 HTTP 요청의 메서드 부분은 매칭하지 않습니다. -
url은 HTTP 요청의 URL 부분(경로 및 쿼리 문자열)을 매칭합니다.url앞에regex:접두사가 붙으면 RE2 정규식을 사용합니다. 이는 선택적 구성입니다. 설정 파일에 정의하지 않으면 HTTP 요청의 URL 부분은 매칭하지 않습니다. -
full_url은url과 같지만 전체 URL, 즉schema://host:port/path?query_string를 포함합니다. 참고로 ClickHouse는 “virtual hosts”를 지원하지 않으므로host는 IP 주소이며Hostheader의 값이 아닙니다. -
empty_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 설정 값을 지정한 다음, 시스템 테이블(system table)을 쿼리하여 이러한 설정이 성공적으로 적용되었는지 확인합니다.
query, play, ping과 같은 기본 handlers를 유지하려면 <defaults/> 규칙을 추가하십시오.가상 매개변수 _request_body
predefined_query_handler는 URL 매개변수, 헤더, 쿼리 매개변수 외에도 특수한 가상 매개변수 _request_body를 지원합니다.
이 매개변수에는 원시 HTTP 요청 본문이 문자열로 포함됩니다.
이를 통해 임의의 데이터 포맷을 받아 쿼리 내에서 처리할 수 있는 유연한 REST API를 만들 수 있습니다.
예를 들어, _request_body를 사용하면 POST 요청으로 JSON 데이터를 받아 테이블에 삽입하는 REST 엔드포인트를 구현할 수 있습니다:
predefined_query_handler 하나당 지원되는 query는 하나뿐입니다.dynamic_query_handler
dynamic_query_handler에서는 HTTP 요청의 매개변수 형식으로 쿼리를 작성합니다. predefined_query_handler와의 차이점은 predefined_query_handler에서는 쿼리를 설정 파일에 작성한다는 것입니다. query_param_name은 dynamic_query_handler에서 구성할 수 있습니다.
ClickHouse는 HTTP 요청 URL에서 query_param_name에 해당하는 값을 추출해 실행합니다. query_param_name의 기본값은 /query입니다. 이는 선택적 구성입니다. 설정 파일에 정의되어 있지 않으면 이 매개변수는 전달되지 않습니다.
이 기능을 시험해 보기 위해, 다음 예시에서는 max_threads와 max_final_threads 값을 정의하고, 설정이 올바르게 적용되었는지 queries로 확인합니다.
예시:
static
static은 content_type, status, response_content를 반환할 수 있습니다. response_content는 지정된 내용을 반환합니다.
예를 들어, “Say Hi!” 메시지를 반환하려면:
http_response_headers를 사용하면 content_type 대신 콘텐츠 유형을 지정할 수 있습니다.
redirect
redirect는 location으로 302 리디렉션을 수행합니다.
예를 들어 ClickHouse play에서 play에 set user를 자동으로 추가하려면 다음과 같이 합니다:
HTTP 응답 헤더
http_response_headers 설정으로 지정할 수 있습니다. 이 기능은 ClickHouse HTTP 인터페이스 전반에서 사용자 지정 보안 헤더, CORS 정책 또는 기타 HTTP 헤더 요구 사항을 구현할 때 특히 유용합니다.
예를 들어, 다음에 대한 헤더를 구성할 수 있습니다.
- 일반 쿼리 엔드포인트
- 웹 UI
- 상태 확인
common_http_response_headers를 지정할 수도 있습니다. 이는 구성에 정의된 모든 HTTP 핸들러에 적용됩니다.
헤더는 구성된 각 핸들러의 HTTP 응답에 포함됩니다.
아래 예시에서는 모든 서버 응답에 X-My-Common-Header와 X-My-Custom-Header라는 두 개의 사용자 지정 헤더가 포함됩니다.
HTTP streaming 중 예외 발생 시 유효한 JSON/XML 응답
http_write_exception_in_output_format 설정(기본적으로 비활성화됨)을 사용할 수 있습니다. 이 설정을 사용하면 ClickHouse가 지정된 포맷으로 예외를 기록합니다(현재 XML 및 JSON* 포맷 지원).
예시: