> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-fix-nav-issues.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Amazon Redshift에서 ClickHouse로 이전

# Amazon Redshift에서 ClickHouse로 이전하기 가이드

<div id="introduction">
  ## 소개
</div>

[Amazon Redshift](https://aws.amazon.com/redshift/)는 Amazon Web Services에서 제공하는 대표적인 클라우드 데이터 웨어하우징 솔루션입니다. 이 가이드에서는 Redshift 인스턴스에서 ClickHouse로 데이터를 마이그레이션하는 다양한 접근 방식을 소개합니다. 여기서는 다음 3가지 옵션을 살펴봅니다:

<Image img="/images/integrations/data-ingestion/redshift/redshift-to-clickhouse.png" size="md" alt="Redshift에서 ClickHouse로 마이그레이션하는 옵션" />

ClickHouse 인스턴스 기준으로는 다음 중 하나를 선택할 수 있습니다:

1. **[PUSH](#push-data-from-redshift-to-clickhouse)** 타사 ETL/ELT 도구 또는 서비스를 사용해 데이터를 ClickHouse로 전송합니다

2. **[PULL](#pull-data-from-redshift-to-clickhouse)** ClickHouse JDBC Bridge를 활용해 Redshift에서 데이터를 가져옵니다

3. **[PIVOT](#pivot-data-from-redshift-to-clickhouse-using-s3)** S3 객체 스토리지를 사용해 "언로드 후 로드" 방식으로 데이터를 이동합니다

<Note>
  이 튜토리얼에서는 데이터 소스로 Redshift를 사용했습니다. 하지만 여기서 소개하는 마이그레이션 방식은 Redshift에만 국한되지 않으며, 호환되는 모든 데이터 소스에도 유사하게 적용할 수 있습니다.
</Note>

<div id="push-data-from-redshift-to-clickhouse">
  ## Push 방식으로 Redshift에서 ClickHouse로 데이터 전송
</div>

Push 시나리오에서는 타사 도구나 서비스(사용자 지정 코드 또는 [ETL/ELT](https://en.wikipedia.org/wiki/Extract,_transform,_load#ETL_vs._ELT))를 활용해 데이터를 ClickHouse 인스턴스로 전송합니다. 예를 들어, [Airbyte](https://www.airbyte.com/)와 같은 소프트웨어를 사용해 Redshift 인스턴스를 소스로, ClickHouse를 대상으로 하여 데이터를 이동할 수 있습니다([Airbyte 통합 가이드 보기](/ko/integrations/connectors/data-ingestion/etl-tools/airbyte-and-clickhouse))

<Image img="/images/integrations/data-ingestion/redshift/push.png" size="md" alt="Push 방식으로 Redshift에서 ClickHouse로 데이터 전송" />

<div id="pros">
  ### 장점
</div>

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

<div id="cons">
  ### 단점
</div>

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

<div id="pull-data-from-redshift-to-clickhouse">
  ## Redshift에서 ClickHouse로 데이터 가져오기
</div>

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

<Image img="/images/integrations/data-ingestion/redshift/pull.png" size="md" alt="Redshift에서 ClickHouse로 PULL" />

<div id="pros">
  ### 장점
</div>

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

<div id="cons">
  ### 단점
</div>

* 잠재적인 확장성 병목이 될 수 있는 ClickHouse JDBC Bridge 인스턴스가 필요합니다

<Note>
  Redshift는 PostgreSQL 기반이지만, ClickHouse는 PostgreSQL 버전 9 이상을 요구하고 Redshift API는 그보다 이전 버전(8.x)을 기반으로 하므로 ClickHouse PostgreSQL 테이블 함수 또는 테이블 엔진은 사용할 수 없습니다.
</Note>

<div id="tutorial">
  ### 튜토리얼
</div>

이 옵션을 사용하려면 ClickHouse JDBC Bridge를 설정해야 합니다. ClickHouse JDBC Bridge는 JDBC 연결을 처리하고 ClickHouse 인스턴스와 데이터 소스 사이에서 프록시 역할을 하는 독립형 Java 애플리케이션입니다. 이 튜토리얼에서는 [샘플 데이터베이스](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html)가 미리 구성된 Redshift 인스턴스를 사용했습니다.

<Steps>
  <Step>
    #### ClickHouse JDBC Bridge 배포

    ClickHouse JDBC Bridge를 배포합니다. 자세한 내용은 [외부 데이터 소스용 JDBC](/ko/integrations/connectors/data-ingestion/jdbc-with-clickhouse) 사용자 가이드를 참조하십시오.

    <Note>
      ClickHouse Cloud를 사용하는 경우에는 별도의 환경에서 ClickHouse JDBC Bridge를 실행한 뒤 [remoteSecure](/ko/reference/functions/table-functions/remote) 함수를 사용해 ClickHouse Cloud에 연결해야 합니다.
    </Note>
  </Step>

  <Step>
    #### Redshift 데이터 소스 구성

    ClickHouse JDBC Bridge에서 사용할 Redshift 데이터 소스를 구성합니다. 예: `/etc/clickhouse-jdbc-bridge/config/datasources/redshift.json `

    ```json theme={null}
    {
     "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
     }
    }
    ```
  </Step>

  <Step>
    #### ClickHouse에서 Redshift 인스턴스 쿼리

    ClickHouse JDBC Bridge가 배포되어 실행 중이면 ClickHouse에서 Redshift 인스턴스를 쿼리할 수 있습니다.

    ```sql theme={null}
    SELECT *
    FROM jdbc('redshift', 'select username, firstname, lastname from users limit 5')
    ```

    ```response theme={null}
    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.
    ```

    ```sql theme={null}
    SELECT *
    FROM jdbc('redshift', 'select count(*) from sales')
    ```

    ```response theme={null}
    Query id: 2d0f957c-8f4e-43b2-a66a-cc48cc96237b

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

    1 rows in set. Elapsed: 0.304 sec.
    ```
  </Step>

  <Step>
    #### Redshift에서 ClickHouse로 데이터 가져오기

    다음에서는 `INSERT INTO ... SELECT` 문을 사용해 데이터를 가져오는 방법을 보여줍니다.

    ```sql theme={null}
    # 3개 컬럼으로 테이블 생성
    CREATE TABLE users_imported
    (
       `username` String,
       `firstname` String,
       `lastname` String
    )
    ENGINE = MergeTree
    ORDER BY firstname
    ```

    ```response theme={null}
    Query id: c7c4c44b-cdb2-49cf-b319-4e569976ab05

    Ok.

    0 rows in set. Elapsed: 0.233 sec.
    ```

    ```sql theme={null}
    INSERT INTO users_imported (*) SELECT *
    FROM jdbc('redshift', 'select username, firstname, lastname from users')
    ```

    ```response theme={null}
    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.)
    ```
  </Step>
</Steps>

<div id="pivot-data-from-redshift-to-clickhouse-using-s3">
  ## S3를 사용해 Redshift 데이터를 ClickHouse로 피벗
</div>

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

<Image img="/images/integrations/data-ingestion/redshift/pivot.png" size="md" alt="S3를 사용한 Redshift PIVOT" />

<div id="pros">
  ### 장점
</div>

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

<div id="cons">
  ### 단점
</div>

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

<div id="tutorial">
  ### 튜토리얼
</div>

<Steps>
  <Step>
    #### UNLOAD를 사용해 데이터를 S3 버킷으로 내보내기

    Redshift의 [UNLOAD](https://docs.aws.amazon.com/redshift/latest/dg/r_UNLOAD.html) 기능을 사용하여 데이터를 기존의 비공개 S3 버킷으로 내보내십시오:

    <Image img="/images/integrations/data-ingestion/redshift/s3-1.png" size="md" alt="Redshift에서 S3로 UNLOAD" background="white" />

    그러면 S3에 원시 데이터가 들어 있는 part 파일이 생성됩니다.

    <Image img="/images/integrations/data-ingestion/redshift/s3-2.png" size="md" alt="S3의 데이터" background="white" />
  </Step>

  <Step>
    #### ClickHouse에 테이블 생성하기

    ClickHouse에 테이블을 생성하십시오:

    ```sql theme={null}
    CREATE TABLE users
    (
      username String,
      firstname String,
      lastname String
    )
    ENGINE = MergeTree
    ORDER BY username
    ```

    또는 `CREATE TABLE ... EMPTY AS SELECT`를 사용하여 ClickHouse가 테이블 구조를 추론하도록 할 수 있습니다:

    ```sql theme={null}
    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처럼 데이터 타입 정보가 포함된 포맷에서 특히 잘 작동합니다.
  </Step>

  <Step>
    #### S3 파일을 ClickHouse로 로드하기

    `INSERT INTO ... SELECT` 문을 사용하여 S3 파일을 ClickHouse로 로드하십시오:

    ```sql theme={null}
    INSERT INTO users SELECT *
    FROM s3('https://your-bucket.s3.amazonaws.com/unload/users/*', '<aws_access_key>', '<aws_secret_access_key>', 'CSV')
    ```

    ```response theme={null}
    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.)
    ```

    <Note>
      이 예시에서는 CSV를 피벗 포맷으로 사용했습니다. 하지만 프로덕션 워크로드에서는 대규모 마이그레이션에 가장 적합한 옵션으로 Apache Parquet를 권장합니다. 압축이 적용되므로 전송 시간을 줄이면서 스토리지 비용도 일부 절감할 수 있기 때문입니다. (기본적으로 각 row group은 SNAPPY를 사용해 압축됩니다.) 또한 ClickHouse는 Parquet의 컬럼 지향 구조를 활용하여 데이터 수집 속도를 높입니다.
    </Note>
  </Step>
</Steps>
