Amazon Redshift는 Amazon Web Services에서 제공하는 대표적인 클라우드 데이터 웨어하우징 솔루션입니다. 이 가이드에서는 Redshift 인스턴스에서 ClickHouse로 데이터를 마이그레이션하는 다양한 접근 방식을 소개합니다. 여기서는 다음 3가지 옵션을 살펴봅니다:
ClickHouse 인스턴스 기준으로는 다음 중 하나를 선택할 수 있습니다:
-
PUSH 타사 ETL/ELT 도구 또는 서비스를 사용해 데이터를 ClickHouse로 전송합니다
-
PULL ClickHouse JDBC Bridge를 활용해 Redshift에서 데이터를 가져옵니다
-
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 인스턴스를 사용했습니다.
ClickHouse JDBC Bridge 배포
ClickHouse JDBC Bridge를 배포합니다. 자세한 내용은 외부 데이터 소스용 JDBC 사용자 가이드를 참조하십시오.ClickHouse Cloud를 사용하는 경우에는 별도의 환경에서 ClickHouse JDBC Bridge를 실행한 뒤 remoteSecure 함수를 사용해 ClickHouse Cloud에 연결해야 합니다. 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
}
}
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.
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로 로드).
UNLOAD를 사용해 데이터를 S3 버킷으로 내보내기
Redshift의 UNLOAD 기능을 사용하여 데이터를 기존의 비공개 S3 버킷으로 내보내십시오:그러면 S3에 원시 데이터가 들어 있는 part 파일이 생성됩니다.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처럼 데이터 타입 정보가 포함된 포맷에서 특히 잘 작동합니다.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의 컬럼 지향 구조를 활용하여 데이터 수집 속도를 높입니다.