メインコンテンツまでスキップ
バージョン: 4.1 GA

Compute Replica

Compute Replica は、ウェアハウスのローカルキャッシュの冗長コピーを複数の Compute Node (CN) に保持します。これにより、ノードの再起動、スケーリング、ローリングアップグレード、ネットワーク上での到達不能が発生しても、クエリレイテンシを予測可能な範囲に保てます。

概要​

共有データクラスタでは、データの信頼できる唯一の情報源 (source of truth) はオブジェクトストレージ (Amazon S3、Azure Blob Storage、Google Cloud Storage など) にあり、データの信頼性はオブジェクトストレージサービスによって保証されます。各 Compute Node は、担当するタブレットデータのローカルキャッシュを保持するため、クエリのたびにオブジェクトストレージから読み取る必要はありません。

デフォルトでは、各タブレットは1 台の Compute Node にのみキャッシュされます。そのため、パフォーマンスの信頼性に次のような課題が生じます。

  • HA イベント時のキャッシュ消失 — CN がクラッシュした場合、メモリ不足になった場合、またはローリングアップグレード中に再起動された場合、その CN のタブレットはキャッシュが空 (コールド) の別の CN に再スケジュールされます。直後のクエリでは大量のキャッシュミスと低速なリモート読み取りが発生し、テールレイテンシが急上昇します。これは、厳しい P99 SLA を持つリアルタイムの顧客向けワークロードにとって特に深刻です。
  • スケーリング時のキャッシュ無効化 — スケールアウトやスケールインによってタブレットがノード間で再配置されるため、大量のキャッシュが無効になり、キャッシュが再びウォームアップされるまでクエリパフォーマンスが低下します。
  • トラフィックのホットスポット — 特定のタブレットへの同時アクセスが、そのタブレットをキャッシュしている 1 台の CN に集中します。

レイテンシに敏感な顧客向け分析を運用するには、共有データアーキテクチャのコスト面の利点を損なうことなく、こうしたレイテンシの急激な悪化を取り除く必要があります。Compute Replica は、ストレージではなくキャッシュ層を複数の CN に複製することで、この要件に応えます。

Compute Replica は平均速度の最適化ではなく、安定性のためのガードレールです

Compute Replica は、ノードの入れ替わり、スケーリング、ローリングアップグレードの間もテールレイテンシを予測可能にします。定常状態のクエリを速くするものではありません。その効果は、クラスタに何らかの障害や変動が起きたときにこそ現れます。

リアルタイムの顧客向け分析ワークロードを用いたテストでは、各タブレットを 1 台のノードにのみキャッシュした場合、Compute Node を 1 台再起動しただけで P99 クエリレイテンシが約 3.5 倍に上昇しました。2 つのコンピュートレプリカ、同期キャッシュレプリケーション、インデックスレベルのウォームアップを組み合わせた場合、同じ再起動による P99 レイテンシの上昇は約 20% にとどまり、ワークロードの 1 秒未満の SLA 内に収まりました。

仕組み​

Compute Replica は、各タブレットを複数の CN にスケジュールし、それらのノードのキャッシュをウォームな状態に保ちます。あるノードがダウンすると、クエリプランナーはそのノードを避け、タブレットのウォームなコピーをすでに保持している稼働中のノードにクエリをルーティングします。これにより、オブジェクトストレージからのコールドリードを回避できます。

変更前 — 単一レプリカ: ノードに障害が発生すると、そのノードにキャッシュされていたタブレットは失われます。クエリはオブジェクトストレージからの低速なリモート読み取りに頼ることになります。

変更後 — compute_replica = 2: すべてのタブレットが 2 台のノードにキャッシュされます。ノードに障害が発生すると、プランナーはそのノードをスキップし、稼働中のノードがウォームなレプリカキャッシュから該当するタブレットを提供します。

Compute Replica は、次の 3 つの独立した機能を組み合わせたものです。

機能内容制御するプロパティ
複数のコンピュートレプリカ各タブレットを 1 台ではなく N 台の Compute Node にスケジュールし、フェイルオーバー先を確保するとともに、単一タブレットに対する同時実行性を高めます。compute_replica
キャッシュレプリケーション新しいデータが書き込まれると (ロード、コンパクション、DDL)、そのデータを他のレプリカ CN のキャッシュに複製し、複数のノードをウォームな状態に保ちます。replication_type
キャッシュウォームアップタブレットが CN に新たに配置されたとき (スケールアウト後など)、レプリカがトラフィックを処理する前に、CN がオブジェクトストレージからメタデータやデータを先行して取得します。warmup_level

レプリカがクエリから見えるようになるのは、ウォームアップが完了した後だけです。キャッシュレプリケーションが失敗しても、トランザクションのコミットやデータの整合性には影響しません。影響するのは、ピアノードのキャッシュがウォームかどうかだけです。

PhoenixAI Cloud コンソールで Compute Replica を有効にする​

Compute Replica は、コンソールからウェアハウスごとに直接設定できます。クラスタが Running 状態であり、cluster_admin ロールが必要です。

1. ウェアハウスを開く​

  1. PhoenixAI Cloud コンソールにサインインします。

  2. Clusters ページで、設定するエラスティッククラスタをクリックします。

  3. クラスタの詳細ページで、Warehouses タブをクリックします。

  4. 設定するウェアハウス (例: default_warehouse) をクリックします。

    ウェアハウスの一覧

2. Compute Replica タブを開く​

ウェアハウスの詳細ページで、Compute Replica タブをクリックします。Compute Replica がまだ有効になっていない場合は、空の状態が表示されます。Configure Compute Replica をクリックします。

Compute Replica タブ — 未有効

3. 設定して有効にする​

次のオプションを設定し、Enable Compute Replica をクリックします。

Compute Replica の設定フォーム

フィールド推奨値説明
Replica count2各タブレットをキャッシュする Compute Node の数。値を大きくすると冗長性は高まりますが、ローカルディスクの使用量が増えます。
Cache replication typeSynchronousSynchronous は、トランザクションがコミットされる前に新しいデータをすべてのレプリカノードに複製するため、すべてのキャッシュコピーが常に最新の状態に保たれます。Asynchronous は、まず 1 つのレプリカにコミットし、残りをバックグラウンドで更新します。取り込みは速くなりますが、レプリカが一時的に遅れることがあります。
Cache warmup levelIndex新たに配置されたノードがサービス開始前にどこまで事前ロードするかを決めます。Index (メタデータとデータファイルのフッター) が推奨されるバランスです。None はコールドな状態で開始し、All はデータファイル全体を事前ロードするため大きな I/O 負荷がかかります。
Serving timeout15 分再起動したノードのキャッシュウォームアップの完了を待つ時間。この時間を過ぎると、ウォームアップが終わっていなくてもクエリがそのノードにルーティングされます。この設定はクラスタ内のすべてのウェアハウスに適用されます。特に指示がない限り、推奨値のままにしてください。
ディスク使用量への影響

レプリカ数を 2 にすると、各タブレットのローカルキャッシュは 1 台ではなく 2 台のノードに保存されます。有効にする前に、Compute Node に十分なローカルディスク容量があることを確認してください。

4. 表示、編集、無効化​

Compute Replica を有効にすると、Compute Replica タブに現在のレプリカ数、レプリケーションタイプ、ウォームアップレベル、サービングタイムアウトの概要が表示されます。

  • Edit をクリックすると、任意の設定を変更できます。変更はウェアハウスを作り直さなくても反映されます。
  • Disable をクリックすると、Compute Replica が無効になります。ウェアハウスは、タブレットごとに 1 つのキャッシュコピーを持つ状態に戻ります。

Compute Replica のプロパティ​

Compute Replica は、compute_replica、replication_type、warmup_level の 3 つのウェアハウスプロパティで制御します。

PhoenixAI Cloud では、PhoenixAI Cloud コンソールで Compute Replica を有効にするで説明したとおり、これらのプロパティをコンソールで設定します。Replica count は compute_replica を、Cache replication type は replication_type を、Cache warmup level は warmup_level を設定します。現在の値は SHOW WAREHOUSES の Property 列で確認できます。

プロパティリファレンス​

compute_replica​

  • デフォルト: 1
  • 説明: コンピュートレプリカの数。各タブレットをキャッシュする Compute Node の数です。
関連する設定

compute_replica の最大値は、FE の動的設定項目 lake_warehouse_max_compute_replica (デフォルト: 3) によって制限されます。

replication_type​

  • デフォルト: NONE
  • 説明: キャッシュレプリケーションのタイプ。CN にデータが書き込まれると、この設定に従って他のレプリカ CN のキャッシュにデータが複製されます。有効な値:
    • NONE (デフォルト): レプリケーションを行いません。
    • SYNC: 新しいデータをすべてのレプリカ CN に同期的に複製します。ロードトランザクションが成功した時点で、データはすべてのコンピュートレプリカに存在します。
    • ASYNC: トランザクションが成功した時点で、新しいデータは少なくとも 1 つのレプリカにコミットされます。残りのレプリカはバックグラウンドで更新されます。
関連する設定
  • レプリケーションのタイムアウトは、CN の動的設定項目 starlet_cache_replication_timeout_ms (デフォルト: 5000 ミリ秒) で設定します。
  • バックグラウンドのレプリケーションスレッド数 (ASYNC の場合のみ有効) は、CN の動的設定項目 starlet_cache_thread_num (デフォルト: 16) で設定します。

レプリケーションの失敗は、トランザクションのコミットやデータの整合性には影響しません。 影響するのは、ピアレプリカのキャッシュがウォームかどうかだけです。主な原因は、ネットワークやディスク I/O によるレプリケーションのタイムアウト、またはレプリケーション中の送信元・送信先 CN の障害です。トラブルシューティングについては 可観測性 を参照してください。

warmup_level​

  • デフォルト: NONE
  • 説明: キャッシュウォームアップのレベル。タブレットが初めて CN に配置されると、CN はこのレベルに従ってタブレットの最新バージョンを 1 回ウォームアップします。ウォームアップが完了するまで、レプリカはクエリから見えません。有効な値:
    • NONE (デフォルト): ウォームアップを行いません。新しいノードはコールドな状態で開始します。
    • META: 最新のタブレットメタデータのみをウォームアップします。
    • INDEX: 最新のタブレットメタデータに加えて、対応するデータファイルのフッター/インデックス部分をウォームアップします。
    • ALL: 最新のタブレットメタデータに加えて、データファイル全体をウォームアップします (I/O 負荷が大きくなります)。
関連する設定
  • ウォームアップのタイムアウトは、FE の動的設定項目 lake_compute_replica_warmup_timeout_secs (デフォルト: 900 秒) で設定します。このタイムアウトを過ぎると、ウォームアップが完了していなくても FE はレプリカを可視にします。
  • ウォームアップのスレッド数は、CN の動的設定項目 tablet_warmup_max_threads (デフォルト: 4) で設定します。

CN の障害によってウォームアップが中断された場合、FE はウォームアップが成功したものとみなし、ウォームアップのタイムアウト後にレプリカを可視にします。トラブルシューティングについては 可観測性 を参照してください。

ベストプラクティス​

本番環境で推奨される構成は、レプリカ数 2、同期レプリケーション、インデックスレベルのウォームアップです。

コンソールで、Replica count を 2、Cache replication type を Synchronous、Cache warmup level を Index に設定します。

  • 2 つのレプリカと SYNC の組み合わせにより、1 台の CN がクラッシュしたりメモリ不足になったりしても、ウォームな 2 つ目のコピーが確保され、障害中もローカルキャッシュのヒット率をほぼ 100% に保てます。レプリカを増やすとローカルディスクのコストが増えますが、同期レプリケーションがロード性能に与える影響はごくわずかです。
  • INDEX ウォームアップにより、スケールアウトやスケールインでタブレットが再配置されたときに、新しいノードがメタデータとデータファイルのフッターをすぐにウォームアップするため、スケーリングの前後でクエリレイテンシがほぼ一定に保たれます。ほとんどの場合、ALL は避けてください。すべてのデータファイルを読み込むため、大きな I/O 負荷がかかります。

これらの設定を組み合わせることで、共有データ構成のパフォーマンスの信頼性を、マルチレプリカのシェアードナッシング構成と同等の水準に引き上げることができます。

バージョンごとの提供状況​

レプリカ数、キャッシュレプリケーションタイプ、ウォームアップレベルといった設定項目と、キャッシュレプリケーションおよびウォームアップの動作そのものは、v3.5 以降で利用できます。バージョンによって異なるのはこの部分ではありません。

異なるのはフェイルオーバー時のルーティングの信頼性です。信頼できるフェイルオーバーは、ノードの入れ替わり時にクエリをどのようにルーティングするかを決める、クエリプランナー、ノードの死活監視、キャッシュウォームアップに関する一連の改善に依存しています。

  • クエリプランナーは、クエリをコールドなノードにルーティングする代わりに、単一レプリカのプランに切り替えます。
  • ノードがシャットダウンまたはクラッシュすると、その死活状態がすぐにスケジューラーに報告され、そのノードのレプリカは選択されなくなります。
  • 再起動後にノードが復帰すると、そのレプリカは再度ウォームアップされ、キャッシュの準備が整うまでクエリのルーティング対象から外されます。コールドな状態でクエリを処理することはありません。

これらの改善は v4.0 以降 (26.x 系を含む) に含まれていますが、3.5.x 系にはバックポートされていません。そのため、3.5.x ではノードの入れ替わり時にクエリがコールドなノードにルーティングされる可能性があります。これが、Compute Replica が 3.5.x では実験的機能、v4.0 以降ではベータ機能である理由です。フェイルオーバーで Compute Replica を利用する前に、クラスタがこれらの修正を含むバージョンで動作していることを確認してください。

可観測性​

キャッシュレプリケーションとウォームアップのメトリクスは、共有データ用ダッシュボードと汎用の監視ダッシュボードで確認できます。

キャッシュレプリケーション​

メトリクス:

  • file replicate total count / file replicate fail count: ファイルレプリケーションの総数と失敗数。
  • active file being replicated: レプリケーションのために現在受信中のファイル。
  • async file replication wait count / async file replication timeout count: キューの深さとタイムアウト数 (ASYNC の場合のみ)。
  • file replication send/receive throughput: 送信/受信データ量の瞬間値。
  • file replication send/receive latency (quantile / average): 送信/受信レイテンシの P99 と平均。

ログ: レプリケーション失敗の原因を特定するには、CN ログ CN.INFO でキーワード cache_replication_token を検索します。コンソールに表示されるのは FE の監査ログだけですが、CN の INFO と WARNING のログは information_schema.be_logs を通じて SQL で読み取れます。例: SELECT * FROM information_schema.be_logs WHERE LOG LIKE '%cache_replication_token%';。BYOC クラスタでは、SSH で CN ノードにサインインし、そこで CN.INFO を検索することもできます。

キャッシュウォームアップ​

メトリクス:

  • Warm Up Success Count / Warm Up Fail Count: ウォームアップに成功したタブレット数と失敗したタブレット数。
  • Warm Up Current Count: キュー内にある、またはウォームアップ中のタブレット数 (同時に処理される数は tablet_warmup_max_threads で制限されます。デフォルトは 4)。
  • Warm Up Read Remote Per Minute: ウォームアップ中の 1 分あたりのリモート読み取り回数。
  • Warm Up Latency: タブレットごとのウォームアップレイテンシの平均と P99。

ログ: ウォームアップ失敗の原因を特定するには、CN ログ CN.INFO でキーワード tablet_warmup_manager を検索します。コンソールに表示されるのは FE の監査ログだけですが、CN の INFO と WARNING のログは information_schema.be_logs を通じて SQL で読み取れます。例: SELECT * FROM information_schema.be_logs WHERE LOG LIKE '%tablet_warmup_manager%';。BYOC クラスタでは、SSH で CN ノードにサインインし、そこで CN.INFO を検索することもできます。