메인 콘텐츠로 건너뛰기

소개

Amazon Redshift는 Amazon Web Services에서 제공하는 대표적인 클라우드 데이터 웨어하우징 솔루션입니다. 이 가이드에서는 Redshift 인스턴스에서 ClickHouse로 데이터를 마이그레이션하는 다양한 접근 방식을 소개합니다. 여기서는 다음 3가지 옵션을 살펴봅니다: ClickHouse 인스턴스 기준으로는 다음 중 하나를 선택할 수 있습니다:
  1. PUSH 타사 ETL/ELT 도구 또는 서비스를 사용해 데이터를 ClickHouse로 전송합니다
  2. PULL ClickHouse JDBC Bridge를 활용해 Redshift에서 데이터를 가져옵니다
  3. PIVOT S3 객체 스토리지를 사용해 “언로드 후 로드” 방식으로 데이터를 이동합니다
이 튜토리얼에서는 데이터 소스로 Redshift를 사용했습니다. 하지만 여기서 소개하는 마이그레이션 방식은 Redshift에만 국한되지 않으며, 호환되는 모든 데이터 소스에도 유사하게 적용할 수 있습니다.

Push 방식으로 Redshift에서 ClickHouse로 데이터 전송

Push 시나리오에서는 타사 도구나 서비스(사용자 지정 코드 또는 ETL/ELT)를 활용해 데이터를 ClickHouse 인스턴스로 전송합니다. 예를 들어, Airbyte와 같은 소프트웨어를 사용해 Redshift 인스턴스를 소스로, ClickHouse를 대상으로 하여 데이터를 이동할 수 있습니다(Airbyte 통합 가이드 보기)

장점

  • ETL/ELT 소프트웨어에서 기존에 제공하는 커넥터 카탈로그를 활용할 수 있습니다.
  • 데이터를 동기화된 상태로 유지할 수 있는 기본 기능(append/overwrite/increment 로직)이 내장되어 있습니다.
  • 데이터 변환 시나리오를 구현할 수 있습니다(예를 들어, dbt 통합 가이드를 참조하십시오).

단점

  • ETL/ELT 인프라를 구축하고 유지 관리해야 합니다.
  • 아키텍처에 서드파티 요소가 추가되어 잠재적인 확장성 병목이 될 수 있습니다.

Redshift에서 ClickHouse로 데이터 가져오기

Pull 시나리오에서는 ClickHouse JDBC Bridge를 사용하여 ClickHouse 인스턴스에서 Redshift 클러스터에 직접 연결한 뒤 INSERT INTO ... SELECT 쿼리를 수행합니다:

장점

  • 모든 JDBC 호환 도구에서 사용할 수 있습니다
  • ClickHouse 내에서 여러 외부 데이터 소스를 쿼리할 수 있게 해주는 효율적인 솔루션입니다

단점

  • 잠재적인 확장성 병목이 될 수 있는 ClickHouse JDBC Bridge 인스턴스가 필요합니다
Redshift는 PostgreSQL 기반이지만, ClickHouse는 PostgreSQL 버전 9 이상을 요구하고 Redshift API는 그보다 이전 버전(8.x)을 기반으로 하므로 ClickHouse PostgreSQL 테이블 함수 또는 테이블 엔진은 사용할 수 없습니다.

튜토리얼

이 옵션을 사용하려면 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 문을 사용해 데이터를 가져오는 방법을 보여줍니다.
# 3개 컬럼으로 테이블 생성
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로 피벗

이 시나리오에서는 데이터를 중간 피벗 포맷으로 S3에 내보내고, 두 번째 단계에서 S3의 데이터를 ClickHouse로 적재합니다.

장점

  • Redshift와 ClickHouse는 모두 강력한 S3 통합 기능을 제공합니다.
  • Redshift UNLOAD 명령과 ClickHouse S3 테이블 함수 / 테이블 엔진 같은 기존 기능을 활용할 수 있습니다.
  • ClickHouse의 S3 대상 병렬 읽기와 고처리량 capability를 통해 원활하게 확장할 수 있습니다.
  • Apache Parquet와 같은 고급 압축 포맷을 활용할 수 있습니다.

단점

  • 프로세스가 2단계로 진행됩니다(Redshift에서 언로드한 후 ClickHouse로 로드).

튜토리얼

1

UNLOAD를 사용해 데이터를 S3 버킷으로 내보내기

Redshift의 UNLOAD 기능을 사용하여 데이터를 기존의 비공개 S3 버킷으로 내보내십시오:그러면 S3에 원시 데이터가 들어 있는 part 파일이 생성됩니다.
2

ClickHouse에 테이블 생성하기

ClickHouse에 테이블을 생성하십시오:
CREATE TABLE users
(
  username String,
  firstname String,
  lastname String
)
ENGINE = MergeTree
ORDER BY username
또는 CREATE TABLE ... EMPTY AS SELECT를 사용하여 ClickHouse가 테이블 구조를 추론하도록 할 수 있습니다:
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를 권장합니다. 압축이 적용되므로 전송 시간을 줄이면서 스토리지 비용도 일부 절감할 수 있기 때문입니다. (기본적으로 각 row group은 SNAPPY를 사용해 압축됩니다.) 또한 ClickHouse는 Parquet의 컬럼 지향 구조를 활용하여 데이터 수집 속도를 높입니다.
마지막 수정일 2026년 6월 10일