스토리지와 컴퓨트 분리
스토리지와 컴퓨트 분리 (Separation of storage and compute)
ClickHouse와 S3를 사용해 스토리지와 컴퓨트(계산)를 분리한 아키텍처를 구현하는 방법을 안내해요. S3BackedMergeTree 테이블 엔진을 통해 S3를 MergeTree의 스토리지로 사용하는 전체 과정을 다뤄요.
출처: 문서
본문
개요 (Overview)
이 가이드는 ClickHouse와 S3를 사용해 스토리지와 컴퓨트를 분리한 아키텍처를 구현하는 방법을 탐구해요. 스토리지와 컴퓨트 분리는 컴퓨팅 리소스와 스토리지 리소스를 독립적으로 관리한다는 뜻이에요. ClickHouse에서 이는 더 나은 확장성, 비용 효율성, 유연성을 가능하게 해요. 필요에 따라 스토리지와 컴퓨트 리소스를 별도로 확장해서 성능과 비용을 최적화할 수 있어요. S3를 백엔드로 사용하는 ClickHouse는 "콜드(cold)" 데이터에 대한 쿼리 성능이 덜 중요한 사용 사례에서 특히 유용해요. ClickHouse는 S3BackedMergeTree를 사용해 S3를 MergeTree 엔진의 스토리지로 지원해요. 이 테이블 엔진은 MergeTree 엔진의 삽입·쿼리 성능을 유지하면서도 S3의 확장성과 비용 이점을 활용할 수 있게 해줘요.
스토리지와 컴퓨트 분리 아키텍처를 구현하고 관리하는 것은 표준 ClickHouse 배포보다 더 복잡하다는 점을 유의해 주세요. 자체 관리형(self-managed) ClickHouse도 이 가이드에서 설명하는 대로 스토리지와 컴퓨트 분리를 허용하지만, 설정 없이 SharedMergeTree 테이블 엔진으로 이 아키텍처에서 ClickHouse를 사용할 수 있는 ClickHouse Cloud를 사용할 것을 권장해요. 이 가이드는 ClickHouse 버전 22.8 이상을 사용한다고 가정해요.
AWS/GCS 수명 주기 정책을 구성하지 마세요. 지원되지 않으며 깨진 테이블을 초래할 수 있어요.
1. S3를 ClickHouse 디스크로 사용하기
디스크 만들기
스토리지 설정을 저장할 새 파일을 ClickHouse config.d 디렉토리에 만드세요:
vim /etc/clickhouse-server/config.d/storage_config.xml
데이터를 저장하려는 AWS 버킷 정보로 BUCKET, ACCESS_KEY_ID, SECRET_ACCESS_KEY를 교체해서 다음 XML을 새로 만든 파일에 복사하세요:
<clickhouse>
<storage_configuration>
<disks>
<s3_disk>
<type>s3</type>
<endpoint>$BUCKET</endpoint>
<access_key_id>$ACCESS_KEY_ID</access_key_id>
<secret_access_key>$SECRET_ACCESS_KEY</secret_access_key>
<metadata_path>/var/lib/clickhouse/disks/s3_disk/</metadata_path>
</s3_disk>
<s3_cache>
<type>cache</type>
<disk>s3_disk</disk>
<path>/var/lib/clickhouse/disks/s3_cache/</path>
<max_size>10Gi</max_size>
</s3_cache>
</disks>
<policies>
<s3_main>
<volumes>
<main>
<disk>s3_disk</disk>
</main>
</volumes>
</s3_main>
</policies>
</storage_configuration>
</clickhouse>
S3 디스크의 설정을 더 지정해야 한다면, 예를 들어 region을 지정하거나 커스텀 HTTP header를 보내려는 경우, 관련 설정 목록을 여기에서 찾을 수 있어요. access_key_id와 secret_access_key를 다음으로 대체해 환경 변수와 Amazon EC2 메타데이터에서 자격 증명을 얻도록 할 수도 있어요:
<use_environment_credentials>true</use_environment_credentials>
설정 파일을 만든 후에는 파일 소유자를 clickhouse 사용자와 그룹으로 업데이트해야 해요:
chown clickhouse:clickhouse /etc/clickhouse-server/config.d/storage_config.xml
이제 ClickHouse 서버를 재시작해서 변경 사항을 적용할 수 있어요:
service clickhouse-server restart
2. S3를 백엔드로 하는 테이블 만들기
S3 디스크를 제대로 구성했는지 테스트하려면 테이블을 만들고 쿼리해 볼 수 있어요. 새 S3 스토리지 정책을 지정하는 테이블을 만들어요:
CREATE TABLE my_s3_table
(
`id` UInt64,
`column1` String
)
ENGINE = MergeTree
ORDER BY id
SETTINGS storage_policy = 's3_main';
엔진을 S3BackedMergeTree로 지정할 필요는 없다는 점을 주목하세요. ClickHouse는 테이블이 스토리지에 S3를 사용하고 있음을 감지하면 내부적으로 엔진 유형을 자동으로 변환해요. 테이블이 올바른 정책으로 생성되었는지 보여줘요:
SHOW CREATE TABLE my_s3_table;
다음과 같은 결과가 보여야 해요:
┌─statement────────────────────────────────────────────────────
│ CREATE TABLE default.my_s3_table
(
`id` UInt64,
`column1` String
)
ENGINE = MergeTree
ORDER BY id
SETTINGS storage_policy = 's3_main', index_granularity = 8192
└──────────────────────────────────────────────────────────────
이제 새 테이블에 몇 가지 행을 삽입해 봐요:
INSERT INTO my_s3_table (id, column1)
VALUES (1, 'abc'), (2, 'xyz');
행이 삽입되었는지 확인해 봐요:
SELECT * FROM my_s3_table;
┌─id─┬─column1─┐
│ 1 │ abc │
│ 2 │ xyz │
└────┴─────────┘
2 rows in set. Elapsed: 0.284 sec.
AWS 콘솔에서 데이터가 S3에 성공적으로 삽입되었다면 ClickHouse가 지정한 버킷에 새 파일을 만들었음을 확인할 수 있어요. 모든 것이 성공적으로 작동했다면, 이제 스토리지와 컴퓨트가 분리된 ClickHouse를 사용하고 있는 거예요!
3. 내결함성을 위한 복제 구현 (선택 사항)
AWS/GCS 수명 주기 정책을 구성하지 마세요. 지원되지 않으며 깨진 테이블을 초래할 수 있어요.
내결함성을 위해 여러 AWS 리전에 분산된 여러 ClickHouse 서버 노드를 사용하고, 각 노드에 대해 S3 버킷을 사용할 수 있어요. S3 디스크로 복제는 ReplicatedMergeTree 테이블 엔진을 사용해 수행할 수 있어요. 자세한 내용은 다음 가이드를 참고해요: