インメモリレプリカ
このトピックでは、Milvusのインメモリレプリカ(レプリケーション)メカニズムについて紹介します。このメカニズムでは、パフォーマンスと可用性を向上させるためにワーキングメモリ内で複数のセグメントレプリケーションを可能にします。
インメモリ・レプリカの設定方法については、クエリ・ノード関連の設定を参照してください。
概要
レプリカの可用性
インメモリレプリカでは、Milvusは複数のクエリノードに同じセグメントをロードすることができます。あるクエリノードに障害が発生したり、現在の検索リクエストでビジー状態になっているときに別のクエリノードが到着した場合、システムは同じセグメントのレプリカを持つアイドル状態のクエリノードに新しいリクエストを送信することができます。
パフォーマンス
インメモリーレプリカは、余分なCPUとメモリーリソースを活用することができます。データセットが比較的小さいが、余分なハードウェアリソースで読み取りスループットを向上させたい場合に非常に便利です。全体的なQPS(クエリー/秒)とスループットを大幅に向上させることができます。
可用性
インメモリレプリカは、Milvusがクエリノードがクラッシュした場合に、より早く復旧するのに役立ちます。クエリノードに障害が発生した場合、セグメントを別のクエリノードに再ロードする必要はありません。その代わり、データを再読み込みすることなく、検索リクエストを即座に新しいクエリノードに再送信することができます。複数のセグメントレプリカが同時に維持されることで、フェイルオーバーに直面しても、システムはより回復力を持つ。
主要概念
インメモリーレプリカはレプリカグループとして構成される。各レプリカグループにはシャードレプリカが含まれる。各シャードレプリカは、シャード内の成長セグメントと封印セグメント(つまりDMLチャネル)に対応するストリーミングレプリカとヒストリカルレプリカを持つ。
インメモリ・レプリカの動作の例
レプリカグループ
レプリカグループは、履歴データとレプリカの処理を担当する複数のクエリノードで構成されます。
シャード・レプリカ
シャードレプリカは、同じシャードに属するストリーミングレプリカとヒストリカルレプリカから構成されます。レプリカグループ内のシャードレプリカの数は、指定されたコレクション内のシャードの数によって決まります。
ストリーミング・レプリカ
ストリーミング・レプリカは、同じDMLチャネルからのすべての成長セグメントを含みます。技術的に言えば、ストリーミング・レプリカは、1つのレプリカ内の1つのクエリ・ノードによってのみ提供されるべきです。
履歴レプリカ
ヒストリカルレプリカは、同じ DML チャンネルに含まれるすべてのセグメントを保持します。1つのヒストリカルレプリカの封印されたセグメントは、同じレプリカグループ内の複数のクエリノードに分散させることができます。
シャードリーダー
シャードリーダーは、シャードレプリカ内のストリーミングレプリカにサービスを提供するクエリノードです。
設計の詳細
バランス
ロードが必要な新しいセグメントは、複数の異なるクエリノードに割り当てられる。少なくとも1つのレプリカが正常にロードされれば、検索リクエストを処理できる。
検索
キャッシュ
プロキシはセグメントをクエリノードにマップするキャッシュを維持し、定期的に更新します。プロキシがリクエストを受け取ると、milvus は検索が必要なすべてのセグメントをキャッシュから取得し、それらをクエリノードに均等に割り当てようとする。
成長しているセグメントについては、プロキシはチャネルからクエリノードへのキャッシュも保持し、対応するクエリノードにリクエストを送信する。
フェイルオーバー
プロキシのキャッシュは常に最新というわけではありません。リクエストが来たときに、いくつかのセグメントやチャンネルが 他のクエリノードに移動しているかもしれません。この場合、プロキシはエラー応答を受け取り、キャッシュを更新し、別のクエリノードに割り当てようとする。
プロキシがキャッシュを更新した後もそれを見つけられない場合、 セグメントは無視される。これは、セグメントがコンパク ト化されている場合に起こりうる。
キャッシュが正確でない場合、プロキシはセグメントを見逃すことがある。DML チャンネルを持つクエリノード (成長するセグメント) は、プロキシが比較しキャッシュを更新できる、信頼できるセグメントのリストとともに検索応答を返します。
機能拡張
プロキシは検索リクエストをクエリノードに完全に均等に割り当てることはできません。リソースのロングテール分布を避けるために、プロキシは他のクエリノード上のアクティブなセグメントを、これらのセグメントも持っているアイドルクエリノードに割り当てます。