Amazon Redshift에서 ClickHouse로 마이그레이션 가이드

Amazon Redshift에서 ClickHouse로 마이그레이션 가이드

이 가이드는 Redshift 인스턴스에서 ClickHouse로 데이터를 마이그레이션하는 다양한 방법을 소개해요. PUSH(서드파티 ETL/ELT 도구), PULL(ClickHouse JDBC Bridge), PIVOT(S3 오브젝트 스토리지) 세 가지 옵션을 다룹니다.

출처: Amazon Redshift to ClickHouse migration guide

본문

소개 (Introduction)

Amazon Redshift는 Amazon Web Services 제품군의 일부인 인기 있는 클라우드 데이터 웨어하우징 솔루션이에요. 이 가이드는 Redshift 인스턴스에서 ClickHouse로 데이터를 마이그레이션하는 다양한 방법을 제시해요. 세 가지 옵션을 다룰게요:

ClickHouse 인스턴스 관점에서, 다음 중 하나를 할 수 있어요:

  1. PUSH — 서드파티 ETL/ELT 도구나 서비스를 사용해 ClickHouse로 데이터 밀어 넣기
  2. PULL — ClickHouse JDBC Bridge를 활용해 Redshift에서 데이터 끌어오기
  3. PIVOT — "Unload then load" 로직으로 S3 오브젝트 스토리지 사용하기

이 튜토리얼에서 Redshift를 데이터 소스로 사용했지만, 여기 제시된 마이그레이션 접근은 Redshift 전용이 아니며 호환 가능한 어떤 데이터 소스에 대해서도 유사한 단계를 도출할 수 있어요.

Redshift에서 ClickHouse로 데이터 PUSH하기

PUSH 시나리오의 핵심은 서드파티 도구나 서비스(커스텀 코드 또는 ETL/ELT)를 활용해서 데이터를 ClickHouse 인스턴스로 보내는 거예요. 예를 들어 Airbyte 같은 소프트웨어로 Redshift 인스턴스(소스)와 ClickHouse(목적지) 사이에서 데이터를 옮길 수 있어요 (Airbyte 통합 가이드 참조).

장점:

  • ETL/ELT 소프트웨어의 기존 커넥터 카탈로그를 활용할 수 있어요.
  • 데이터를 동기화 상태로 유지하는 내장 기능(append/overwrite/increment 로직).
  • 데이터 변환 시나리오 활성화 (예: dbt 통합 가이드 참조).

단점:

  • ETL/ELT 인프라를 설정하고 유지해야 해요.
  • 아키텍처에 서드파티 요소를 도입해서 잠재적 확장 병목이 될 수 있어요.

Redshift에서 ClickHouse로 데이터 PULL하기

PULL 시나리오의 핵심은 ClickHouse JDBC Bridge를 활용해서 ClickHouse 인스턴스에서 Redshift 클러스터에 직접 연결하고 INSERT INTO ... SELECT 쿼리를 수행하는 거예요.

장점:

  • 모든 JDBC 호환 도구에 일반적이에요.
  • ClickHouse 내부에서 여러 외부 데이터 소스를 쿼리할 수 있는 우아한 솔루션이에요.

단점:

  • ClickHouse JDBC Bridge 인스턴스가 필요하며, 이는 잠재적 확장 병목이 될 수 있어요.

Redshift가 PostgreSQL 기반이더라도 ClickHouse PostgreSQL 테이블 함수나 테이블 엔진은 사용할 수 없어요. ClickHouse는 PostgreSQL 버전 9 이상을 요구하는데, Redshift API는 더 이른 버전(8.x)을 기반으로 하기 때문이에요.

튜토리얼 (Tutorial)

이 옵션을 사용하려면 ClickHouse JDBC Bridge를 설정해야 해요. ClickHouse JDBC Bridge는 JDBC 연결을 처리하고 ClickHouse 인스턴스와 데이터 소스 사이의 프록시 역할을 하는 독립형 Java 애플리케이션이에요. 이 튜토리얼에서는 샘플 데이터베이스가 채워진 Redshift 인스턴스를 사용했어요.

1. ClickHouse JDBC Bridge 배포 — ClickHouse JDBC Bridge를 배포하세요. 자세한 내용은 외부 데이터 소스용 JDBC 사용자 가이드를 참고하세요. ClickHouse Cloud를 사용한다면 별도의 환경에서 ClickHouse JDBC Bridge를 실행하고 remoteSecure 함수로 ClickHouse Cloud에 연결해야 해요.

2. Redshift 데이터 소스 구성 — ClickHouse JDBC Bridge용 Redshift 데이터 소스를 구성하세요. 예를 들어 /etc/clickhouse-jdbc-bridge/config/datasources/redshift.json:

{
 "redshift-server": {
   "aliases": [
     "redshift"
   ],
   "driverUrls": [
   "https://s3.amazonaws.com/redshift-downloads/drivers/jdbc/2.1.0.4/redshift-jdbc42-2.1.0.4.jar"
   ],
   "driverClassName": "com.amazon.redshift.jdbc.Driver",
   "jdbcUrl": "jdbc:redshift://redshift-cluster-1.ckubnplpz1uv.us-east-1.redshift.amazonaws.com:5439/dev",
   "username": "awsuser",
   "password": "<password>",
   "maximumPoolSize": 5
 }
}

3. ClickHouse에서 Redshift 인스턴스 쿼리 — ClickHouse JDBC Bridge가 배포되고 실행되면 ClickHouse에서 Redshift 인스턴스를 쿼리할 수 있어요:

SELECT *
FROM jdbc('redshift', 'select username, firstname, lastname from users limit 5')
Query id: 1b7de211-c0f6-4117-86a2-276484f9f4c0

┌─username─┬─firstname─┬─lastname─┐
│ PGL08LJI │ Vladimir  │ Humphrey │
│ XDZ38RDD │ Barry     │ Roy      │
│ AEB55QTM │ Reagan    │ Hodge    │
│ OWY35QYB │ Tamekah   │ Juarez   │
│ MSD36KVR │ Mufutau   │ Watkins  │
└──────────┴───────────┴──────────┘

5 rows in set. Elapsed: 0.438 sec.
SELECT *
FROM jdbc('redshift', 'select count(*) from sales')
Query id: 2d0f957c-8f4e-43b2-a66a-cc48cc96237b

┌──count─┐
│ 172456 │
└────────┘

1 rows in set. Elapsed: 0.304 sec.

4. Redshift에서 ClickHouse로 데이터 가져오기 — 아래에서는 INSERT INTO ... SELECT 문으로 데이터를 가져오는 것을 보여줘요:

# TABLE CREATION with 3 columns
CREATE TABLE users_imported
(
   `username` String,
   `firstname` String,
   `lastname` String
)
ENGINE = MergeTree
ORDER BY firstname
Query id: c7c4c44b-cdb2-49cf-b319-4e569976ab05

Ok.

0 rows in set. Elapsed: 0.233 sec.
INSERT INTO users_imported (*) SELECT *
FROM jdbc('redshift', 'select username, firstname, lastname from users')
Query id: 9d3a688d-b45a-40f4-a7c7-97d93d7149f1

Ok.

0 rows in set. Elapsed: 4.498 sec. Processed 49.99 thousand rows, 2.49 MB (11.11 thousand rows/s., 554.27 KB/s.)

S3를 사용해 Redshift에서 ClickHouse로 데이터 PIVOT하기

이 시나리오에서는 중간 피벗 포맷으로 S3에 데이터를 내보내고, 두 번째 단계에서 S3에서 ClickHouse로 데이터를 로드해요.

장점:

  • Redshift와 ClickHouse 둘 다 강력한 S3 통합 기능이 있어요.
  • Redshift UNLOAD 명령과 ClickHouse S3 테이블 함수/테이블 엔진 같은 기존 기능을 활용해요.
  • ClickHouse에서 S3로/에서의 병렬 읽기와 높은 처리량 덕분에 원활하게 확장돼요.
  • Apache Parquet 같은 정교하고 압축된 포맷을 활용할 수 있어요.

단점:

  • 과정의 두 단계(Redshift에서 unload 후 ClickHouse로 load).

튜토리얼 (Tutorial)

1. UNLOAD로 S3 버킷에 데이터 내보내기 — Redshift의 UNLOAD 기능을 사용해서 데이터를 기존 프라이빗 S3 버킷으로 내보내요. 그러면 S3에 원시 데이터를 담은 파트 파일들이 생성돼요.

2. ClickHouse에 테이블 만들기 — ClickHouse에 테이블을 만들어요:

CREATE TABLE users
(
  username String,
  firstname String,
  lastname String
)
ENGINE = MergeTree
ORDER BY username

또는 ClickHouse가 CREATE TABLE ... EMPTY AS SELECT로 테이블 구조를 추론하게 할 수도 있어요:

CREATE TABLE users
ENGINE = MergeTree ORDER BY username
EMPTY AS
SELECT * FROM s3('https://your-bucket.s3.amazonaws.com/unload/users/*', '<aws_access_key>', '<aws_secret_access_key>', 'CSV')

이것은 데이터가 Parquet처럼 데이터 타입에 대한 정보를 포함하는 포맷일 때 특히 잘 동작해요.

3. S3 파일을 ClickHouse로 로드하기INSERT INTO ... SELECT 문으로 S3 파일을 ClickHouse로 로드해요:

INSERT INTO users SELECT *
FROM s3('https://your-bucket.s3.amazonaws.com/unload/users/*', '<aws_access_key>', '<aws_secret_access_key>', 'CSV')
Query id: 2e7e219a-6124-461c-8d75-e4f5002c8557

Ok.

0 rows in set. Elapsed: 0.545 sec. Processed 49.99 thousand rows, 2.34 MB (91.72 thousand rows/s., 4.30 MB/s.)

이 예시는 피벗 포맷으로 CSV를 사용했어요. 하지만 프로덕션 워크로드에서는 대규모 마이그레이션에 Apache Parquet을 최상의 옵션으로 권장해요. 압축이 함께 제공되어 전송 시간을 줄이면서 저장 비용을 절약할 수 있기 때문이에요. (기본적으로 각 행 그룹은 SNAPPY로 압축됩니다.) ClickHouse는 또한 Parquet의 컬럼 지향성을 활용해서 데이터 수집을 빠르게 해요.

더 알아보기 (Learn more)