分散アーキテクチャの概要
Milvusは、大規模ベクトルの効率的な類似性検索と分析を実現することを目指しています。スタンドアロンのMilvusインスタンスであれば、10億スケールのベクトル検索を容易に扱うことができる。しかし、100億、1000億、あるいはそれ以上の規模のデータセットに対しては、Milvusクラスタが必要となる。クラスタは上位アプリケーションのスタンドアロンインスタンスとして使用でき、大規模データに対する低レイテンシ、高並行性というビジネスニーズを満たすことができる。Milvusクラスタはリクエストの再送、読み込みと書き込みの分離、水平スケール、動的拡張が可能であり、無制限に拡張可能なMilvusインスタンスを提供します。MishardsはMilvusの分散ソリューションである。
本記事ではMishardsアーキテクチャのコンポーネントを簡単に紹介する。より詳細な情報は次回の記事で紹介する。
1-milvus-cluster-mishards.png
分散アーキテクチャの概要
2-分散アーキテクチャの概要.png
サービストレーシング
3-サービストレーシング-milvus.png
主なサービスコンポーネント
- ZooKeeper、etcd、Consulなどのサービスディスカバリフレームワーク。
- ロードバランサー:Nginx、HAProxy、Ingress Controllerなど。
- Mishardsノード:ステートレス、スケーラブル。
- 書き込み専用のmilvusノード:シングルノードでスケーラブルではない。単一障害点を避けるため、このノードには高可用性ソリューションを使用する必要がある。
- 読み取り専用のMilvusノード:ステートフルノードでスケーラブル。
- 共有ストレージサービス:全てのMilvusノードはNASやNFSなどの共有ストレージサービスを使用してデータを共有します。
- メタデータサービス:全てのMilvusノードがこのサービスを利用してメタデータを共有します。現在、MySQLのみがサポートされています。このサービスにはMySQLの高可用性ソリューションが必要です。
スケーラブルコンポーネント
- ミシャード
- 読み取り専用のMilvusノード
コンポーネント紹介
Mishardsノード
Mishardsはアップストリームリクエストを分割し、サブリクエストをサブサービスにルーティングする。結果はアップストリームに返すために要約される。
4-ミシャード・ノード.jpg
上の図にあるように、TopK検索リクエストを受け付けると、Mishardsはまずリクエストをサブリクエストに分割し、そのサブリクエストを下流のサービスに送る。すべてのサブレスポンスが収集されると、サブレスポンスはマージされ、アップストリームに返される。
Mishardsはステートレス・サービスであるため、データを保存したり、複雑な計算に参加したりすることはありません。そのため、ノードは高い設定要件を必要とせず、計算能力は主にサブ結果のマージに使用されます。そのため、Mishardsノードの数を増やして高い同時実行性を実現することが可能です。
Milvusノード
MilvusノードはCRUD関連のコア操作を担当するため、構成要件が比較的高くなります。第一に、ディスクIOオペレーションが多くなりすぎないよう、メモリサイズを十分に大きくする必要があります。次に、CPUの構成もパフォーマンスに影響します。クラスタサイズが大きくなると、システムのスループットを向上させるために、より多くのmilvusノードが必要になります。
読み取り専用ノードと書き込み可能ノード
- Milvusのコアオペレーションはベクトル挿入と検索である。検索はCPUとGPUのコンフィギュレーションに対する要求が極めて高いが、挿入やその他のオペレーションは比較的要求が低い。検索を実行するノードとその他のオペレーションを実行するノードを分離することで、より経済的な展開が可能になる。
- サービス品質の面では、あるノードが検索オペレーションを実行している場合、関連ハードウェアは全負荷で動作しており、他のオペレーションのサービス品質を確保することができない。そのため、2種類のノードが使用される。検索要求は読み取り専用ノードによって処理され、その他の要求は書き込み可能ノードによって処理される。
書き込み可能なノードは1つのみ
現在、Milvusは複数の書き込み可能インスタンスのデータ共有をサポートしていません。
デプロイ時には、書き込み可能ノードの単一障害点を考慮する必要があります。書き込み可能なノードには高可用性ソリューションを準備する必要があります。
読み取り専用ノードのスケーラビリティ
データサイズが非常に大きい場合、またはレイテンシ要件が非常に高い場合、読み取り専用ノードをステートフルノードとして水平方向に拡張することができます。ホストが4台あり、それぞれが以下の構成であると仮定します:CPUコア16、GPU:CPUコア:16、GPU:1、メモリ:64GB。次の図は、ステートフル・ノードを水平スケールした場合のクラスタを示しています。コンピューティングパワーとメモリはともにリニアにスケールします。データは8つのシャードに分割され、各ノードは2つのシャードからのリクエストを処理します。
5-read-only-node-scalability-milvus.png
いくつかのシャードでリクエスト数が多い場合、スループットを向上させるために、これらのシャードにステートレス読み取り専用ノードを配置することができる。上のホストを例にとると、ホストをサーバーレスクラスターにまとめると、コンピューティングパワーはリニアに増加する。処理するデータは増えないため、同じデータシャードの処理能力も線形に増加する。
6-read-only-node-scalability-milvus-2.png
メタデータ・サービス
キーワードMySQL
Milvusメタデータの詳細については、メタデータの表示方法を参照してください。分散システムにおいて、Milvus書き込み可能ノードはメタデータの唯一の生成者である。Milvusノード、Milvus書き込み可能ノード、Milvus読み取り専用ノードはすべてメタデータの消費者です。現在、MilvusはメタデータのストレージバックエンドとしてMySQLとSQLiteのみをサポートしています。分散システムでは、このサービスは高可用性のMySQLとしてのみデプロイ可能である。
サービスディスカバリー
キーワードApache Zookeeper、etcd、Consul、Kubernetes
7-service-discovery.png
サービスディスカバリは、すべてのMilvusノードに関する情報を提供する。Milvusノードはオンラインになると情報を登録し、オフラインになるとログアウトする。Milvusノードは定期的にサービスのヘルスステータスをチェックすることで、異常なノードを検出することもできる。
サービスディスカバリにはetcd、Consul、ZooKeeperなど多くのフレームワークが含まれています。Mishardsはサービスディスカバリインターフェースを定義し、プラグインによるスケーリングの可能性を提供します。現在、MishardsはKubernetesクラスタと静的構成の2種類のプラグインを提供している。これらのプラグインの実装に従うことで、独自のサービスディスカバリをカスタマイズすることができる。インターフェースは一時的なもので、再設計が必要です。独自のプラグインを書くことについての詳細は、次回の記事で詳しく説明する。
ロードバランシングとサービスシャーディング
キーワードNginx, HAProxy, Kubernetes
7-load-balancing-and-service-sharding.png
サービスディスカバリとロードバランシングは一緒に使われる。ロードバランシングはポーリング、ハッシュ、一貫したハッシュとして設定できる。
ロードバランサーはユーザーのリクエストをMishardsノードに再送する役割を担う。
各Mishardsノードはサービスディスカバリーセンターを通じて、すべての下流Milvusノードの情報を取得します。関連するすべてのメタデータはメタデータサービスによって取得することができます。Mishardsはこれらのリソースを消費することでシャーディングを実装します。Mishardsはルーティング戦略に関連するインターフェースを定義し、プラグインによる拡張機能を提供します。現在、Mishardsは最小セグメントレベルに基づく一貫したハッシュ戦略を提供しています。図に示すように、s1からs10の10個のセグメントがある。セグメントベースの一貫したハッシュ戦略により、Mishardsはs1、24、s6、s9に関するリクエストをMilvus 1ノードに、s2、s3、s5をMilvus 2ノードに、s7、s8、s10をMilvus 3ノードにルーティングします。
ビジネスニーズに基づき、デフォルトの一貫したハッシングルーティングプラグインに従ってルーティングをカスタマイズすることができます。
トレース
キーワードOpenTracing、Jaeger、Zipkin
分散システムの複雑さを考えると、リクエストは複数の内部サービス呼び出しに送られます。問題を特定するために、内部サービス呼び出しチェーンをトレースする必要があります。複雑さが増すにつれて、利用可能なトレースシステムの利点は自明である。私たちはCNCF OpenTracing標準を選びました。OpenTracingは、開発者がトレースシステムを便利に実装するための、プラットフォームに依存しない、ベンダーに依存しないAPIを提供します。
8-tracing-demo-milvus.png
前の図は、検索呼び出し中のトレースの例です。検索はget_routing
、do_search
、do_merge
を連続して呼び出している。do_search
はsearch_127.0.0.1
も呼び出している。
全体のトレース記録は以下のツリーを形成する:
8-search-traceid-milvus.png
次の図は、各ノードのリクエスト/レスポンス情報とタグの例を示しています:
request-response-info-tags-node-milvus.png。
OpenTracingがmilvusに統合されました。詳細は次回の記事で紹介します。
モニタリングとアラート
キーワードPrometheus, Grafana
10-monitor-alert-milvus.jpg
概要
サービス・ミドルウェアとして、Mishardsはサービスの発見、リクエストのルーティング、結果のマージ、トレースを統合している。プラグインベースの拡張も提供されている。現在のところ、Mishardsをベースにした分散ソリューションにはまだ以下の欠点がある:
- Mishardsはミドルレイヤーとしてプロキシを使用しており、レイテンシーコストがある。
- Milvus書き込み可能ノードはシングルポイントサービスである。
- 複数のシャードがあり、1つのシャードが複数のコピーを持つ場合、展開が複雑になる。
- メタデータへのアクセスなどのキャッシュレイヤーがない。
Mishardsをより便利に本番環境に適用できるよう、次期バージョンではこれらの既知の問題を修正する予定です。
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word