Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

클러스터 디스커버리

개요

ClickHouse의 클러스터 디스커버리 기능을 사용하면 설정 파일에 각 노드를 명시적으로 정의하지 않아도 노드가 자동으로 서로를 발견하고 스스로 등록할 수 있어 클러스터 구성이 간소화됩니다. 특히 각 노드를 수동으로 정의해야 해 번거로운 경우에 유용합니다.

원격 서버 구성

기존의 수동 구성

기존에는 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>

클러스터 디스커버리 사용

클러스터 디스커버리를 사용하면 각 노드를 명시적으로 정의하는 대신 ZooKeeper에 경로만 지정하면 됩니다. ZooKeeper에서 이 경로 아래에 등록된 모든 노드는 자동으로 감지되어 클러스터에 추가됩니다.

<remote_servers>
    <cluster_name>
        <discovery>
            <path>/clickhouse/discovery/cluster_name</path>

            <!-- # 선택적 구성 매개변수: -->

            <!-- ## 클러스터 내 다른 모든 노드에 접근하기 위한 인증 자격 증명: -->
            <!-- <user>user1</user> -->
            <!-- <password>pass123</password> -->
            <!-- ### 비밀번호 대신 서버 간 시크릿을 사용할 수도 있습니다: -->
            <!-- <secret>secret123</secret> -->

            <!-- ## 현재 노드의 세그먼트(아래 참조): -->
            <!-- <shard>1</shard> -->

            <!-- ## 옵저버 모드(아래 참조): -->
            <!-- <observer/> -->
        </discovery>
    </cluster_name>
</remote_servers>

특정 노드의 세그먼트 번호를 지정하려면 <discovery> 섹션 안에 <shard> 태그를 포함할 수 있습니다:

node1node2의 경우:

<discovery>
    <path>/clickhouse/discovery/cluster_name</path>
    <shard>1</shard>
</discovery>

node3node4는 다음과 같습니다:

<discovery>
    <path>/clickhouse/discovery/cluster_name</path>
    <shard>2</shard>
</discovery>

옵저버 모드

옵저버 모드로 구성된 노드는 스스로를 레플리카로 등록하지 않습니다. 이 노드들은 능동적으로 참여하지 않고 클러스터 내의 다른 활성 레플리카를 관찰하고 발견만 합니다. 옵저버 모드를 활성화하려면 <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';

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은 여전히 처음 3개의 노드에만 존재합니다:

SELECT hostname(), database, table FROM clusterAllReplicas(default, system.tables) WHERE table = 'event_table' FORMAT PrettyCompactMonoBlock

모든 노드에 테이블을 복제해야 하는 경우, 클러스터 디스커버리 대신 Replicated 데이터베이스 엔진을 사용할 수 있습니다.

Navigation