ClickHouse는 여타 DBMS와는 다르게 ClickHouse keeper와 zookeeper를 통한 클러스터링을 지원한다. 클러스터 구성이 가능하기에 분산과 복제의 개념 또한 존재한다. 다만, 그 개념이 일반적인 클러스터 구성(Hadoop, Ignite, ES와 같은)과는 약간의 차이가 있다.
ClickHouse는 Shard(샤드)와 Replica(레플리카)라는 개념으로 분산과 복제를 제공한다. 아래는 공식 홈페이지에서 설명하는 Shard와 Replica에 대한 정의이다.
- Shard : 데이터의 하위 집합. 최소 하나의 Shard가 반드시 있으며, 여러 서버에 분할하지 않으면 데이터는 하나의 Shard에 저장된다. 단일 서버의 용량을 초과하는 경우 여러 서버에 걸쳐 데이터를 Sharding하여 부하를 분산할 수 있다.
- Replica : 데이터 사본. 최소 하나의 복사본이 있으므로 최소 Replica 수는 1이다. Replica 수가 2가 될 때부터 복제본에 의한 내결함성이 제공된다.
위 그림에서는 각 노드에 서로 다른 Shard가 존재하고, 각 Shard는 1개씩의 Replica를 갖는다. (2 Shard - 1 Replica)
두 대의 Node에 각각 Shard를 분리해 두면, 두 Shard는 각각 다른 데이터를 갖는다. 가령 100건의 데이터가 있다고 가정할 때, 각 Shard는 50건 씩의 데이터(분산)를 각자 Node에 갖게 된다. 그러나 Replica는 1이므로 원본만 존재하고 복제본은 존재하지 않는다. 반대로 두 노드에 같은 Shard가 존재하고, Shard가 각각의 Replica를 갖으면, (1 Shard - 2 Replica) 두 Replica는 100건의 동일한 데이터(복제)를 각각 갖는다. 쉽게 말해 Shard는 분산, Replica는 복제를 의미한다.
Shard는 Non-Shared Data로 운용되며, 이는 각 Shard가 서로의 데이터를 공유하지 않음을 의미한다. 정확히는 데이터 공유 사실에 관심이 없다. 특정 Shard의 데이터가 다른 Shard에도 공유가 되었는지, 나만 갖고 있는 데이터인지 모른다는 의미이다. 의도적인 Shard 간 데이터 전달(9000 port)이 아니라면, 그저 본인이 바라보는 Disk (File System)에 존재하는 데이터만 바라보고 Query를 수행할 뿐이다.
상기 서술한 바에 따르면, Clickhouse의 분산 처리는 아래 특징들을 가진다.
- Shard를 통해 분산 처리를 한다.
- 분리 된 Shard는 서로 Non-Shared(비 공유)로 Data를 운용한다.
이 특징들로 인해 Query가 수행된 Node에서는 분산된 데이터를 모두 참조하지 않고, 본인 Node에 존재하는 Data를 대상으로만 Query를 수행한다. 이런 이유로 Clickhouse 에서는 분산된 데이터를 하나의 Query로 모두 접근하도록 'Distributed' 라는 Table Engine을 제공한다.
Distributed Engine을 사용한 Table은 Sharding Key라는 분산 key를 매체로 동작을 하며,
위 그림과 같이 각 Node에 동일 쿼리를 각각 수행할 수도 있으나, Distributed를 통해 한번에 수행할 수 있도록 분산처리르 지원한다.
Replica는 서로 간에 데이터가 동일하게 복제되어야 하기 때문에 Keeper를 통해 수시로 서로 간의 Sync를 맞춘다. 각 Replica는 자신의 데이터와 함께 메타 정보를 Keeper의 특정 경로에 저장하게 되는데, 같은 Shard의 각 Replica들은 모두 같은 Keeper의 경로를 바라보게 된다. 어느 한 쪽의 Replica에서 데이터 변경이 일어난 경우 변경사항의 메타를 Keeper에 반영하게 되고, 다른 Replica들은 메타의 변경사항이 확인되면 변경 사항을 비동기로 본인의 데이터에 반영하여 Sync를 맞추어 복제본을 유지한다.
ClickHouse는 또한 다수의 Cluster를 구성할 수 있다. 예를 들면,
위와 같이 4개의 노드에 두 개의 클러스터를 구성하고 1번 클러스터에는 2 Shard 2 Replica로 구성하여 분산(2-병렬처리)과 복제를 모두 지원하고, 2번 클러스터에는 오직 분산(4-병렬처리)만 가능하도록 지원하게끔 구성하여, 유실이 있으면 안되는 중요한 데이터는 1번 클러스터에서, 속도가 중요한 데이터 처리의 경우 2번 클러스터에서 처리하도록 유도할 수 있다.
'오픈소스 > ClickHouse' 카테고리의 다른 글
[ClickHouse] INDEX 구조와 동작 원리 - ③ (0) | 2023.07.06 |
---|---|
[ClickHouse] INDEX 구조와 동작 원리 - ② (0) | 2023.07.06 |
[ClickHouse] INDEX 구조와 동작 원리 - ① (0) | 2023.07.06 |
[ClickHouse] Data 구조 (0) | 2023.06.30 |
Click House 개요 (0) | 2023.06.14 |