ClickHouse는 스토리지와 컴퓨트를 분리하려는 경우 GCS가 매력적인 스토리지 솔루션이 될 수 있음을 인지하고 있습니다. 이를 지원하기 위해 MergeTree 엔진의 스토리지로 GCS를 사용할 수 있도록 지원합니다. 이를 통해 GCS의 확장성과 비용상 이점을 활용하는 동시에 MergeTree 엔진의 삽입 및 쿼리 성능도 활용할 수 있습니다.
GCS 버킷을 디스크로 사용하려면 먼저 conf.d 아래의 파일에 있는 ClickHouse 구성에서 이를 선언해야 합니다. 아래는 GCS 디스크 선언 예시입니다. 이 구성에는 GCS “디스크”, 캐시, 그리고 GCS 디스크에 테이블(table)을 생성할 때 DDL 쿼리에서 지정할 정책을 설정하는 여러 섹션이 포함되어 있습니다. 각 섹션은 아래에서 설명합니다.
스토리지 구성 정책을 사용하면 데이터를 저장할 위치를 선택할 수 있습니다. 아래에 표시된 정책은 gcs_main 정책을 지정해 데이터를 디스크 gcs에 저장할 수 있도록 합니다. 예를 들어 CREATE TABLE ... SETTINGS storage_policy='gcs_main'와 같습니다.
이 튜토리얼은 Google Cloud에서 실행되고, ClickHouse 스토리지 디스크 “type”으로 Google Cloud Storage(GCS)를 사용하는 복제된 ClickHouse 배포를 설명합니다.이 튜토리얼에서는 각 노드에 스토리지용 GCS 버킷이 연결된 Google Cloud Engine VM에 ClickHouse 서버 노드를 배포합니다. 복제는 역시 VM으로 배포된 ClickHouse Keeper 노드 집합이 조정합니다.고가용성을 위한 예시 요구 사항:
2개의 GCP 리전에 각각 배포된 2개의 ClickHouse 서버 노드
두 ClickHouse 서버 노드와 동일한 리전에 배포된 2개의 GCS 버킷
3개의 ClickHouse Keeper 노드. 이 중 2개는 ClickHouse 서버 노드와 동일한 리전에 배포됩니다. 세 번째 노드는 첫 두 Keeper 노드 중 하나와 동일한 리전에 둘 수 있지만, 가용 영역은 달라야 합니다.
ClickHouse Keeper가 작동하려면 최소 2개의 노드가 필요하므로, 고가용성을 위해서는 3개의 노드가 필요합니다.
두 개의 호스트에 ClickHouse를 배포합니다. 이 샘플 구성에서는 호스트 이름을 chnode1, chnode2로 사용합니다.chnode1은 한 GCP 리전에, chnode2는 다른 리전에 배치합니다. 이 가이드에서는 Compute Engine VM과 GCS 버킷에 us-east1 및 us-east4를 사용합니다.
구성이 완료되기 전에는 clickhouse server를 시작하지 마십시오. 설치만 진행하십시오.
3개의 호스트에 ClickHouse Keeper를 배포합니다. 샘플 구성에서는 이 호스트의 이름을 keepernode1, keepernode2, keepernode3로 사용합니다. keepernode1은 chnode1과 동일한 리전에, keepernode2는 chnode2와 동일한 리전에 배포할 수 있습니다. keepernode3는 두 리전 중 어느 곳에든 배포할 수 있지만, 해당 리전의 ClickHouse 노드와는 서로 다른 가용 영역에 배포해야 합니다.ClickHouse Keeper 노드에서 배포 단계를 수행할 때는 설치 지침을 참조하십시오.
고가용성을 위해 두 ClickHouse 서버는 서로 다른 리전에 배치됩니다. 각 서버에는 동일한 리전에 GCS 버킷이 하나씩 있어야 합니다.Cloud Storage > Buckets에서 CREATE BUCKET을 선택하십시오. 이 튜토리얼에서는 us-east1과 us-east4에 각각 하나씩, 총 2개의 버킷을 만듭니다. 버킷은 단일 리전, Standard 스토리지 클래스, 비공개로 설정합니다. 메시지가 표시되면 public access prevention을 활성화하십시오. 폴더는 만들지 마십시오. ClickHouse가 스토리지에 쓸 때 자동으로 생성됩니다.버킷과 HMAC 키를 만드는 단계별 안내가 필요하면 Create GCS buckets and an HMAC key를 펼쳐 따라 하십시오:
기존 서비스 계정이 없는 프로젝트라면 CREATE NEW ACCOUNT를 선택합니다.서비스 계정 생성은 3단계로 이루어집니다. 첫 번째 단계에서는 계정에 의미 있는 이름, ID 및 설명을 지정합니다.Interoperability 설정 대화상자에서는 IAM role인 Storage Object Admin 역할을 권장합니다. 두 번째 단계에서 해당 역할을 선택합니다.세 번째 단계는 선택 사항이며, 이 가이드에서는 사용하지 않습니다. 정책에 따라 사용자에게 이러한 권한을 부여할 수 있습니다.서비스 계정 HMAC 키가 표시됩니다. 이 정보는 ClickHouse 구성에서 사용되므로 저장해 두십시오.
모든 ClickHouse Keeper 노드는 server_id 줄(아래에서 첫 번째로 강조 표시된 줄)을 제외하면 동일한 설정 파일을 사용합니다. ClickHouse Keeper 서버의 호스트명에 맞게 파일을 수정하고, 각 서버에서 server_id를 raft_configuration의 해당 server 항목과 일치하도록 설정하십시오. 이 예시에서는 server_id가 3으로 설정되어 있으므로 raft_configuration에서 일치하는 줄을 강조 표시했습니다.
파일에서 호스트명을 수정하고, 해당 호스트명이 ClickHouse 서버 노드와 Keeper 노드에서 모두 확인되는지 확인하세요
파일을 각 Keeper 서버의 지정된 위치로 복사하세요(/etc/clickhouse-keeper/keeper_config.xml)
각 머신에서 raft_configuration의 항목 번호를 기준으로 server_id를 수정하세요
모범 사례이 가이드의 일부 단계에서는 설정 파일을 /etc/clickhouse-server/config.d/에 배치하도록 안내합니다. 이는 Linux 시스템에서 설정 재정의 파일의 기본 위치입니다. 이 파일을 해당 디렉터리에 넣으면 ClickHouse가 그 내용을 기본 구성과 머지합니다. 이러한 파일을 config.d 디렉터리에 배치하면 업그레이드 중 구성이 손실되는 것을 방지할 수 있습니다.
이 파일은 클러스터에 있는 각 ClickHouse 서버의 호스트명과 포트를 설정합니다. 기본 설정 파일에는 예시 클러스터 정의가 포함되어 있으므로, 완전히 구성된 클러스터만 표시하려면 remote_servers 항목에 replace="true" 태그를 추가합니다. 이렇게 하면 이 구성이 기본 구성과 머지될 때 remote_servers 섹션에 내용을 추가하지 않고 해당 섹션을 대체합니다.
파일에서 호스트명을 알맞게 수정하고, 해당 호스트명이 ClickHouse 서버 노드에서 이름 해석되는지 확인하세요
이 파일은 ClickHouse Keeper 경로와 관련된 설정을 구성합니다. 구체적으로는 데이터가 어느 레플리카에 속하는지 식별하는 데 사용되는 매크로를 설정합니다. 한 server에서는 레플리카를 replica_1로 지정하고, 다른 server에서는 replica_2로 지정해야 합니다. 이름은 변경할 수 있습니다. 예를 들어 한 레플리카가 South Carolina에 저장되고 다른 레플리카가 Northern Virginia에 저장되는 경우, 값은 carolina와 virginia로 지정할 수 있습니다. 각 머신에서 서로 다른 값만 사용하도록 하십시오.
ClickHouse 스토리지 구성에는 disks와 policies가 포함됩니다. 아래에서 구성하는 디스크의 이름은 gcs이고, type은 s3입니다. type이 s3인 이유는 ClickHouse가 GCS 버킷을 AWS S3 버킷처럼 액세스하기 때문입니다. 이 구성은 각 ClickHouse 서버 노드에 하나씩, 총 2개가 필요합니다.아래 구성에서는 다음 치환값을 적용해야 합니다.다음 치환값은 두 ClickHouse 서버 노드마다 서로 다릅니다.
REPLICA 1 BUCKET은 서버와 동일한 리전(Region)에 있는 버킷 이름으로 설정해야 합니다
REPLICA 1 FOLDER는 한 서버에서는 replica_1로, 다른 서버에서는 replica_2로 변경해야 합니다
netcat을 사용해 ClickHouse Keeper에 명령을 전송합니다. 예를 들어 mntr 명령은 ClickHouse Keeper 클러스터의 상태를 반환합니다. 각 Keeper 노드에서 이 명령을 실행하면 하나는 리더이고 나머지 두 개는 팔로워임을 확인할 수 있습니다: