이 문서는 PostgreSQL에서 ClickHouse로 마이그레이션하는 가이드의 1부입니다. 실용적인 예시를 통해 실시간 복제(CDC) 방식으로 마이그레이션을 효율적으로 수행하는 방법을 설명합니다. 여기서 다루는 많은 개념은 PostgreSQL에서 ClickHouse로 수동으로 대량 데이터를 전송할 때에도 적용됩니다.
데이터셋
post, vote, user, comment, badge가 포함되어 있습니다. 이 데이터에 대한 PostgreSQL 스키마(스키마)는 아래와 같습니다.
PostgreSQL에서 테이블을 생성하는 DDL 명령은 여기에서 확인할 수 있습니다.
이 스키마는 반드시 가장 최적화된 형태는 아니지만, 프라이머리 키, 외래 키, 파티셔닝, 인덱스 등 널리 사용되는 여러 PostgreSQL 기능을 활용합니다.
이러한 각 개념을 ClickHouse의 대응 개념으로 마이그레이션할 것입니다.
마이그레이션 단계를 테스트하기 위해 이 데이터셋을 PostgreSQL 인스턴스에 채우려는 사용자를 위해, DDL과 함께 다운로드할 수 있도록 pg_dump 포맷의 데이터를 제공했으며, 이후 데이터 로드 명령은 아래에 나와 있습니다.
예시 결과에서는 Postgres와 ClickHouse의 성능 차이를 보여주기 위해 전체 데이터셋을 사용하지만, 아래에 설명된 모든 단계는 더 작은 하위 집합에도 동일하게 적용됩니다. 전체 데이터셋을 Postgres에 로드하려는 사용자는 여기를 참조하십시오. 위 스키마에 적용된 외래 키 제약 조건 때문에 PostgreSQL용 전체 데이터셋에는 참조 무결성을 만족하는 행만 포함됩니다. 이러한 제약 조건이 없는 Parquet 버전이 필요한 경우, 이를 ClickHouse에 직접 쉽게 로드할 수 있습니다.
데이터 마이그레이션
실시간 복제 (CDC)
users가 어떻게 생성되는지 살펴보겠습니다.
수동 대량 로드 및 주기적 업데이트
- 테이블 함수 - ClickHouse에서 Postgres table function을 사용해 Postgres에서 데이터를
SELECT한 뒤 ClickHouse 테이블에INSERT합니다. 수백 GB 규모의 데이터셋까지 대량 로드하는 경우에 적합합니다. - 내보내기 - CSV 또는 SQL 스크립트 파일과 같은 중간 포맷으로 내보냅니다. 그런 다음 이 파일들을
INSERT FROM INFILE절을 통해 클라이언트에서 ClickHouse로 로드하거나, 객체 스토리지와 관련 함수(예: s3, gcs)를 사용해 로드할 수 있습니다.
DESCRIBE 명령을 사용할 수 있습니다. 다음 명령은 PostgreSQL의 posts 테이블 구조를 보여줍니다. 환경에 맞게 수정하십시오:
Query
Query
INSERT INTO SELECT를 사용해 PostgresSQL에서 데이터를 읽어 ClickHouse에 삽입할 수 있습니다:
Query
삽입만 이루어지고 증가하는 id 또는 timestamp가 있는 경우, 위의 테이블 함수 접근 방식을 사용해 증분 데이터를 적재할 수 있습니다. 즉, SELECT에 WHERE 절을 적용할 수 있습니다. 이 접근 방식은 업데이트가 항상 동일한 컬럼을 갱신한다고 보장되는 경우 업데이트를 지원하는 데에도 사용할 수 있습니다. 다만 삭제를 지원하려면 전체 재적재가 필요하며, 테이블이 커질수록 이를 구현하기 어려울 수 있습니다.
여기서는 CreationDate를 사용한 초기 적재와 증분 적재를 보여줍니다(행이 업데이트되면 이 값도 함께 업데이트된다고 가정합니다)..
ClickHouse는=,!=,>,>=,<,<=, IN과 같은 단순한WHERE절을 PostgreSQL 서버로 푸시다운합니다. 따라서 변경 집합을 식별하는 데 사용하는 컬럼에 인덱스가 있도록 하면 증분 로드를 더 효율적으로 수행할 수 있습니다.
쿼리 복제를 사용할 때 UPDATE 작업을 감지하는 한 가지 방법은2부는 여기를 클릭하세요XMIN시스템 컬럼(트랜잭션 ID)을 워터마크로 사용하는 것입니다. 이 컬럼의 값이 변경되면 데이터가 변경되었음을 의미하므로 대상 테이블에 적용할 수 있습니다. 이 방식을 사용할 경우XMIN값이 래핑될 수 있고, 비교를 위해 전체 테이블 스캔이 필요하므로 변경 사항 추적이 더 복잡해질 수 있다는 점에 유의해야 합니다.