インメモリ・レプリカによるベクター・データベースの読み取りスループットの向上
表紙画像
この記事はCongqi Xiaと Angela Niの共著です。
Milvus2.1が正式リリースされ、利便性とユーザーエクスペリエンスの向上のために多くの新機能が追加されました。インメモリレプリカという概念は分散データベースの世界では目新しいものではありませんが、システムパフォーマンスを向上させ、システムの可用性を簡単に高めることができる重要な機能です。そこで本記事では、インメモリレプリカとは何か、なぜ重要なのかを説明し、AI向けベクトルデータベースMilvusでこの新機能を有効にする方法を紹介する。
ジャンプ
インメモリレプリカの概念
インメモリ・レプリカとは何か、なぜ重要なのかを知る前に、まずレプリカ・グループ、シャード・レプリカ、ストリーミング・レプリカ、ヒストリカル・レプリカ、シャード・リーダーなど、いくつかの関連する概念を理解する必要があります。以下の画像は、これらの概念の説明図である。
レプリカの概念
レプリカグループ
レプリカグループは、ヒストリカルデータとレプリカの処理を担当する複数のクエリノードで構成されます。
シャード・レプリカ
シャードレプリカはストリーミングレプリカとヒストリカルレプリカで構成され、どちらも同じシャード(つまりDMLチャネル)に属します。複数のシャードレプリカがレプリカグループを構成します。レプリカグループ内のシャードレプリカの正確な数は、指定されたコレクション内のシャードの数によって決まります。
ストリーミング・レプリカ
ストリーミング・レプリカは、同じDMLチャネルからのすべての成長セグメントを含みます。技術的に言えば、ストリーミング・レプリカは1つのレプリカに1つのクエリ・ノードだけが対応する必要があります。
履歴レプリカ
ヒストリカルレプリカは、同じ DML チャンネルに含まれるすべてのセグメントを保持します。1つのヒストリカルレプリカの封印されたセグメントは、同じレプリカグループ内の複数のクエリノードに分散させることができます。
シャードリーダー
シャードリーダーとは、シャードレプリカ内のストリーミングレプリカを扱うクエリノードのことです。
インメモリーレプリカとは何ですか?
インメモリーレプリカを有効にすると、複数のクエリノードでコレクション内のデータをロードできるため、CPUとメモリーのリソースを余すことなく活用できます。この機能は、データセットが比較的小さいが、読み取りスループットを向上させ、ハードウェアリソースの利用率を高めたい場合に非常に便利です。
Milvusベクトルデータベースは、今のところ各セグメントに対して1つのレプリカをメモリ上に保持している。しかし、インメモリレプリカを使えば、異なるクエリノード上にセグメントの複数のレプリカを持つことができます。つまり、あるクエリノードがあるセグメントを検索しているときに、新しい検索要求が来た場合、このクエリノードはまったく同じセグメントのレプリカを持っているので、別のアイドルクエリノードに割り当てることができる。
さらに、複数のインメモリーレプリカがあれば、クエリーノードがクラッシュした場合にも対応できる。以前は、別のクエリノードで検索を続けるためには、セグメントの再読み込みを待たなければなりませんでした。しかし、インメモリーレプリケーションを使えば、データを再読み込みすることなく、すぐに新しいクエリーノードに検索リクエストを再送信することができる。
レプリケーション
なぜインメモリーレプリカが重要なのか?
インメモリーレプリカを有効にする最も大きなメリットの一つは、全体のQPS(クエリー/秒)とスループットが向上することです。さらに、複数のセグメント・レプリカを維持することができ、フェイルオーバーに直面した場合のシステムの回復力も高まります。
Milvusベクトルデータベースのインメモリーレプリカの有効化
Milvusベクトルデータベースでは、インメモリレプリカの新機能を有効にするのは簡単です。コレクションをロードする際(つまり、collection.load()
を呼び出す際)に必要なレプリカの数を指定するだけです。
以下のチュートリアルの例では、すでに "book "という名前のコレクションを作成し、データを挿入したとします。次のコマンドを実行すると、bookコレクションをロードするときに2つのレプリカを作成できます。
from pymilvus import Collection
collection = Collection("book") # Get an existing collection.
collection.load(replica_number=2) # load collection as 2 replicas
上のコード例では、アプリケーションのシナリオに合わせて、レプリカの数を柔軟に変更できます。そうすれば、余計なコマンドを実行することなく、複数のレプリカに対して直接ベクトル類似検索や クエリを実行することができます。ただし、許容されるレプリカの最大数は、クエリ・ノードを実行するために使用可能なメモリの総量によって制限されることに注意する必要があります。指定したレプリカの数が使用可能なメモリの制限を超えると、データのロード中にエラーが返されます。
collection.get_replicas()
を実行して、作成したインメモリ・レプリカの情報を確認することもできます。レプリカ・グループと対応するクエリ・ノードとシャードの情報が返されます。以下は出力の例です。
Replica groups:
- Group: <group_id:435309823872729305>, <group_nodes:(21, 20)>, <shards:[Shard: <channel_name:milvus-zong-rootcoord-dml_27_435367661874184193v0>, <shard_leader:21>, <shard_nodes:[21]>, Shard: <channel_name:milvus-zong-rootcoord-dml_28_435367661874184193v1>, <shard_leader:20>, <shard_nodes:[20, 21]>]>
- Group: <group_id:435309823872729304>, <group_nodes:(25,)>, <shards:[Shard: <channel_name:milvus-zong-rootcoord-dml_28_435367661874184193v1>, <shard_leader:25>, <shard_nodes:[25]>, Shard: <channel_name:milvus-zong-rootcoord-dml_27_435367661874184193v0>, <shard_leader:25>, <shard_nodes:[25]>]>
今後の予定
Milvus 2.1の正式リリースに伴い、新機能を紹介する一連のブログを用意しました。このブログシリーズの続きを読む
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word