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

# レプリカ対応ルーティング

> 一時テーブル、セッション、cacheの再利用、書き込み後の読み取り整合性のため、関連するリクエストを同じClickHouse Cloudレプリカにルーティングします

export const EnterprisePlanFeatureBadge = ({feature = 'この機能', support = false, linking_verb_are = false}) => {
  return <div className="enterprisePlanFeatureContainer">
            <div className="enterprisePlanFeatureBadge">
                Enterpriseプランの機能
            </div>
            <div>
                <p>{feature} {linking_verb_are ? 'は' : 'は'} Enterpriseプランで利用できます。{support ? `この機能を有効にするには、サポートにお問い合わせください。` : 'アップグレードするには、Cloud Console のプランページにアクセスしてください。'}</p>
            </div>
        </div>;
};

export const BetaBadge = ({link, galaxyTrack, galaxyEvent}) => {
  if (link) {
    return <a href={link} target="_blank" rel="noopener noreferrer" className="betaBadge" onClick={galaxyTrack && galaxyEvent ? galaxyOnClick(galaxyEvent) : undefined}>
                <span>ベータ</span>
            </a>;
  }
  return <a href="https://clickhouse.com/docs/reference/settings/beta-and-experimental-features#beta-features" className="betaBadge">
            <span>ベータ機能</span>
        </a>;
};

<BetaBadge />

<EnterprisePlanFeatureBadge feature="レプリカ対応ルーティング" />

レプリカ対応ルーティング (sticky sessions、スティッキールーティング、session affinity とも呼ばれます) は、関連するリクエストを同じ ClickHouse レプリカに振り分けます。[一時テーブル](/ja/reference/statements/create/table/temporary-table)や[名前付きセッション状態](/ja/concepts/features/interfaces/http#using-clickhouse-sessions-in-the-http-protocol)をクエリ間で利用可能な状態に保つ必要がある場合、関連するクエリで同じレプリカのローカル cache を再利用する場合、または書き込みとその後の読み取りで[書き込み後の読み取り整合性](#read-after-write-consistency)が必要な場合に使用します。

これはベストエフォートであり、分離は保証されません。プロキシ は各ルーティング値を 1 つのレプリカにマッピングします。レプリカ数が変わらない限り、このマッピングは安定していますが、サービス をスケーリングすると、その値が別のレプリカにマッピングされる可能性があります。

レプリカ対応ルーティングは、次の両方のインターフェイスで利用できます。

* [HTTP/HTTPS](#http-based-routing) 経由 (`X-ClickHouse-Replica-Tag` ヘッダーを使用) 。
* [ネイティブプロトコル](#native-protocol-routing) 経由 (TLS Server Name Indication (SNI) の override を使用) 。

どちらも個別に有効化され、プロキシ の背後で同じ 一貫性ハッシュ を使用します。

<h2 id="prerequisites">
  前提条件
</h2>

* ご利用のサービスには **2 つ以上のレプリカ** が必要です。単一レプリカのサービスでは、固定先となるレプリカがありません。
* **Enterprise** tier のサービスであること。
* 標準の ClickHouse Cloud サービスおよび [BYOC](/ja/products/cloud/guides/infrastructure/deployment-options/byoc/overview) でサポートされています

<h2 id="configuring-replica-aware-routing">
  レプリカ対応ルーティングの設定
</h2>

Enterprise のお客様は、ClickHouse Cloud コンソールのサービス設定ページからレプリカ対応ルーティングを有効化できます。対象のサービスを開き、**Settings** に移動して、利用したいインターフェイスのトグルをオンにしてください。

* 一方のトグルは、`X-ClickHouse-Replica-Tag` ヘッダーを用いた HTTP ベースのルーティングを有効にします。
* もう一方のトグルは、SNI オーバーライド を用いたネイティブプロトコルのルーティングを有効にします。

いずれか一方でも、両方でも有効にできます。再起動は不要で、反映までにかかる時間は 1 分未満です。

これらのトグルは Enterprise tier のプランへ順次展開されています。お使いのサービスでまだ利用できない場合は、サービス ID を添えて [サポート](https://clickhouse.com/support/program) チケットを起票いただければ、早期に機能を有効化できます。

<h2 id="http-based-routing">
  HTTP ベースのルーティング
</h2>

ワークロードを特定のレプリカに固定するには、[HTTPS インターフェイス](/ja/concepts/features/interfaces/http)経由のリクエストに `X-ClickHouse-Replica-Tag` ヘッダーを付加します。プロキシはヘッダー値に対して一貫性ハッシュを使用するため、レプリカ数が変わらない限り、同じ値を持つリクエストは同じレプリカに送られます。異なる値はそれぞれ独立してハッシュ化され、同じレプリカまたは別のレプリカに送られる可能性がありますが、値をどのレプリカにマッピングするかを指定することはできません。

既存のサービスホスト名を使用してください。特別な sticky ホスト名や DNS の変更は必要ありません。ヘッダー値には、アプリケーション名、ユーザー ID、ワークロードラベルなど、任意の文字列を指定できます。ヘッダーのないリクエストには、通常の負荷分散が適用されます。

各リクエストに `X-ClickHouse-Replica-Tag` ヘッダーを設定します。

```bash theme={null}
echo 'SELECT hostName()' | curl \
  -H 'X-ClickHouse-Replica-Tag: my-workload-1' \
  -H 'X-ClickHouse-User: default' \
  -H 'X-ClickHouse-Key: <password>' \
  'https://<host>:8443/' -d @-
```

clickhouse-go (v2) では、`Protocol: clickhouse.HTTP` を設定し、[`HttpHeaders` 接続オプション](/ja/integrations/language-clients/go/configuration#connection-settings)を使用してヘッダーを渡します。

<Info>
  `X-ClickHouse-Replica-Tag` を使用すると、ClickHouse HTTP セッションを作成せずにレプリカアフィニティを実現できます。同時実行リクエストでも、`SESSION_IS_LOCKED` を発生させることなく同じタグを再利用できます。
</Info>

<h2 id="native-protocol-routing">
  ネイティブプロトコルでのルーティング
</h2>

[ネイティブプロトコル](/ja/interfaces/tcp)を使用する場合は、ルーティング値を `<routing-value>.sticky.<host>` という形式の TLS サーバー名として渡します。接続先には、通常どおりサービスホスト名を指定します。[ClickHouse Client](/ja/interfaces/client) では、`--tls-sni-override` でルーティング値を指定します:

```bash theme={null}
clickhouse client \
  --host <host> \
  --secure \
  --tls-sni-override my-workload-1.sticky.<host> \
  --query 'SELECT hostName()'
```

`--host` には通常のサービスホスト名を指定し、`--secure` で TLS を有効化し、`--tls-sni-override` でルーティング値を渡します。TLS は必須です。追加の証明書や DNS エントリは不要です。

<h2 id="read-after-write-consistency">
  書き込み後の読み取り整合性
</h2>

マルチレプリカの service では、あるレプリカへの書き込みが、レプリケーションが追いつくまで他のレプリカから見えないことがあります。書き込み時に routing value を指定し、後続の読み取りでも同じ値を再利用してください。proxy が両方を同じレプリカにルーティングするため、他のレプリカがまだ追いついていない状態でも、自身の書き込みを読み取れます。このパターンは、書き込んだ直後に同じデータを読み返すワークロード、たとえばインタラクティブなアプリケーションや、次の処理に進む前に insert を検証する ETL ジョブに適しています。

また、スキーマ変更がまだレプリケーションされていない場合にも有効です。routing value を再利用すれば、新しいスキーマをすでに持つレプリカに insert し続けられるためです。

HTTP 経由では、ヘッダー値を再利用します:

```bash theme={null}
# Write, tagged with a routing value
echo "INSERT INTO events VALUES (now(), 'signup')" | curl \
  -H 'X-ClickHouse-Replica-Tag: my-workload-1' \
  -H 'X-ClickHouse-User: default' \
  -H 'X-ClickHouse-Key: <password>' \
  'https://<host>:8443/' -d @-

# Read it back on the same replica, using the same value
echo 'SELECT count() FROM events' | curl \
  -H 'X-ClickHouse-Replica-Tag: my-workload-1' \
  -H 'X-ClickHouse-User: default' \
  -H 'X-ClickHouse-Key: <password>' \
  'https://<host>:8443/' -d @-
```

ネイティブプロトコル経由の場合は、同じ SNI オーバーライドを再利用します。

```bash theme={null}
# Write with a routing value
clickhouse client \
  --host <host> \
  --secure \
  --tls-sni-override my-workload-1.sticky.<host> \
  --query "INSERT INTO events VALUES (now(), 'signup')"

# Read it back on the same replica, using the same value
clickhouse client \
  --host <host> \
  --secure \
  --tls-sni-override my-workload-1.sticky.<host> \
  --query 'SELECT count() FROM events'
```

すべてのレプリカにわたるより広範な保証が必要な場合は、ClickHouse Cloud で [`select_sequential_consistency`](/ja/reference/settings/session-settings#select_sequential_consistency) を `1` に設定することもできます。

<h2 id="check-which-replica">
  接続先のレプリカを確認する
</h2>

同じ routing value を使用して、`SELECT hostName()` の例のいずれかを再度実行します。レプリカ数が変わらない限り、同じホスト名が返されるはずです。異なる routing value は、別のレプリカにマッピングされる場合があります。

<h2 id="limitations-of-replica-aware-routing">
  レプリカ対応ルーティングの制約事項
</h2>

<h3 id="replica-aware-routing-does-not-guarantee-isolation">
  レプリカ数の変更によりスティッキー性が変化します
</h3>

スケールアウト/スケールインにより、ルーティングのハッシュリングが変化します。その結果、同じ routing value を共有するリクエストが別のレプリカに振り分けられる場合があります。一時テーブルやセッションレベルの設定に依存している場合は、再マップ後にそれらを再作成できるようにしておいてください。`SELECT hostName()` を実行すれば、現在どのレプリカに接続しているかを常に確認できます。

<h3 id="not-workload-isolation">
  レプリカ対応ルーティングはワークロードの分離ではありません
</h3>

スティッキールーティングで制御できるのは、どのレプリカがリクエストを処理するかだけです。そのレプリカは、引き続きほかのトラフィックも処理する可能性があります。専用のコンピュートが必要な場合は、[コンピュート-コンピュート分離](/ja/products/cloud/features/infrastructure/warehouses)を使用してください。

<h3 id="private-networking">
  プライベートネットワーキング
</h3>

HTTP ベースのルーティングとネイティブプロトコルのルーティングはいずれも、通常のサービスホスト名で[プライベートネットワーキング](/ja/products/cloud/guides/security/connectivity/private-networking)を使用する場合は動作します。追加の DNS エントリは必要ありません。

<h3 id="native-protocol-routing-requires-tls">
  ネイティブプロトコルのルーティングには TLS が必要
</h3>

ネイティブプロトコルのルーティングには TLS が必要なため、`--secure` を指定してください。暗号化されていないネイティブ接続の場合は、通常の負荷分散が使用されます。

<h2 id="troubleshooting">
  トラブルシューティング
</h2>

**同じルーティング値を使用しているにもかかわらず、クエリが異なるレプリカに送信される**

* 使用しているインターフェイスのトグルが、サービス設定ページで有効になっていることを確認してください。HTTP とネイティブの各メソッドは個別に有効化します。
* HTTP 経由の場合、すべてのリクエストに `X-ClickHouse-Replica-Tag` ヘッダーが含まれ、すべてのリクエストで完全に同じ値が使用されていることを確認してください。
* ネイティブプロトコル経由の場合、`--secure` が設定されており、`--tls-sni-override` が `<routing-value>.sticky.<host>` の形式になっていることを確認してください。
* 有効化後、しばらく待ってください。反映までに 1 分未満かかることがあります。
* 最近レプリカ数が変更されたかどうかを確認してください。スケーリング後の再マッピングは想定される動作です。新しいマッピングを確認するには、`SELECT hostName()` を使用してください。

**ネイティブプロトコル経由での証明書エラー**

* `--host` が通常のサービスホスト名であること、およびルーティング値が `--host` ではなく `--tls-sni-override` を介して渡されていることを確認してください。
