ストリーミングサービス
ストリーミングサービスは、Milvus内部ストリーミングシステムモジュールのコンセプトであり、Write-Ahead Log (WAL)を中心に構築され、様々なストリーミング関連機能をサポートします。具体的には、ストリーミングデータのインジェスト/サブスクリプション、クラスタ状態の障害回復、ストリーミングデータの履歴データへの変換、データクエリの増加などが含まれます。アーキテクチャ上、ストリーミング・サービスは3つの主要コンポーネントで構成される:
ストリーミング分散アーク
ストリーミング・コーディネーター:コーディネータノードの論理コンポーネント。Etcdを使用してサービス・ディスカバリーを行い、利用可能なストリーミング・ノードを見つけ、WALを対応するストリーミング・ノードにバインドする。また、WAL配布トポロジーを公開するサービスを登録し、ストリーミングクライアントが与えられたWALに適切なストリーミングノードを知ることができるようにする。
ストリーミング・ノード・クラスター:WALの追加、ステートの回復、データクエリの増加など、すべてのストリーミング処理タスクを担当するストリーミングワーカーノードのクラスタ。
ストリーミングクライアント:内部で開発されたMilvusクライアントで、サービスの発見や準備状況のチェックなどの基本的な機能をカプセル化しています。メッセージの書き込みやサブスクリプションなどのオペレーションを開始するために使用されます。
メッセージ
ストリーミングサービスはログ駆動型のストリーミングシステムであるため、Milvusにおけるすべての書き込み操作(DMLやDDLなど)はメッセージとして抽象化されます。
すべてのメッセージには、ストリーミングサービスによってタイムスタンプオラクル(TSO)フィールドが割り当てられ、WALにおけるメッセージの順序を示します。メッセージの順序はmilvusにおける書き込み操作の順序を決定します。これにより、ログから最新のクラスタ状態を再構築することが可能になります。
各メッセージは特定のVChannel(仮想チャネル)に属し、操作の一貫性を確保するためにそのチャネル内で特定の不変プロパティを維持します。例えば、Insertオペレーションは常に同じチャネル上のDropCollectionオペレーションの前に発生しなければなりません。
Milvusにおけるメッセージの順序は以下のようになります:
メッセージ順序
WALコンポーネント
大規模な水平スケーラビリティをサポートするため、MilvusのWALは単一のログファイルではなく、複数のログの複合体です。各ログは独立して複数のVChannelのストリーミング機能をサポートすることができます。いつでも、WALコンポーネントは正確に1つのストリーミングノード上で動作することが許されており、これらの制約は、基礎となるWALストレージのフェンシング機構とストリーミングコーディネーターの両方によって約束されている。
WALコンポーネントの追加機能は以下の通り:
セグメントのライフサイクル管理:メモリ条件/セグメントサイズ/セグメントアイドル時間などのポリシーに基づいて、WALはすべてのセグメントのライフサイクルを管理する。
基本的なトランザクションのサポート:各メッセージにはサイズ制限があるため、WALコンポーネントはVChannelレベルでアトミックライトを約束するシンプルなトランザクションレベルをサポートします。
高同期リモートログ書き込み:MilvusはサードパーティのリモートメッセージキューをWALストレージとしてサポートしています。ストリーミングノードとリモートWALストレージ間のラウンドトリップレイテンシ(RTT)を緩和し、書き込みスループットを向上させるために、ストリーミングサービスは同時ログ書き込みをサポートします。TSOとTSO同期によってメッセージ順序を維持し、WAL内のメッセージはTSO順序で読み込まれる。
ライト・アヘッド・バッファ:メッセージがWALに書き込まれた後、それらは一時的にWrite-Ahead Bufferに保存される。これにより、リモートWALストレージからメッセージをフェッチすることなく、ログのテールリードが可能になる。
複数のWALストレージをサポート:Woodpecker、Pulsar、Kafka。ゼロディスク・モードでwoodpeckerを使用することで、リモートWALストレージへの依存を取り除くことができます。
回復ストレージ
Recovery Storageコンポーネントは、対応するWALコンポーネントが配置されているストリーミング・ノード上で常に実行されます。
このコンポーネントはストリーミングデータを永続化された履歴データに変換し、オブジェクトストレージに格納する役割を担います。
また、ストリーミング・ノード上のWALコンポーネントのメモリ内状態の回復も行う。
回復ストレージ
クエリ・デレゲータ
Query Delegatorは各ストリーミング・ノード上で実行され、単一シャード上でインクリメンタルなクエリーを実行する。クエリプランを生成し、関連するクエリノードに転送し、結果を集約する。
さらに、Query DelegatorはDeleteオペレーションを他のQuery Nodeにブロードキャストする役割も担っている。
Query Delegatorは常に同じストリーミングノード上でWALコンポーネントと共存する。しかし、コレクションがマルチレプリカで構成されている場合、N-1個のDelegator が他のストリーミングノードに配置されます。
WALの寿命とWait for Ready
コンピューティングノードとストレージを分離することで、Milvusはストリーミングノードから別のストリーミングノードへWALを簡単に転送することができ、ストリーミングサービスの高可用性を実現します。
WALライフタイム
レディ待ち
WALが新しいストリーミングノードに移動する際、古いストリーミングノードではリクエストが拒否されることがあります。一方、新しいストリーミング・ノードではWALが回収されるので、クライアントは新しいストリーミング・ノードでWALが提供できるようになるのを待ちます。
待機