클러스터 자동 탐지
클러스터 자동 탐지 (Cluster Discovery)
ClickHouse의 Cluster Discovery 기능은 노드가 구성 파일에서 명시적으로 정의될 필요 없이 자동으로 자기 자신을 발견·등록하도록 해서 클러스터 구성을 단순화해요. 이는 각 노드를 수동으로 정의하는 것이 번거로워지는 경우에 특히 유용해요.
출처: 문서
본문
개요 (Overview)
Cluster Discovery는 실험적 기능이며 향후 버전에서 변경되거나 제거될 수 있어요. 활성화하려면 구성 파일에 allow_experimental_cluster_discovery 설정을 포함해요:
<clickhouse>
<!-- ... -->
<allow_experimental_cluster_discovery>1</allow_experimental_cluster_discovery>
<!-- ... -->
</clickhouse>
원격 서버 구성 (Remote servers configuration)
전통적인 수동 구성
전통적으로 ClickHouse에서 클러스터의 각 샤드와 레플리카는 구성에서 수동으로 지정해야 했어요:
<remote_servers>
<cluster_name>
<shard>
<replica>
<host>node1</host>
<port>9000</port>
</replica>
<replica>
<host>node2</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<host>node3</host>
<port>9000</port>
</replica>
<replica>
<host>node4</host>
<port>9000</port>
</replica>
</shard>
</cluster_name>
</remote_servers>
클러스터 자동 탐지 사용
Cluster Discovery를 사용하면 각 노드를 명시적으로 정의하는 대신 ZooKeeper에 경로만 지정해요. ZooKeeper에서 이 경로 아래에 등록된 모든 노드는 자동으로 발견되어 클러스터에 추가돼요.
<remote_servers>
<cluster_name>
<discovery>
<path>/clickhouse/discovery/cluster_name</path>
<!-- # Optional configuration parameters: -->
<!-- ## Authentication credentials to access all other nodes in cluster: -->
<!-- <user>user1</user> -->
<!-- <password>pass123</password> -->
<!-- ### Alternatively to password, interserver secret may be used: -->
<!-- <secret>secret123</secret> -->
<!-- ## Shard for current node (see below): -->
<!-- <shard>1</shard> -->
<!-- ## Observer mode (see below): -->
<!-- <observer/> -->
</discovery>
</cluster_name>
</remote_servers>
특정 노드에 샤드 번호를 지정하고 싶다면 <discovery> 섹션 안에 <shard> 태그를 포함할 수 있어요. node1과 node2:
<discovery>
<path>/clickhouse/discovery/cluster_name</path>
<shard>1</shard>
</discovery>
node3과 node4:
<discovery>
<path>/clickhouse/discovery/cluster_name</path>
<shard>2</shard>
</discovery>
Observer 모드
observer 모드로 구성된 노드는 레플리카로 자기 자신을 등록하지 않아요. 그들은 적극적으로 참여하지 않고 클러스터의 다른 활성 레플리카를 단지 관찰·발견해요. observer 모드를 활성화하려면 <discovery> 섹션 안에 <observer/> 태그를 포함해요:
<discovery>
<path>/clickhouse/discovery/cluster_name</path>
<observer/>
</discovery>
클러스터의 발견
때로는 클러스터에서 호스트뿐만 아니라 클러스터 자체를 추가·제거해야 할 수도 있어요. 여러 클러스터의 루트 경로와 함께 <multicluster_root_path> 노드를 사용할 수 있어요:
<remote_servers>
<some_unused_name>
<discovery>
<multicluster_root_path>/clickhouse/discovery</multicluster_root_path>
<observer/>
</discovery>
</some_unused_name>
</remote_servers>
이 경우 다른 어떤 호스트가 /clickhouse/discovery/some_new_cluster 경로로 자신을 등록하면 some_new_cluster라는 이름의 클러스터가 추가돼요. 두 기능을 동시에 사용할 수 있어요. 호스트는 my_cluster 클러스터에 자신을 등록하면서 다른 클러스터를 발견할 수 있어요:
<remote_servers>
<my_cluster>
<discovery>
<path>/clickhouse/discovery/my_cluster</path>
</discovery>
</my_cluster>
<some_unused_name>
<discovery>
<multicluster_root_path>/clickhouse/discovery</multicluster_root_path>
<observer/>
</discovery>
</some_unused_name>
</remote_servers>
제한사항:
- 같은
remote_servers서브트리에서<path>와<multicluster_root_path>를 함께 사용할 수 없어요. <multicluster_root_path>는<observer/>와만 사용할 수 있어요.- Keeper의 경로의 마지막 부분이 클러스터 이름으로 사용되는데, 등록 중에는 이름이 XML 태그에서 가져와져요.
사용 사례와 제한사항
노드가 지정된 ZooKeeper 경로에 추가·제거되면 구성 변경이나 서버 재시작 없이 자동으로 발견되거나 클러스터에서 제거돼요. 하지만 변경은 클러스터 구성에만 영향을 주지 데이터나 기존 데이터베이스·테이블에는 영향을 주지 않아요. 3개 노드의 클러스터 예제를 고려해보세요:
<remote_servers>
<default>
<discovery>
<path>/clickhouse/discovery/default_cluster</path>
</discovery>
</default>
</remote_servers>
SELECT * EXCEPT (default_database, errors_count, slowdowns_count, estimated_recovery_time, database_shard_name, database_replica_name)
FROM system.clusters WHERE cluster = 'default';
┌─cluster─┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name────┬─host_address─┬─port─┬─is_local─┬─user─┬─is_active─┐
│ default │ 1 │ 1 │ 1 │ 92d3c04025e8 │ 172.26.0.5 │ 9000 │ 0 │ │ ᴺᵁᴸᴸ │
│ default │ 1 │ 1 │ 2 │ a6a68731c21b │ 172.26.0.4 │ 9000 │ 1 │ │ ᴺᵁᴸᴸ │
│ default │ 1 │ 1 │ 3 │ 8e62b9cb17a1 │ 172.26.0.2 │ 9000 │ 0 │ │ ᴺᵁᴸᴸ │
└─────────┴───────────┴──────────────┴─────────────┴──────────────┴──────────────┴──────┴──────────┴──────┴───────────┘
CREATE TABLE event_table ON CLUSTER default (event_time DateTime, value String)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/event_table', '{replica}')
ORDER BY event_time PARTITION BY toYYYYMM(event_time);
INSERT INTO event_table ...
그런 다음 구성 파일의 remote_servers 섹션에 같은 항목으로 새 노드를 시작해 클러스터에 새 노드를 추가해요:
┌─cluster─┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name────┬─host_address─┬─port─┬─is_local─┬─user─┬─is_active─┐
│ default │ 1 │ 1 │ 1 │ 92d3c04025e8 │ 172.26.0.5 │ 9000 │ 0 │ │ ᴺᵁᴸᴸ │
│ default │ 1 │ 1 │ 2 │ a6a68731c21b │ 172.26.0.4 │ 9000 │ 1 │ │ ᴺᵁᴸᴸ │
│ default │ 1 │ 1 │ 3 │ 8e62b9cb17a1 │ 172.26.0.2 │ 9000 │ 0 │ │ ᴺᵁᴸᴸ │
│ default │ 1 │ 1 │ 4 │ b0df3669b81f │ 172.26.0.6 │ 9000 │ 0 │ │ ᴺᵁᴸᴸ │
└─────────┴───────────┴──────────────┴─────────────┴──────────────┴──────────────┴──────┴──────────┴──────┴───────────┘
네 번째 노드가 클러스터에 참여하고 있지만, event_table 테이블은 여전히 처음 세 노드에만 존재해요:
SELECT hostname(), database, table FROM clusterAllReplicas(default, system.tables) WHERE table = 'event_table' FORMAT PrettyCompactMonoBlock
┌─hostname()───┬─database─┬─table───────┐
│ a6a68731c21b │ default │ event_table │
│ 92d3c04025e8 │ default │ event_table │
│ 8e62b9cb17a1 │ default │ event_table │
└──────────────┴──────────┴─────────────┘
모든 노드에 테이블을 복제해야 한다면 클러스터 자동 탐지 대신 Replicated 데이터베이스 엔진을 사용할 수 있어요.