session_id がどのレプリカに割り当てられるかが変わることがあります。
前提条件
- ご利用のサービスには 2 つ以上のレプリカ が必要です。単一レプリカのサービスでは、固定先となるレプリカがありません。
- 稼働中 のサービス。アイドル状態のサービスを起動すると、
session_idに対応するレプリカが変わることがあります。 - この機能が GA になると、Enterprise ではデフォルトで利用可能になります。
- 標準の ClickHouse Cloud サービスでサポートされています。BYOC は現時点ではサポートされていません。
レプリカ対応ルーティングの設定
?session_id= を付けて送信してください。再起動は不要です。
HTTP ベースのルーティング (session_id)
session_id クエリパラメータを設定します。プロキシは session_id に対してコンシステントハッシュを使用してレプリカを選択するため、同じ session_id を持つすべてのリクエストは、クラスターのトポロジが変わるまで同じサーバーにルーティングされます。
既存のサービスホスト名を使用します。特別なスティッキーホスト名や DNS の変更は必要ありません。
session_id=my-workload-1 を含むすべてのリクエストは、同じレプリカに振り分けられます。異なる session_id の値はそれぞれ独立してハッシュ化され、同じレプリカに振り分けられることもあれば、別のレプリカに振り分けられることもあります。マッピング自体には一貫性がありますが、特定の値がどのレプリカにマッピングされるかを選ぶことはできません。
session_id には任意の文字列を指定できます (アプリケーション名、ユーザー ID、またはワークロードラベル) 。session_id を付けないリクエストでは、通常の負荷分散が維持されます。
クエリパラメータを追加できる任意の HTTP クライアントが利用でき、curl、clickhouse-connect、JDBC/ODBC などが含まれます。clickhouse-go (v2) では、前述のとおり HTTP モードを使用してください。
どのレプリカに接続されているかを確認する
session_idを使って、上記のSELECT hostName()の例をもう一度実行します。同じホスト名が返されるはずです。session_idが異なると、別のレプリカに割り当てられる場合があります。
サブドメインベースのルーティング (非推奨)
非推奨このサブドメインベースの仕組みは非推奨になりつつあり、新しいサービスでは今後有効にならなくなります。スケーラビリティに欠けるためです (sticky エンドポイントごとに専用の TLS 証明書が必要になります) 。代わりに HTTP ベースの
session_id メソッド を使用してください。すでに sticky サブドメインを使用している場合は、session_id ルーティングを有効にするために support に連絡してください。これは破壊的変更であり、移行が必要になります。abcxyz123.us-west-2.aws.clickhouse.cloud のサービスでは、*.sticky.abcxyz123.us-west-2.aws.clickhouse.cloud に一致する任意のホスト名 (例: aaa.sticky.abcxyz123.us-west-2.aws.clickhouse.cloud) は、Envoy によって特定のレプリカに一貫してハッシュされました。元のホスト名では引き続き、デフォルトのルーティングアルゴリズムである LEAST_CONNECTION による負荷分散が使用されました。
レプリカ対応ルーティングの制約事項
サービス変更時にはスティッキー性が崩れることがあります
session_id を共有するリクエストが別のサーバーポッドに振り分けられる場合があります。一時テーブルやセッションレベルの設定に依存している場合は、再マップ後にそれらを再作成できるようにしておいてください。
レプリカ対応ルーティングはワークロードの分離ではありません
プライベートリンクと非推奨のサブドメイン方式
session_id ルーティングは、通常のサービスホスト名でプライベートネットワーキングを使用する場合は動作します。追加の DNS エントリは必要ありません。
一方、非推奨のサブドメイン方式では動作しません。*.sticky.* ホスト名パターン用の DNS を追加する必要があり、設定を誤るとレプリカ間で負荷が偏る可能性があります。
レプリカ対応ルーティングには HTTP プロトコルが必要です
session_id クエリパラメータをキーにしていますが、これは HTTP/HTTPS インターフェイスにしか存在しません。ネイティブバイナリプロトコルには、プロキシがハッシュのキーとして使えるこの種のパラメータがないため、ネイティブプロトコルではレプリカ対応ルーティングを利用できません。現在、この機能を使うには、ネイティブプロトコルを使うクライアントは該当するワークロードを HTTP インターフェイスに移す必要があります。
トラブルシューティング
session_id でも、クエリが引き続き別のレプリカに送られる
session_idが HTTPヘッダーではなく、URL のクエリパラメータ (?session_id=...) になっていることを確認してください。- 有効化後、少し待ってください。反映されるまで 1 分ほどかかる場合があります。
- サービスが最近スケールまたは再起動したかどうかを確認してください。トポロジーの変更後に再マッピングが発生するのは想定どおりです。
SELECT hostName()を使って新しいマッピングを確認してください。