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

> Google Cloud Storage (GCS) バックエンドの MergeTree

# Google Cloud Storage と ClickHouse を連携する

export const Image = ({img, alt, size}) => {
  return <Frame>
      <img src={img} alt={alt} />
    </Frame>;
};

<Note>
  [Google Cloud](https://cloud.google.com) 上で ClickHouse Cloud を使用している場合、このページは該当しません。サービスはすでに [Google Cloud Storage](https://cloud.google.com/storage) を使用しているためです。GCS からデータを `SELECT` または `INSERT` したい場合は、[`gcs` テーブル関数](/ja/reference/functions/table-functions/gcs) を参照してください。
</Note>

ClickHouse では、ストレージとコンピュートを分離したい場合、GCS が魅力的なストレージソリューションになると考えています。これを実現できるよう、MergeTree エンジンのストレージとして GCS を使用する機能をサポートしています。これにより、GCS のスケーラビリティとコスト面での利点に加え、MergeTree エンジンの insert とクエリパフォーマンスを活用できます。

<div id="gcs-backed-mergetree">
  ## GCS をバックエンドの MergeTree
</div>

<div id="creating-a-disk">
  ### ディスクの作成
</div>

GCS bucket をディスクとして利用するには、まず `conf.d` 配下のファイルで ClickHouse の設定内に宣言する必要があります。GCS ディスクの宣言例を以下に示します。この設定には、GCS の「ディスク」、cache、および GCS ディスク上に table を作成する際に DDL queries で指定するポリシーを設定するための複数のセクションが含まれています。各セクションについては、以下で説明します。

<div id="storage_configuration--disks--gcs">
  #### ストレージ構成 > disks > gcs
</div>

構成のこの部分はハイライトされたセクションに示されており、次の項目を指定します。

* S3 API を使用するため、ディスクの type は `s3` です。
* GCS が提供するエンドポイント
* サービスアカウントの HMACキーとシークレット
* ローカルディスク上のメタデータパス

```xml highlight={5-10} theme={null}
<clickhouse>
    <storage_configuration>
        <disks>
            <gcs>
                <support_batch_delete>true</support_batch_delete>
                <type>s3</type>
                <endpoint>https://storage.googleapis.com/BUCKET NAME/FOLDER NAME/</endpoint>
                <access_key_id>SERVICE ACCOUNT HMAC KEY</access_key_id>
                <secret_access_key>SERVICE ACCOUNT HMAC SECRET</secret_access_key>
                <metadata_path>/var/lib/clickhouse/disks/gcs/</metadata_path>
            </gcs>
        </disks>
        <policies>
            <gcs_main>
                <volumes>
                    <main>
                        <disk>gcs</disk>
                    </main>
                </volumes>
            </gcs_main>
        </policies>
    </storage_configuration>
</clickhouse>
```

<div id="storage_configuration--disks--cache">
  #### ストレージ構成 > disks > cache
</div>

以下で示す設定例では、ディスク `gcs` に 10Gi のメモリ cache を有効化しています。

```xml highlight={12-17} theme={null}
<clickhouse>
    <storage_configuration>
        <disks>
            <gcs>
                <support_batch_delete>true</support_batch_delete>
                <type>s3</type>
                <endpoint>https://storage.googleapis.com/BUCKET NAME/FOLDER NAME/</endpoint>
                <access_key_id>SERVICE ACCOUNT HMAC KEY</access_key_id>
                <secret_access_key>SERVICE ACCOUNT HMAC SECRET</secret_access_key>
                <metadata_path>/var/lib/clickhouse/disks/gcs/</metadata_path>
            </gcs>
            <gcs_cache>
                <type>cache</type>
                <disk>gcs</disk>
                <path>/var/lib/clickhouse/disks/gcs_cache/</path>
                <max_size>10Gi</max_size>
            </gcs_cache>
        </disks>
        <policies>
            <gcs_main>
                <volumes>
                    <main>
                        <disk>gcs_cache</disk>
                    </main>
                </volumes>
            </gcs_main>
        </policies>
    </storage_configuration>
</clickhouse>
```

<div id="storage_configuration--policies--gcs_main">
  #### ストレージ構成 > policies > gcs\_main
</div>

ストレージ構成ポリシーでは、データの保存先を選択できます。以下で示すポリシーでは、`gcs_main` を指定することで、データをディスク `gcs` に保存できます。たとえば、`CREATE TABLE ... SETTINGS storage_policy='gcs_main'` のように指定します。

```xml highlight={14-20} theme={null}
<clickhouse>
    <storage_configuration>
        <disks>
            <gcs>
                <support_batch_delete>true</support_batch_delete>
                <type>s3</type>
                <endpoint>https://storage.googleapis.com/BUCKET NAME/FOLDER NAME/</endpoint>
                <access_key_id>SERVICE ACCOUNT HMAC KEY</access_key_id>
                <secret_access_key>SERVICE ACCOUNT HMAC SECRET</secret_access_key>
                <metadata_path>/var/lib/clickhouse/disks/gcs/</metadata_path>
            </gcs>
        </disks>
        <policies>
            <gcs_main>
                <volumes>
                    <main>
                        <disk>gcs</disk>
                    </main>
                </volumes>
            </gcs_main>
        </policies>
    </storage_configuration>
</clickhouse>
```

このディスク宣言に関連する設定の一覧は、[こちら](/ja/reference/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-s3)をご覧ください。

<div id="creating-a-table">
  ### テーブルの作成
</div>

書き込み権限のあるバケットを使用するようにディスクを設定していることを前提とすると、以下の例のようなテーブルを作成できます。簡潔にするため、ここでは NYC タクシーのカラムの一部だけを使用し、データを GCS をバックエンドとするテーブルに直接書き込みます。

```sql highlight={20} theme={null}
CREATE TABLE trips_gcs
(
   `trip_id` UInt32,
   `pickup_date` Date,
   `pickup_datetime` DateTime,
   `dropoff_datetime` DateTime,
   `pickup_longitude` Float64,
   `pickup_latitude` Float64,
   `dropoff_longitude` Float64,
   `dropoff_latitude` Float64,
   `passenger_count` UInt8,
   `trip_distance` Float64,
   `tip_amount` Float32,
   `total_amount` Float32,
   `payment_type` Enum8('UNK' = 0, 'CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4)
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(pickup_date)
ORDER BY pickup_datetime
SETTINGS storage_policy='gcs_main'
```

```sql theme={null}
INSERT INTO trips_gcs SELECT trip_id, pickup_date, pickup_datetime, dropoff_datetime, pickup_longitude, pickup_latitude, dropoff_longitude, dropoff_latitude, passenger_count, trip_distance, tip_amount, total_amount, payment_type FROM s3('https://ch-nyc-taxi.s3.eu-west-3.amazonaws.com/tsv/trips_{0..9}.tsv.gz', 'TabSeparatedWithNames') LIMIT 1000000;
```

ハードウェアによっては、後者の100万行の insert の実行に数分かかる場合があります。進捗状況は `system.processes` テーブルで確認できます。行数は上限の1000万まで適宜調整し、いくつかのサンプルクエリを試してみてください。

```sql theme={null}
SELECT passenger_count, avg(tip_amount) AS avg_tip, avg(total_amount) AS avg_amount FROM trips_gcs GROUP BY passenger_count;
```

<div id="handling-replication">
  ### レプリケーションへの対応
</div>

GCS ディスクを使用したレプリケーションは、`ReplicatedMergeTree` テーブルエンジンを使用して実現できます。詳細については、[GCS を使用して 2 つの GCP リージョンにまたがって単一の分片をレプリケートする](#gcs-multi-region) ガイドを参照してください。

<div id="learn-more">
  ### さらに詳しく
</div>

[Cloud ストレージ XML API](https://cloud.google.com/storage/docs/xml-api/overview) は、Amazon Simple Storage Service (Amazon S3) などのサービスで動作する一部のツールやライブラリとの互換性があります。

スレッドの調整について詳しくは、[パフォーマンスの最適化](/ja/integrations/connectors/data-ingestion/AWS/integrating-s3-with-clickhouse#s3-optimizing-performance) を参照してください。

<div id="gcs-multi-region">
  ## Google Cloud Storage (GCS) を使用する
</div>

<Tip>
  ClickHouse Cloud ではデフォルトでオブジェクトストレージが使用されるため、ClickHouse Cloud を使用している場合はこの手順に従う必要はありません。
</Tip>

<div id="plan-the-deployment">
  ### デプロイメントを計画する
</div>

このチュートリアルでは、Google Cloud 上で稼働し、ClickHouse のストレージディスクの「type」として Google Cloud Storage (GCS) を使用する、レプリケーション構成の ClickHouse デプロイメントについて説明します。

このチュートリアルでは、Google Cloud Engine VM に ClickHouse サーバー ノードをデプロイし、各ノードに対応する GCS バケットをストレージとして関連付けます。レプリケーションは、同じく VM としてデプロイされた一連の ClickHouse Keeper ノードによって調整されます。

高可用性の要件例:

* 2 つの GCP リージョンに 2 つの ClickHouse サーバー ノード
* 2 つの GCS バケット。2 つの ClickHouse サーバー ノードと同じリージョンにデプロイ
* 3 つの ClickHouse Keeper ノード。このうち 2 つは ClickHouse サーバー ノードと同じリージョンにデプロイします。3 つ目は最初の 2 つの Keeper ノードのいずれかと同じリージョンでもかまいませんが、可用性ゾーンは別にする必要があります。

ClickHouse Keeper が機能するには 2 ノード必要なため、高可用性を確保するには 3 ノード必要です。

<div id="prepare-vms">
  ### 仮想マシンを準備する
</div>

3 つのリージョンに 5 台の VM をデプロイします。

| Region | ClickHouse Server | Bucket              | ClickHouse Keeper |
| ------ | ----------------- | ------------------- | ----------------- |
| 1      | `chnode1`         | `bucket_regionname` | `keepernode1`     |
| 2      | `chnode2`         | `bucket_regionname` | `keepernode2`     |
| 3 `*`  |                   |                     | `keepernode3`     |

`*` これは、1 または 2 と同じリージョン内の別のアベイラビリティゾーンにすることも可能です。

<div id="deploy-clickhouse">
  #### ClickHouseをデプロイ
</div>

2台のホストにClickHouseをデプロイします。サンプル構成では、これらのホストの名前は `chnode1`、`chnode2` です。

`chnode1` は1つ目の GCP リージョンに、`chnode2` は2つ目のリージョンに配置します。このガイドでは、Compute Engine の VM と GCS バケットの両方に `us-east1` と `us-east4` を使用します。

<Note>
  `clickhouse server` は設定が完了するまで起動しないでください。インストールだけを行ってください。
</Note>

ClickHouse サーバーノードでデプロイ手順を実行する際は、[インストール手順](/ja/get-started/setup/install)を参照してください。

<div id="deploy-clickhouse-keeper">
  #### ClickHouse Keeper をデプロイする
</div>

3 台のホストに ClickHouse Keeper をデプロイします。サンプル構成では、これらのホストは `keepernode1`、`keepernode2`、`keepernode3` という名前です。`keepernode1` は `chnode1` と同じリージョンに、`keepernode2` は `chnode2` と同じリージョンにデプロイできます。`keepernode3` はどちらのリージョンにもデプロイできますが、そのリージョン内の ClickHouse ノードとは異なるアベイラビリティゾーンに配置する必要があります。

ClickHouse Keeper ノードでデプロイ手順を実施する際は、[インストール手順](/ja/get-started/setup/install)を参照してください。

<div id="create-two-buckets">
  ### 2 つのバケットを作成する
</div>

高可用性のため、2 台の ClickHouseサーバーは異なるリージョンに配置します。各サーバーには、同じリージョン内に GCS バケットが 1 つ必要です。

**Cloud Storage > Buckets** で **CREATE BUCKET** を選択します。このチュートリアルでは、`us-east1` と `us-east4` にそれぞれ 1 つずつ、合計 2 つのバケットを作成します。バケットは単一リージョン、Standard ストレージクラス、非公開に設定します。求められたら、公開アクセス防止を有効にしてください。フォルダは作成しないでください。ClickHouse がストレージに書き込むときに作成されます。

バケットと HMAC キーの作成手順を順を追って確認したい場合は、**Create GCS buckets and an HMAC key** を展開して、その手順に従ってください。

<Accordion title="GCS バケットと HMAC キーを作成する">
  ### ch\_bucket\_us\_east1

  <Image size="md" img="https://mintcdn.com/private-7c7dfe99-mintlify-fbfa8bee/ysNmqKfMa0gVKvYj/images/integrations/data-ingestion/s3/GCS-bucket-1.png?fit=max&auto=format&n=ysNmqKfMa0gVKvYj&q=85&s=27b3795ec2c474f21115db86517d7c94" alt="US East 1 で GCS バケットを作成する" border width="1437" height="387" data-path="images/integrations/data-ingestion/s3/GCS-bucket-1.png" />

  ### ch\_bucket\_us\_east4

  <Image size="md" img="https://mintcdn.com/private-7c7dfe99-mintlify-fbfa8bee/ysNmqKfMa0gVKvYj/images/integrations/data-ingestion/s3/GCS-bucket-2.png?fit=max&auto=format&n=ysNmqKfMa0gVKvYj&q=85&s=a529210c01f0debd00d2dc188d2ac502" alt="US East 4 で GCS バケットを作成する" border width="1437" height="386" data-path="images/integrations/data-ingestion/s3/GCS-bucket-2.png" />

  ### アクセスキーを生成する

  ### サービス アカウントの HMAC キーとシークレットを作成する

  **Cloud Storage > Settings > Interoperability** を開き、既存の **Access key** を選択するか、**CREATE A KEY FOR A SERVICE ACCOUNT** を選択します。このガイドでは、新しいサービス アカウント用に新しいキーを作成する手順を説明します。

  <Image size="md" img="https://mintcdn.com/private-7c7dfe99-mintlify-fbfa8bee/ysNmqKfMa0gVKvYj/images/integrations/data-ingestion/s3/GCS-create-a-service-account-key.png?fit=max&auto=format&n=ysNmqKfMa0gVKvYj&q=85&s=c4d60f90c6ac63adf42c0d5b9e46a326" alt="GCS でサービス アカウントの HMAC キーを生成する" border width="969" height="911" data-path="images/integrations/data-ingestion/s3/GCS-create-a-service-account-key.png" />

  ### 新しいサービス アカウントを追加する

  既存のサービス アカウントがないプロジェクトの場合は、**CREATE NEW ACCOUNT** を選択します。

  <Image size="md" img="https://mintcdn.com/private-7c7dfe99-mintlify-fbfa8bee/ysNmqKfMa0gVKvYj/images/integrations/data-ingestion/s3/GCS-create-service-account-0.png?fit=max&auto=format&n=ysNmqKfMa0gVKvYj&q=85&s=5532ca2ab7181e65069c23c7ad0ace77" alt="GCS で新しいサービス アカウントを追加する" border width="924" height="317" data-path="images/integrations/data-ingestion/s3/GCS-create-service-account-0.png" />

  サービス アカウントの作成は 3 つの手順で行います。最初の手順では、アカウントにわかりやすい名前、ID、説明を設定します。

  <Image size="md" img="https://mintcdn.com/private-7c7dfe99-mintlify-fbfa8bee/ysNmqKfMa0gVKvYj/images/integrations/data-ingestion/s3/GCS-create-service-account-a.png?fit=max&auto=format&n=ysNmqKfMa0gVKvYj&q=85&s=4ec5be0e99acbf2d2bed9f9e4cad3a95" alt="GCS で新しいサービス アカウントの名前と ID を定義する" border width="842" height="737" data-path="images/integrations/data-ingestion/s3/GCS-create-service-account-a.png" />

  Interoperability の設定ダイアログでは、IAM role **Storage Object Admin** を使用することを推奨します。2 番目の手順でこのロールを選択してください。

  <Image size="md" img="https://mintcdn.com/private-7c7dfe99-mintlify-fbfa8bee/ysNmqKfMa0gVKvYj/images/integrations/data-ingestion/s3/GCS-create-service-account-2.png?fit=max&auto=format&n=ysNmqKfMa0gVKvYj&q=85&s=99f98f7f2684736aa2181191b44cc4c0" alt="GCS で IAM role Storage Object Admin を選択する" border width="822" height="396" data-path="images/integrations/data-ingestion/s3/GCS-create-service-account-2.png" />

  3 番目の手順は任意であり、このガイドでは使用しません。ポリシーに応じて、ユーザーにこれらの権限を付与できます。

  <Image size="md" img="https://mintcdn.com/private-7c7dfe99-mintlify-fbfa8bee/ysNmqKfMa0gVKvYj/images/integrations/data-ingestion/s3/GCS-create-service-account-3.png?fit=max&auto=format&n=ysNmqKfMa0gVKvYj&q=85&s=97534c90225ce94557ea1ea97bc57ec7" alt="GCS で新しいサービス アカウントの追加設定を構成する" border width="635" height="697" data-path="images/integrations/data-ingestion/s3/GCS-create-service-account-3.png" />

  サービス アカウントの HMAC キーが表示されます。この情報は ClickHouse の設定で使用するため、保存しておいてください。

  <Image size="md" img="https://mintcdn.com/private-7c7dfe99-mintlify-fbfa8bee/5u7Mhe0xzzPTUaXM/images/integrations/data-ingestion/s3/GCS-guide-key.png?fit=max&auto=format&n=5u7Mhe0xzzPTUaXM&q=85&s=898ccd9ed73756ff5cd39843eb29eeaa" alt="GCS 用に生成された HMAC キーを取得する" border width="917" height="390" data-path="images/integrations/data-ingestion/s3/GCS-guide-key.png" />
</Accordion>

<div id="configure-clickhouse-keeper">
  ### ClickHouse Keeper を設定する
</div>

すべての ClickHouse Keeper ノードは、`server_id` の行 (以下で最初にハイライトされている行) を除き、同じ設定ファイルを使用します。ファイル内のホスト名を使用環境の ClickHouse Keeper サーバーのものに置き換え、各サーバーで `server_id` が `raft_configuration` 内の対応する `server` エントリに一致するよう設定してください。この例では `server_id` が `3` に設定されているため、`raft_configuration` 内の対応する行をハイライトしています。

* ファイル内のホスト名を実際のものに置き換え、それらが ClickHouse サーバー ノードおよび Keeper ノードから名前解決できることを確認してください
* ファイルを所定の場所にコピーしてください (各 Keeper サーバーでは `/etc/clickhouse-keeper/keeper_config.xml`)
* 各マシンで、`raft_configuration` 内のエントリ番号に基づいて `server_id` を編集してください

```xml title=/etc/clickhouse-keeper/keeper_config.xml highlight={12,33-37} theme={null}
<clickhouse>
    <logger>
        <level>trace</level>
        <log>/var/log/clickhouse-keeper/clickhouse-keeper.log</log>
        <errorlog>/var/log/clickhouse-keeper/clickhouse-keeper.err.log</errorlog>
        <size>1000M</size>
        <count>3</count>
    </logger>
    <listen_host>0.0.0.0</listen_host>
    <keeper_server>
        <tcp_port>9181</tcp_port>
        <server_id>3</server_id>
        <log_storage_path>/var/lib/clickhouse/coordination/log</log_storage_path>
        <snapshot_storage_path>/var/lib/clickhouse/coordination/snapshots</snapshot_storage_path>

        <coordination_settings>
            <operation_timeout_ms>10000</operation_timeout_ms>
            <session_timeout_ms>30000</session_timeout_ms>
            <raft_logs_level>warning</raft_logs_level>
        </coordination_settings>

        <raft_configuration>
            <server>
                <id>1</id>
                <hostname>keepernode1.us-east1-b.c.clickhousegcs-374921.internal</hostname>
                <port>9234</port>
            </server>
            <server>
                <id>2</id>
                <hostname>keepernode2.us-east4-c.c.clickhousegcs-374921.internal</hostname>
                <port>9234</port>
            </server>
            <server>
                <id>3</id>
                <hostname>keepernode3.us-east5-a.c.clickhousegcs-374921.internal</hostname>
                <port>9234</port>
            </server>
        </raft_configuration>
    </keeper_server>
</clickhouse>
```

<div id="configure-clickhouse-server">
  ### ClickHouse server の設定
</div>

<Info>
  **ベストプラクティス**

  このガイドの一部の手順では、設定ファイルを `/etc/clickhouse-server/config.d/` に配置する必要があります。これは、Linux システムで設定の上書きファイルを配置する既定の場所です。これらのファイルをこのディレクトリに配置すると、ClickHouse はその内容をデフォルト設定にマージします。これらのファイルを `config.d` ディレクトリに配置しておけば、アップグレード時に設定が失われるのを防げます。
</Info>

<div id="networking">
  #### ネットワーク
</div>

デフォルトでは、ClickHouse はループバックインターフェイスで待ち受けます。レプリケーション構成では、マシン間のネットワーク接続が必要です。すべてのインターフェイスで待ち受けるようにします。

```xml title=/etc/clickhouse-server/config.d/network.xml theme={null}
<clickhouse>
    <listen_host>0.0.0.0</listen_host>
</clickhouse>
```

<div id="remote-clickhouse-keeper-servers">
  #### リモート ClickHouse Keeper サーバー
</div>

レプリケーションは ClickHouse Keeper によって管理されます。この設定ファイルでは、ホスト名とポート番号で ClickHouse Keeper ノードを指定します。

* ホスト名を使用する Keeper ホストに合わせて編集します

```xml title=/etc/clickhouse-server/config.d/use-keeper.xml theme={null}
<clickhouse>
    <zookeeper>
        <node index="1">
            <host>keepernode1.us-east1-b.c.clickhousegcs-374921.internal</host>
            <port>9181</port>
        </node>
        <node index="2">
            <host>keepernode2.us-east4-c.c.clickhousegcs-374921.internal</host>
            <port>9181</port>
        </node>
        <node index="3">
            <host>keepernode3.us-east5-a.c.clickhousegcs-374921.internal</host>
            <port>9181</port>
        </node>
    </zookeeper>
</clickhouse>
```

<div id="remote-clickhouse-servers">
  #### リモート ClickHouse サーバー
</div>

このファイルでは、クラスター内の各 ClickHouse サーバーのホスト名とポートを設定します。デフォルトの設定ファイルにはサンプルのクラスター定義が含まれているため、完全に設定されたクラスターだけを表示するには、`remote_servers` エントリに `replace="true"` タグを追加します。これにより、この設定をデフォルト設定とマージした際、`remote_servers` セクションに追記するのではなく、そのセクション全体を置き換えるようになります。

* ホスト名に合わせてファイルを編集し、それらが ClickHouse サーバーノードから名前解決できることを確認してください

```xml title=/etc/clickhouse-server/config.d/remote-servers.xml theme={null}
<clickhouse>
    <remote_servers replace="true">
        <cluster_1S_2R>
            <shard>
                <replica>
                    <host>chnode1.us-east1-b.c.clickhousegcs-374921.internal</host>
                    <port>9000</port>
                </replica>
                <replica>
                    <host>chnode2.us-east4-c.c.clickhousegcs-374921.internal</host>
                    <port>9000</port>
                </replica>
            </shard>
        </cluster_1S_2R>
    </remote_servers>
</clickhouse>
```

<div id="replica-identification">
  #### レプリカの識別
</div>

このファイルでは、ClickHouse Keeper の path に関連する設定を行います。具体的には、データがどのレプリカに属しているかを識別するためのマクロを設定します。片方のサーバーではレプリカを `replica_1`、もう片方のサーバーでは `replica_2` と指定する必要があります。名前は変更可能です。たとえば、一方のレプリカを South Carolina に、もう一方を Northern Virginia に保存する場合、値は `carolina` と `virginia` にできます。ただし、各マシンで異なる名前を指定してください。

```xml title=/etc/clickhouse-server/config.d/macros.xml highlight={8} theme={null}
<clickhouse>
    <distributed_ddl>
            <path>/clickhouse/task_queue/ddl</path>
    </distributed_ddl>
    <macros>
        <cluster>cluster_1S_2R</cluster>
        <shard>1</shard>
        <replica>replica_1</replica>
    </macros>
</clickhouse>
```

<div id="storage-in-gcs">
  #### GCS のストレージ
</div>

ClickHouse のストレージ構成には `disks` と `policies` が含まれます。以下で構成するディスクは `gcs` という名前で、`type` は `s3` です。`type` が `s3` なのは、ClickHouse が GCS バケットを AWS S3 バケットのように扱ってアクセスするためです。この構成は 2 つ必要で、それぞれの ClickHouse サーバー ノードに 1 つずつ配置します。

以下の構成では、次の置換を行ってください。

これらの置換は、2 つの ClickHouse サーバー ノードで異なります。

* `REPLICA 1 BUCKET` は、server と同じリージョンにあるバケット名に設定してください
* `REPLICA 1 FOLDER` は、一方の server では `replica_1` に、もう一方では `replica_2` に変更してください

次の置換は 2 つのノードで共通です。

* `access_key_id` は、先ほど生成した HMAC Key に設定してください
* `secret_access_key` は、先ほど生成した HMAC Secret に設定してください

```xml title=/etc/clickhouse-server/config.d/storage.xml theme={null}
<clickhouse>
    <storage_configuration>
        <disks>
            <gcs>
                <support_batch_delete>true</support_batch_delete>
                <type>s3</type>
                <endpoint>https://storage.googleapis.com/REPLICA 1 BUCKET/REPLICA 1 FOLDER/</endpoint>
                <access_key_id>SERVICE ACCOUNT HMAC KEY</access_key_id>
                <secret_access_key>SERVICE ACCOUNT HMAC SECRET</secret_access_key>
                <metadata_path>/var/lib/clickhouse/disks/gcs/</metadata_path>
            </gcs>
            <cache>
                <type>cache</type>
                <disk>gcs</disk>
                <path>/var/lib/clickhouse/disks/gcs_cache/</path>
                <max_size>10Gi</max_size>
            </cache>
        </disks>
        <policies>
            <gcs_main>
                <volumes>
                    <main>
                        <disk>gcs</disk>
                    </main>
                </volumes>
            </gcs_main>
        </policies>
    </storage_configuration>
</clickhouse>
```

<div id="start-clickhouse-keeper">
  ### ClickHouse Keeper を起動する
</div>

ご利用のオペレーティングシステムに応じたコマンドを使用してください。たとえば次のとおりです。

```bash theme={null}
sudo systemctl enable clickhouse-keeper
sudo systemctl start clickhouse-keeper
sudo systemctl status clickhouse-keeper
```

<div id="check-clickhouse-keeper-status">
  #### ClickHouse Keeper のステータスを確認する
</div>

`netcat` を使って ClickHouse Keeper にコマンドを送信します。たとえば、`mntr` は ClickHouse Keeper クラスターの状態を返します。各 Keeper ノードでこのコマンドを実行すると、1 つが leader、残り 2 つが followers であることを確認できます。

```bash theme={null}
echo mntr | nc localhost 9181
```

```response highlight={7-9,18-19} theme={null}
zk_version      v22.7.2.15-stable-f843089624e8dd3ff7927b8a125cf3a7a769c069
zk_avg_latency  0
zk_max_latency  11
zk_min_latency  0
zk_packets_received     1783
zk_packets_sent 1783
zk_num_alive_connections        2
zk_outstanding_requests 0
zk_server_state leader
zk_znode_count  135
zk_watch_count  8
zk_ephemerals_count     3
zk_approximate_data_size        42533
zk_key_arena_size       28672
zk_latest_snapshot_size 0
zk_open_file_descriptor_count   182
zk_max_file_descriptor_count    18446744073709551615
zk_followers    2
zk_synced_followers     2
```

<div id="start-clickhouse-server">
  ### ClickHouseサーバーを起動する
</div>

`chnode1` と `chnode` で次を実行します:

```bash theme={null}
sudo service clickhouse-server start
```

```bash theme={null}
sudo service clickhouse-server status
```

<div id="verification">
  ### 確認
</div>

<div id="verify-disk-configuration">
  #### ディスク設定を確認する
</div>

`system.disks` には、各ディスクのレコードが含まれているはずです。

* default
* gcs
* cache

```sql theme={null}
SELECT *
FROM system.disks
FORMAT Vertical
```

```response theme={null}
Row 1:
──────
name:             cache
path:             /var/lib/clickhouse/disks/gcs/
free_space:       18446744073709551615
total_space:      18446744073709551615
unreserved_space: 18446744073709551615
keep_free_space:  0
type:             s3
is_encrypted:     0
is_read_only:     0
is_write_once:    0
is_remote:        1
is_broken:        0
cache_path:       /var/lib/clickhouse/disks/gcs_cache/

Row 2:
──────
name:             default
path:             /var/lib/clickhouse/
free_space:       6555529216
total_space:      10331889664
unreserved_space: 6555529216
keep_free_space:  0
type:             local
is_encrypted:     0
is_read_only:     0
is_write_once:    0
is_remote:        0
is_broken:        0
cache_path:

Row 3:
──────
name:             gcs
path:             /var/lib/clickhouse/disks/gcs/
free_space:       18446744073709551615
total_space:      18446744073709551615
unreserved_space: 18446744073709551615
keep_free_space:  0
type:             s3
is_encrypted:     0
is_read_only:     0
is_write_once:    0
is_remote:        1
is_broken:        0
cache_path:

3 rows in set. Elapsed: 0.002 sec.
```

<div id="verify-that-tables-created-on-the-cluster-are-created-on-both-nodes">
  #### クラスターで作成したテーブルが両方のノードに作成されていることを確認する
</div>

```sql highlight={1,18} theme={null}
create table trips on cluster 'cluster_1S_2R' (
 `trip_id` UInt32,
 `pickup_date` Date,
 `pickup_datetime` DateTime,
 `dropoff_datetime` DateTime,
 `pickup_longitude` Float64,
 `pickup_latitude` Float64,
 `dropoff_longitude` Float64,
 `dropoff_latitude` Float64,
 `passenger_count` UInt8,
 `trip_distance` Float64,
 `tip_amount` Float32,
 `total_amount` Float32,
 `payment_type` Enum8('UNK' = 0, 'CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4))
ENGINE = ReplicatedMergeTree
PARTITION BY toYYYYMM(pickup_date)
ORDER BY pickup_datetime
SETTINGS storage_policy='gcs_main'
```

```response theme={null}
┌─host───────────────────────────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ chnode2.us-east4-c.c.gcsqa-375100.internal │ 9000 │      0 │       │                   1 │                1 │
└────────────────────────────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘
┌─host───────────────────────────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ chnode1.us-east1-b.c.gcsqa-375100.internal │ 9000 │      0 │       │                   0 │                0 │
└────────────────────────────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘

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

<div id="verify-that-data-can-be-inserted">
  #### データを挿入できることを確認する
</div>

```sql theme={null}
INSERT INTO trips SELECT
    trip_id,
    pickup_date,
    pickup_datetime,
    dropoff_datetime,
    pickup_longitude,
    pickup_latitude,
    dropoff_longitude,
    dropoff_latitude,
    passenger_count,
    trip_distance,
    tip_amount,
    total_amount,
    payment_type
FROM s3('https://ch-nyc-taxi.s3.eu-west-3.amazonaws.com/tsv/trips_{0..9}.tsv.gz', 'TabSeparatedWithNames')
LIMIT 1000000
```

<div id="verify-that-the-storage-policy-gcs_main-is-used-for-the-table">
  #### テーブルでストレージポリシー `gcs_main` が使用されていることを確認します。
</div>

```sql theme={null}
SELECT
    engine,
    data_paths,
    metadata_path,
    storage_policy,
    formatReadableSize(total_bytes)
FROM system.tables
WHERE name = 'trips'
FORMAT Vertical
```

```response theme={null}
Row 1:
──────
engine:                          ReplicatedMergeTree
data_paths:                      ['/var/lib/clickhouse/disks/gcs/store/631/6315b109-d639-4214-a1e7-afbd98f39727/']
metadata_path:                   /var/lib/clickhouse/store/e0f/e0f3e248-7996-44d4-853e-0384e153b740/trips.sql
storage_policy:                  gcs_main
formatReadableSize(total_bytes): 36.42 MiB

1 row in set. Elapsed: 0.002 sec.
```

<div id="verify-in-google-cloud-console">
  #### Google Cloud Console で確認する
</div>

バケットを見ると、各バケットに `storage.xml` の設定ファイルで使用した名前のフォルダが作成されていることがわかります。フォルダを展開すると、データのパーティションを表す多数のファイルが表示されます。

<div id="bucket-for-replica-one">
  #### レプリカ1用のバケット
</div>

<Image img="https://mintcdn.com/private-7c7dfe99-mintlify-fbfa8bee/ysNmqKfMa0gVKvYj/images/integrations/data-ingestion/s3/GCS-examine-bucket-1.png?fit=max&auto=format&n=ysNmqKfMa0gVKvYj&q=85&s=aae0ab212beb28ec1a27503abff20f1e" size="lg" border alt="データパーティションを含むフォルダ構造が表示された Google Cloud Storage 内のレプリカ1用バケット" width="958" height="736" data-path="images/integrations/data-ingestion/s3/GCS-examine-bucket-1.png" />

<div id="bucket-for-replica-two">
  #### レプリカ2用のバケット
</div>

<Image img="https://mintcdn.com/private-7c7dfe99-mintlify-fbfa8bee/5u7Mhe0xzzPTUaXM/images/integrations/data-ingestion/s3/GCS-examine-bucket-2.png?fit=max&auto=format&n=5u7Mhe0xzzPTUaXM&q=85&s=2bd6dabb699bd88ded113cc554f6888b" size="lg" border alt="データパーティションを含むフォルダ構造が表示された Google Cloud Storage 内のレプリカ2のバケット" width="958" height="736" data-path="images/integrations/data-ingestion/s3/GCS-examine-bucket-2.png" />
