Alibaba Cloud Elasticsearch Agent Engine Edition は、検索拡張生成 (RAG)、AI コーディング、エージェントメモリ、およびマルチテナント検索シナリオ向けのクラウドネイティブな検索エンジンです。Collection を統一アクセスポイントとして公開し、ナレッジベース、コードリポジトリ、エージェント、テナントなどのさまざまなビジネススペースを Slice として編成します。
導入理由:複数ビジネススペース検索の課題
RAG、AI コーディング、エージェントメモリ、およびマルチテナント検索アプリケーションでは、通常、単一の検索システム内に多数の独立したナレッジベース、コードリポジトリ、メモリスペース、またはテナントデータスペースをホストする必要があります。これらのワークロードには、次のような共通の課題があります。
多数のビジネススペースの共存 — ビジネススペースごとにアクセスパターンが大きく異なります。継続的にアクティブなスペースもあれば、長期間ほとんどアクセスされないスペースもあります。スペースごとに個別のインデックスを維持すると、ビジネスの成長に伴い、管理と容量計画がますます複雑になります。
ホット/コールドの不均一な分布 — ほとんどアクセスされない多数のスペースがコンピューティングリソースとストレージリソースを長期間占有する一方で、アクティブなスペースには安定した低遅延レスポンスが求められます。従来のアーキテクチャでは、コストとパフォーマンスのバランスを取ることが困難です。
読み書きピークの乖離 — データインジェストとクエリには、それぞれ独自のピークと谷があります。書き込み、インデックス構築、クエリが同じノードセットを共有すると、書き込みの急増がクエリの遅延に直接影響します。 これらの課題に対処するため、Agent Engine Edition は、永続ストレージ、書き込みコンピューティング、クエリコンピューティングを分離します。インデックスデータと永続状態はオブジェクトストレージに保存され、書き込みとクエリはそれぞれ別のノードタイプで処理されます。各コンポーネントの役割については、本トピックの「コアアーキテクチャ」をご参照ください。
コンソールの購入ページとインスタンス一覧では、2 種類のノードタイプが[インデックスノード]および[クエリノード]と表示されます。これらは本トピックにおけるインデックスノードおよび検索ノードに対応します。
解決する課題:主な利点とシナリオ
独立したスケーリングによる読み書き分離
Agent Engine Edition は、書き込みとクエリを異なる役割のノードで実行します。データインジェスト量に基づいてインデックスノードを設定し、クエリ同時実行数に基づいて検索ノードを設定します。特定のワークロードが増加した場合、対応するリソースのみを調整すればよいため、同じコンピューティングリソースに対する書き込み、インデックスマージ、クエリ間の競合が大幅に削減されます。書き込みの急増はクエリの遅延からほぼ分離され、その逆も同様です。
自動的なホット/コールド階層化によるオンデマンドキャッシング
完全なインデックスデータはオブジェクトストレージに保存され、検索ノードのローカルディスクはクエリキャッシュとして機能します。頻繁にアクセスされるデータはキャッシュから継続的に再利用されるため、ホットクエリはミリ秒単位で応答します。ほとんどアクセスされないデータは、必要な場合にのみオブジェクトストレージから読み込まれます。ローカルキャッシュのサイズは、総データ量に合わせる必要はなく、アクティブワーキングセットに合わせて設定します。非アクティブなビジネススペースはコンピューティングリソースやキャッシュリソースを消費せず、そのストレージコストはオブジェクトストレージの従量課金料金に限定されます。
キャッシュの利点は、ワークロードのホット/コールドの分布、キャッシュ容量、ノード仕様、およびクエリ同時実行数に依存します。アクセスパターンが非常に分散している、または頻繁に変化するワークロードの場合は、実際のデータを使用して容量評価とパフォーマンステストを実施してください。
数億のビジネススペースの統合管理
Agent Engine Edition は、単一の Collection で数億のビジネススペースを統合管理できるように設計されています。アプリケーションは、各ナレッジベース、コードリポジトリ、エージェント、またはテナントを 1 つの Slice として扱い、同じ Collection を通じて読み取りと書き込みの両方を完了できます。プラットフォームは容量に基づいて基盤となるインデックスとシャードを管理するため、アプリケーションはビジネススペースごとに個別のインデックスを作成したり、基盤となるインデックス名やテーブルスキーマをアプリケーションコードで維持したりする必要がありません。本トピックの「パフォーマンスリファレンス」で説明するパフォーマンステストでは、10,000 のビジネススペースを対象としています。
クエリ時には、1 つまたは複数の Slice を選択するか、明示的にすべての Slice を選択できます。デフォルトでは、クエリスコープを明示的に指定する必要があります。デフォルトのクエリ動作については、本トピックの「データクエリの仕組み」をご参照ください。
データ移行なしでの秒単位の障害復旧
インデックスデータ、書き込みログ、およびクラスタ状態はオブジェクトストレージに保存され、コンピューティングノードはローカルに永続状態を保持しません。ノード障害後、プラットフォームは代替ノードを迅速にスケジュールします。このノードはオブジェクトストレージから操作を再開し、オンデマンドでローカルキャッシュを再構築するため、完全なデータ移行は不要です。従来のステートフルアーキテクチャにおけるシャードの復旧には数十分から数時間かかりますが、この設計により障害の影響範囲が縮小されます。
書き込み層が一時的にプライマリ (書き込み担当) シャードをホストできない場合、新規の書き込みは一時停止されます。対応する検索 (クエリ担当) シャードが利用可能な限り、システムは既に永続化され公開されたデータに対するクエリを提供し続けることができます。
Elasticsearch エコシステムとの互換性
サポートされている API の範囲内であれば、アプリケーションは Elasticsearch REST API と Query DSL を引き続き使用し、全文インデックス、ベクトル KNN、フィルタリング、および集計機能を組み合わせることができます。公式の Python、Java、Go、JavaScript クライアント、Kibana、およびその他のエコシステムコンポーネントは、互換性のあるインターフェースのリクエスト構造とクエリ構文を再利用できるため、インターフェース層の変更が削減されます。移行前に、使用するインターフェースとエコシステムコンポーネントを、お使いのインスタンスバージョンの互換性ドキュメントで検証してください。
ディスクネイティブベクトルインデックス (DiskBBQ)
Agent Engine Edition は、ディスクネイティブベクトルインデックス (DiskBBQ) を使用します。これは、階層的 k-means クラスタリングと BBQ 量子化を組み合わせることで、IO 予測可能な KNN クエリを実現します。クエリ時に、DiskBBQ は最大 2 レベルのセントロイドを探索し、ヒットしたクラスターをブロックシーケンシャル順に読み取ります。これにより、ベクトルをメモリ内に常駐させる必要なく、SSD キャッシングとオブジェクトストレージに適しています。HNSW と比較して、DiskBBQ はインデックス構築速度を約 1 桁向上させ、メモリが制約された場合でもパフォーマンスは急激にではなく緩やかに低下します。本トピックの「パフォーマンスリファレンス」のテスト結果は、クエリの遅延のみを対象としており、インデックス構築速度は含まれていません。選択する前に、ご自身のワークロードで構築パフォーマンスを検証してください。フィールド設定、KNN クエリパラメータ、および完全な例については、「DiskBBQ と Sliced DiskBBQ ベクトル検索」をご参照ください。
シナリオ
次の表は、Agent Engine Edition の典型的なシナリオと、各シナリオで推奨されるデータ編成を示しています。
| シナリオ | 推奨されるデータ編成 | 主な価値 |
| エンタープライズナレッジベースと RAG | 各ナレッジベースを Slice として扱う | 単一の Collection で多数のナレッジベースを管理します。アクティブなベースはミリ秒単位で応答し、休止中のベースはオブジェクトストレージ料金のみが発生します。 |
| AI コーディングとコード検索 | 各コードリポジトリまたはプロジェクトを Slice として扱う | コミット後、数秒でコードが検索可能になります。開発者のリアルタイム検索は、バッチ書き込みの影響をほとんど受けません。 |
| エージェントメモリ | テナント、エージェント、または独立したメモリスペースごとに Slice をパーティション化する | 書き込みは即座にクエリ可能です。多数のエージェントにまたがる休止中のメモリは、コンピューティングリソースやキャッシュリソースを消費しません。 |
| マルチテナント検索サービス | 各テナントまたはビジネススペースを Slice として扱う | プラットフォームが基盤となるインデックスを管理し、データはテナントごとに物理的にクラスター化されます。単一テナントのクエリコストは、そのテナント自身のデータ量にのみ依存します。 |
構成要素:コアコンセプトとアーキテクチャ
コアコンセプト
Agent Engine Edition を理解するには、まず Collection と Slice を区別する必要があります。
| コンセプト | 説明 |
| Collection | アプリケーションがデータにアクセスするための統一エントリポイントです。Elasticsearch のインデックス名と同じように使用します。1 つの Collection には複数のビジネススペースを含めることができます。 |
| Slice | Collection 内の論理的なデータスペースです。たとえば、ナレッジベース、コードリポジトリ、エージェント、またはテナントは、それぞれが 1 つの Slice になります。 |
データの読み書き時、アプリケーションは Collection 名を使用してデータにアクセスし、Slice を通じて対応するビジネススペースを指定します。プラットフォームはリクエストを Slice に対応するデータにルーティングし、基盤となるインデックスとシャードを管理します。アプリケーションは、基盤となるインデックス名を保存したり、直接操作したりする必要はありません。
Slice はデータを編成し、クエリの範囲を限定するものです。アカウントの権限境界と同等ではありません。テナント間の ID 認証と権限分離が必要な場合は、アプリケーション層の認証と製品がサポートするセキュリティメカニズムを組み合わせてソリューションを設計してください。
コアアーキテクチャ
Agent Engine Edition のコアアーキテクチャは、3 つの考え方に基づいています。永続データはオブジェクトストレージに一元的に保存され、書き込みとクエリは独立してスケールする異なるノードタイプによって処理され、複数のビジネススペースは Collection と Slice を通じて編成されます。クエリデータは、オンデマンドでローカルキャッシュにキャッシュされます。

各コンポーネントの責務は次のとおりです。
| コンポーネント | 主な責務 |
| Collection と Slice | Collection はデータアクセスのエントリポイントとして機能します。Slice は Collection 内のビジネススペースを識別し、プラットフォームはそれを使用してリクエストに対応するデータを特定します。 |
| インデックスノード | ドキュメントの書き込み、書き込みログ (Translog) の永続化、インデックス構築、およびバックグラウンドマージを処理します。 |
| 検索ノード | 全文、ベクトル、フィルタリング、および集計クエリを実行し、クエリに必要なデータをローカルにキャッシュします。 |
| オブジェクトストレージ | インデックスデータ、書き込みログ、およびクラスターの運用に必要な永続状態を保存します。データ耐久性はイレブンナイン (99.999999999%) 以上です。課金は実際に使用されたストレージに基づいて行われ、容量を事前にプロビジョニングする必要はありません。コンソールのインスタンス詳細ページでは、この容量が[OpenStore Storage]および[OpenStore Storage Usage]として表示されます。 |
データ書き込みの仕組み
データを書き込む際、アプリケーションはリクエストの URI に Collection 名を使用し、Slice を通じてデータが属するビジネススペースを識別します。
インデックスノードがリクエストを処理します。システムは、書き込みログ (Translog) がオブジェクトストレージに同期的に永続化された後にのみ、クライアントに書き込み完了を通知します。
インデックスノードはバックグラウンドでインデックスファイルを生成し、新規インデックスバージョン (Commit) を公開します。検索ノードがリフレッシュされると、Elasticsearch のニアリアルタイムセマンティクスに従って、新規データがクエリ結果に反映されます。
データクエリの仕組み
データをクエリする際、アプリケーションはリクエストの URI に Collection 名を使用し、Slice を通じて 1 つ以上のビジネススペースを指定します。デフォルトでは、Slice を指定しないクエリは拒否されます。これにより、ルーティング情報が欠落している場合に意図せず Collection 全体をクエリするリスクが軽減されます。
検索ノードは、まずクエリに必要なデータをローカルの共有キャッシュから読み取ります。
キャッシュミス時に、検索ノードは現在のクエリで必要なデータ範囲をオブジェクトストレージから読み込みます。後続のクエリは、すでにキャッシュに入っているホットデータを継続して再利用します。
Stateless architecture and resource planning
パフォーマンスリファレンス
以下の結果は、2023年7月に典型的なアプリケーションシナリオで実施されたテストによるもので、そのテスト条件下でのコールドクエリとホットクエリのパフォーマンスを示しています。このテスト結果は、製品の SLA、インスタンス仕様のコミットメント、または他の環境に対する一般的なパフォーマンス結論を構成するものではありません。
| テスト項目 | 設定 |
| テスト環境 | Alibaba Cloud Elasticsearch Agent Engine Edition、インデックスノード 2 台、検索ノード 2 台、各 16 vCPU、64 GiB メモリ |
| データ規模 | ビジネススペース 10,000 件、合計 9,368 万ドキュメント、データ量 2.8 TB |
| ベクトル設定 | 512 ベクトル次元、類似度 dot_product、インデックス bbq_disk (DiskBBQ) |
| クエリメソッド | 10 件の結果を返す KNN クエリ、候補セット 100 |
| 遅延メトリック | tookサーバーサイドの処理時間 (took)。クライアントサイドの処理時間とネットワーク遅延は含まれません。 |
| アクセス状態 | サンプル数 | P50 (中央値) | P90 | P99 |
| コールドクエリ | 180 | 225 ms | 377 ms | 605 ms |
| ホットクエリ | 1,800 | 1 ms | 32 ms | 65 ms |
上記のデータは、16 vCPU と 64 GiB のインデックスノードおよび検索ノードで取得されたものです。ノード仕様、最小ノード数、および専用マスターノードの設定は、購入ページで現在利用可能なオプションに準じます。上記の表の遅延は、テスト仕様より低い設定では再現できないため、最小仕様で同等のパフォーマンスを期待しないでください。実際のクエリパフォーマンスは、単一 Slice のデータ量、ベクトル次元、リコールパラメータ、ノード仕様、キャッシュ容量、同時負荷、およびネットワーク条件にも影響されます。正式な選定を行う前に、実際のビジネスデータとクエリを使用して、容量評価とストレステストを実施してください。
バージョンと互換性
Agent Engine Edition は、9.99.x 形式のバージョン番号を使用します。9.99 は、この製品が Elasticsearch 9.x 互換シリーズに属することを示し、最後のバージョンセグメントは Agent Engine Edition 自体の機能イテレーションを区別します。このバージョン番号は、特定の Elasticsearch 9.x マイナーバージョンと 1 対 1 で対応するものではなく、すべての Elasticsearch 9.x 機能と API のサポートを意味するものではありません。
サポートされる機能と API は、9.99.x バージョンによって異なる場合があります。インスタンスを作成したり、ワークロードを移行したりする前に、コンソールに表示されるインスタンスバージョンの API 互換性ドキュメントを参照して、データアクセス、クエリスコープ、ベクトル検索、データレプリケーション、およびセキュリティ機能がサポートされていることを確認してください。
現在の Agent Engine Edition 9.99.0 は Elasticsearch カーネルバージョン 9.5.0 に対応しているため、クラスター API が返すバージョン番号はコンソールに表示されるバージョン番号とは異なります。実際の Elasticsearch カーネルバージョンについては、クラスター API の応答が正式な値となります。カスタムプラグインをインストールする場合は、内部のカーネルバージョン (9.5.0) ではなく、製品バージョンである Agent Engine Edition に一致する 9.99.0 バージョン番号を使用する必要があります。
リージョンとゾーン
Agent Engine Edition がサポートするリージョンとゾーンは、購入ページで実際に購入可能な項目に準じます。インスタンスの仕様、課金方法、および可用性は、Alibaba Cloud の公式サイト、コンソール、および公式リリース発表に準じます。正式な移行の前に、API の互換性、データ規模、ホット/コールドの分布、および目標とするクエリ負荷に基づいて、ソリューション評価とパフォーマンス検証を完了してください。
次のステップ:利用開始の方法
Agent Engine Edition インスタンスの利用を開始するには、次の手順に従ってください。
リージョンとバージョンの確認:Alibaba Cloud の公式サイトまたはコンソールで、対象リージョンが購入可能であることを確認し、インスタンスバージョンの API 互換性ドキュメントを参照して、依存するインターフェースとエコシステムコンポーネントがサポートされていることを確認してください。
データ編成の計画:「シナリオ」セクションに基づいて、ナレッジベース、コードリポジトリ、エージェント、またはテナントごとに Slice をパーティション化するかどうかを決定し、Collection の数と命名を計画してください。
インスタンスの作成とリソースの設定:予想される書き込み量に基づいてインデックスノードを設定し、クエリ同時実行数とアクティブワーキングセットに基づいて検索ノードを設定してください。ノード障害時にクエリの可用性を維持するためのレプリカと検索ノードの設定については、「ステートレスアーキテクチャとリソース計画」をご参照ください。
統合と検証:Elasticsearch REST API または公式クライアントを使用して、書き込みとクエリの統合を完了し、Slice を通じてクエリスコープを指定し、全文、ベクトル KNN、フィルタリング、および集計機能を検証してください。
容量評価とストレステストの実行:正式な移行に進む前に、実際のビジネスデータとクエリを使用して容量評価とパフォーマンスストレステストを実行し、コールドクエリとホットクエリの遅延およびキャッシュヒットパフォーマンスに重点を置いてください。
今後の方向性
オブジェクトストレージネイティブのアーキテクチャ基盤の上に、Agent Engine Edition のロードマップには、サブセカンドのゼロコピーブランチ機能 (コピーオンライトに基づき、任意の Slice の独立したデータブランチを作成でき、評価、カナリアリリース、ロールバックに最適です)、コンピューティング層のスケールトゥゼロ (アイドル状態のビジネススペースをほぼゼロまで自動的にスケールダウンし、コストを実際の稼働負荷にさらに近づける)、および Alibaba Cloud Elasticsearch エコシステム機能とのより深い統合が含まれています。特定の機能のリリース日は、製品の発表に準じます。