Postgres vs ClickHouse: 대응되는 개념과 차이점
INSERT, UPDATE, DELETE 작업을 기준으로 변경 사항을 스트리밍하는 더 높은 수준의 추상화입니다. 물리적 복제로도 동일한 결과를 얻을 수 있지만, 특정 테이블과 작업만 대상으로 지정하거나 데이터 변환을 수행하고 서로 다른 Postgres 버전을 지원하는 측면에서는 논리적 복제가 더 큰 유연성을 제공합니다.
반면 ClickHouse의 세그먼트와 레플리카는 데이터 분산과 중복성에 관한 두 가지 핵심 개념입니다. ClickHouse 레플리카는 최종 일관성(eventual consistency)을 가지며 프라이머리라는 개념이 없다는 점을 제외하면 Postgres 레플리카와 유사하다고 볼 수 있습니다. 또한 세그먼트 분할은 Postgres와 달리 네이티브로 지원됩니다.
세그먼트는 테이블 데이터의 일부입니다. 항상 최소 1개의 세그먼트가 존재합니다. 데이터를 여러 서버에 걸쳐 세그먼트 분할하면 단일 서버의 용량을 초과할 때 부하를 분산할 수 있으며, 모든 세그먼트가 병렬로 쿼리를 실행하는 데 사용됩니다. 서로 다른 서버에서 테이블용 세그먼트를 수동으로 생성하고 데이터도 직접 삽입할 수 있습니다. 또는 데이터가 어느 세그먼트로 라우팅될지 정의하는 sharding key와 함께 분산 테이블을 사용할 수도 있습니다. sharding key는 random일 수도 있고 hash function의 출력값일 수도 있습니다. 중요한 점은 하나의 세그먼트가 여러 레플리카로 구성될 수 있다는 것입니다.
레플리카는 데이터의 복사본입니다. ClickHouse는 항상 최소 1개의 데이터 복사본을 가지므로 레플리카의 최소 개수는 1입니다. 데이터의 두 번째 레플리카를 추가하면 장애 허용이 향상되고, 더 많은 쿼리를 처리하기 위한 추가 컴퓨트도 확보할 수 있습니다(병렬 레플리카를 사용하면 단일 쿼리의 컴퓨트도 분산할 수 있어 지연 시간을 낮출 수 있습니다). 레플리카는 ReplicatedMergeTree 테이블 엔진을 통해 구현되며, 이를 통해 ClickHouse는 서로 다른 서버에 있는 여러 데이터 복사본을 동기화된 상태로 유지할 수 있습니다. 복제는 물리적으로 이루어집니다. 즉, 노드 간에는 쿼리가 아니라 압축된 파트만 전송됩니다.
요약하면, 레플리카는 중복성과 신뢰성(그리고 경우에 따라 분산 처리)을 제공하는 데이터 복사본이며, 세그먼트는 분산 처리와 부하 분산을 가능하게 하는 데이터의 부분 집합입니다.
ClickHouse Cloud는 S3에 저장된 단일 데이터 복사본과 여러 컴퓨트 레플리카를 사용합니다. 데이터는 각 레플리카 노드에서 사용할 수 있으며, 각 노드에는 로컬 SSD 캐시가 있습니다. 이는 ClickHouse Keeper를 통한 메타데이터 복제에만 의존합니다.
최종 일관성
사용자에게 미치는 영향
권장 사항
일관된 라우팅
ClickHouse Cloud
스티키 엔드포인트에 대한 액세스는 지원팀에 문의하십시오.
ClickHouse OSS
session_id 또는 user_id 같은 값을 기준으로 일관된 노드 라우팅이 수행되도록 해야 합니다. 설정 prefer_localhost_replica=0, load_balancing=in_order는 쿼리에서 설정해야 합니다. 이렇게 하면 각 세그먼트의 로컬 레플리카가 우선 선택되고, 로컬 레플리카가 없으면 구성에 나열된 순서대로 레플리카가 우선 선택됩니다. 단, 오류 수가 같아야 하며, 오류 수가 더 많으면 failover가 발생하고 무작위로 선택됩니다. 이러한 결정적 세그먼트 선택의 대안으로 load_balancing=nearest_hostname도 사용할 수 있습니다.
분산 테이블을 만들 때는 cluster를 지정해야 합니다. config.xml에 지정하는 이 cluster 정의에는 세그먼트(및 해당 레플리카)가 나열되므로, 사용자는 각 노드에서 사용 순서를 제어할 수 있습니다. 이를 통해 선택이 항상 같은 방식으로 이루어지도록 할 수 있습니다.
순차 일관성
- 동일한 노드에서 읽기/쓰기 - 네이티브 프로토콜을 사용하거나 HTTP를 통해 쓰기/읽기를 수행하는 세션을 사용하는 경우, 동일한 레플리카에 연결되어 있어야 합니다. 이 경우 쓰기를 수행한 노드에서 직접 읽으므로 읽기 결과는 항상 일관됩니다.
- 레플리카를 수동으로 동기화 - 한 레플리카에 쓰고 다른 레플리카에서 읽는 경우, 읽기 전에
SYSTEM SYNC REPLICA LIGHTWEIGHT를 실행할 수 있습니다. - 순차 일관성 활성화 - 쿼리 설정
select_sequential_consistency = 1로 활성화할 수 있습니다. OSS에서는insert_quorum = 'auto'설정도 함께 지정해야 합니다.
이 설정을 활성화하는 방법에 대한 자세한 내용은 여기를 참조하십시오.
순차 일관성을 사용하면 ClickHouse Keeper에 더 큰 부하가 발생합니다. 그 결과 삽입과 읽기가 더 느려질 수 있습니다. ClickHouse Cloud에서 기본 테이블 엔진으로 사용되는 SharedMergeTree는 순차 일관성 사용 시 오버헤드가 더 적고 확장성이 더 뛰어납니다. OSS에서는 이 방식을 신중하게 사용하고 Keeper 부하를 측정해야 합니다.
트랜잭션(ACID) 지원
압축
Query (Postgres)
Query (ClickHouse)
Response
데이터 타입 매핑
| Postgres 데이터 타입 | ClickHouse 유형 |
|---|---|
DATE | Date |
TIMESTAMP | DateTime |
REAL | Float32 |
DOUBLE | Float64 |
DECIMAL, NUMERIC | Decimal |
SMALLINT | Int16 |
INTEGER | Int32 |
BIGINT | Int64 |
SERIAL | UInt32 |
BIGSERIAL | UInt64 |
TEXT, CHAR, BPCHAR | String |
INTEGER | Nullable(Int32) |
ARRAY | Array |
FLOAT4 | Float32 |
BOOLEAN | Bool |
VARCHAR | String |
BIT | String |
BIT VARYING | String |
BYTEA | String |
NUMERIC | Decimal |
GEOGRAPHY | Point, Ring, Polygon, MultiPolygon |
GEOMETRY | Point, Ring, Polygon, MultiPolygon |
INET | IPv4, IPv6 |
MACADDR | String |
CIDR | String |
HSTORE | Map(K, V), Map(K,Variant) |
UUID | UUID |
ARRAY<T> | ARRAY(T) |
JSON | String, Variant, Nested, Tuple |
JSONB | String |