> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# 스토리지와 컴퓨트 분리

> 이 가이드에서는 ClickHouse와 S3를 사용해 스토리지와 컴퓨트를 분리한 아키텍처를 구현하는 방법을 살펴봅니다.

export const Image = ({img, alt, size = "lg"}) => {
  const normalizedSize = ["sm", "md", "lg"].includes(size) ? size : "lg";
  return <div className={`ch-image-${normalizedSize}`}>
      <Frame>
        <img src={img} alt={alt} />
      </Frame>
    </div>;
};

<div id="overview">
  ## 개요
</div>

이 가이드에서는 ClickHouse와 S3를 사용해 스토리지와 컴퓨트가 분리된 아키텍처를 구현하는 방법을 살펴봅니다.

스토리지와 컴퓨트를 분리한다는 것은 컴퓨팅 리소스와 스토리지 리소스를 서로 독립적으로 관리한다는 의미입니다. ClickHouse에서는 이를 통해 확장성, 비용 효율성, 유연성을 더욱 높일 수 있습니다. 필요에 따라 스토리지 리소스와 컴퓨트 리소스를 각각 별도로 확장할 수 있으므로 성능과 비용을 최적화할 수 있습니다.

S3 기반 ClickHouse는 특히 「콜드」 데이터에 대한 쿼리 성능이 덜 중요할 때 유용합니다. ClickHouse는 `S3BackedMergeTree`를 사용해 `MergeTree` 엔진의 스토리지로 S3를 사용할 수 있도록 지원합니다. 이 테이블 엔진을 사용하면 `MergeTree` 엔진의 삽입 및 쿼리 성능을 유지하면서도 S3의 확장성과 비용 이점을 활용할 수 있습니다.

스토리지와 컴퓨트를 분리한 아키텍처는 일반적인 ClickHouse 배포보다 구현과 관리가 더 복잡하다는 점에 유의하십시오. 이 가이드에서 설명하듯 자가 관리형 ClickHouse에서도 스토리지와 컴퓨트를 분리할 수 있지만, 구성 없이도 이 아키텍처로 ClickHouse를 사용할 수 있는 [`SharedMergeTree` 테이블 엔진](/docs/ko/products/cloud/features/infrastructure/shared-merge-tree)을 제공하는 [ClickHouse Cloud](https://clickhouse.com/cloud) 사용을 권장합니다.

*이 가이드는 ClickHouse 버전 22.8 이상을 사용한다고 가정합니다.*

<Warning>
  AWS/GCS 수명 주기 정책은 구성하지 마십시오. 이는 지원되지 않으며 테이블이 손상될 수 있습니다.
</Warning>

<Steps>
  <Step title="S3를 ClickHouse 디스크로 사용" id="1-use-s3-as-a-clickhouse-disk">
    ### 디스크 생성

    저장소 구성(Storage configuration)을 저장할 새 파일을 ClickHouse `config.d` 디렉터리에 만드십시오:

    ```bash theme={null}
    vim /etc/clickhouse-server/config.d/storage_config.xml
    ```

    다음 XML을 새로 만든 파일에 복사한 다음, `BUCKET`, `ACCESS_KEY_ID`, `SECRET_ACCESS_KEY`를 데이터를 저장할 AWS 버킷 정보로 바꾸십시오:

    ```xml theme={null}
    <clickhouse>
      <storage_configuration>
        <disks>
          <s3_disk>
            <type>s3</type>
            <endpoint>$BUCKET</endpoint>
            <access_key_id>$ACCESS_KEY_ID</access_key_id>
            <secret_access_key>$SECRET_ACCESS_KEY</secret_access_key>
            <metadata_path>/var/lib/clickhouse/disks/s3_disk/</metadata_path>
          </s3_disk>
          <s3_cache>
            <type>cache</type>
            <disk>s3_disk</disk>
            <path>/var/lib/clickhouse/disks/s3_cache/</path>
            <max_size>10Gi</max_size>
          </s3_cache>
        </disks>
        <policies>
          <s3_main>
            <volumes>
              <main>
                <disk>s3_disk</disk>
              </main>
            </volumes>
          </s3_main>
        </policies>
      </storage_configuration>
    </clickhouse>
    ```

    S3 디스크의 설정을 더 구체적으로 지정해야 하는 경우(예: `region`을 지정하거나 사용자 지정 HTTP `header`를 보내는 경우) 관련 설정 목록은 [여기](/docs/ko/reference/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-s3)에서 확인할 수 있습니다.

    또한 `access_key_id`와 `secret_access_key` 대신 아래 항목을 사용할 수도 있으며, 이 경우 환경 변수와 Amazon EC2 메타데이터에서 자격 증명을 가져오려고 시도합니다:

    ```bash theme={null}
    <use_environment_credentials>true</use_environment_credentials>
    ```

    설정 파일을 만든 후에는 파일 소유자를 clickhouse 사용자 및 그룹으로 변경해야 합니다:

    ```bash theme={null}
    chown clickhouse:clickhouse /etc/clickhouse-server/config.d/storage_config.xml
    ```

    이제 변경 사항을 적용하려면 ClickHouse 서버를 다시 시작하십시오:

    ```bash theme={null}
    service clickhouse-server restart
    ```
  </Step>

  <Step title="S3 기반 테이블 생성" id="2-create-a-table-backed-by-s3">
    S3 디스크가 올바르게 구성되었는지 확인하려면 테이블을 생성하고 쿼리해 볼 수 있습니다.

    새 S3 스토리지 정책을 지정하여 테이블을 생성하십시오:

    ```sql theme={null}
    CREATE TABLE my_s3_table
      (
        `id` UInt64,
        `column1` String
      )
    ENGINE = MergeTree
    ORDER BY id
    SETTINGS storage_policy = 's3_main';
    ```

    엔진을 `S3BackedMergeTree`로 지정할 필요는 없었다는 점에 유의하십시오. ClickHouse는 테이블이 저장소로 S3를 사용하고 있음을 감지하면 내부적으로 엔진 유형을 자동으로 변환합니다.

    테이블이 올바른 policy로 생성되었는지 확인하십시오:

    ```sql theme={null}
    SHOW CREATE TABLE my_s3_table;
    ```

    다음과 같은 결과가 표시됩니다:

    ```response theme={null}
    ┌─statement────────────────────────────────────────────────────
    │ CREATE TABLE default.my_s3_table
    (
      `id` UInt64,
      `column1` String
    )
    ENGINE = MergeTree
    ORDER BY id
    SETTINGS storage_policy = 's3_main', index_granularity = 8192
    └──────────────────────────────────────────────────────────────
    ```

    이제 새 테이블에 몇 개의 행을 삽입하겠습니다:

    ```sql theme={null}
    INSERT INTO my_s3_table (id, column1)
      VALUES (1, 'abc'), (2, 'xyz');
    ```

    행이 삽입되었는지 확인해 보겠습니다:

    ```sql theme={null}
    SELECT * FROM my_s3_table;
    ```

    ```response theme={null}
    ┌─id─┬─column1─┐
    │  1 │ abc     │
    │  2 │ xyz     │
    └────┴─────────┘

    2 rows in set. Elapsed: 0.284 sec.
    ```

    AWS 콘솔에서 데이터가 S3에 성공적으로 삽입되었다면, 지정한 버킷에 ClickHouse가 새 파일을 생성한 것을 확인할 수 있습니다.

    모든 것이 정상적으로 작동했다면, 이제 저장소와 컴퓨트가 분리된 ClickHouse를 사용하고 있습니다!

    <Image img="https://mintcdn.com/private-7c7dfe99/k4wNHsd_gyvah7Fr/images/guides/s3_bucket_example.webp?fit=max&auto=format&n=k4wNHsd_gyvah7Fr&q=85&s=5125bc42e40bfb41790536f985463ff6" size="md" alt="저장소와 컴퓨트 분리를 사용하는 S3 버킷 예시" border width="1208" height="736" data-path="images/guides/s3_bucket_example.webp" />
  </Step>

  <Step title="장애 허용을 위한 복제 구현(선택 사항)" id="3-implementing-replication-for-fault-tolerance-optional">
    <Warning>
      AWS/GCS 수명 주기 정책은 구성하지 마십시오. 이는 지원되지 않으며 테이블이 손상될 수 있습니다.
    </Warning>

    장애 허용을 위해 여러 AWS 리전에 분산된 여러 ClickHouse 서버 노드를 사용할 수 있으며, 각 노드에 대해 S3 버킷을 하나씩 사용할 수 있습니다.

    S3 디스크를 사용하는 복제는 `ReplicatedMergeTree` 테이블 엔진을 사용해 구현할 수 있습니다. 자세한 내용은 다음 가이드를 참조하십시오:

    * [S3 객체 스토리지를 사용하여 두 AWS 리전에 걸쳐 단일 세그먼트 복제하기](/docs/ko/integrations/connectors/data-ingestion/AWS/integrating-s3-with-clickhouse#s3-multi-region).
  </Step>
</Steps>

<div id="further-reading">
  ## 추가 자료
</div>

* [SharedMergeTree 테이블 엔진](/docs/ko/products/cloud/features/infrastructure/shared-merge-tree)
* [SharedMergeTree 소개 블로그](https://clickhouse.com/blog/clickhouse-cloud-boosts-performance-with-sharedmergetree-and-lightweight-updates)
