🚀 Zilliz Cloudを無料で試す、完全管理型のMilvus—10倍の高速パフォーマンスを体験しよう!今すぐ試す>>

milvus-logo
LFAI
  • Home
  • Blog
  • データ通信の最適化:Milvus、NATSメッセージングを採用

データ通信の最適化:Milvus、NATSメッセージングを採用

  • Engineering
November 24, 2023
Zhen Ye

データ処理という複雑なタペストリーにおいて、シームレスなコミュニケーションは業務を結びつける糸である。オープンソースのベクターデータベースの先駆者であるMilvusは、その最新機能で変革の旅に出ました:NATSメッセージングの統合です。この包括的なブログポストでは、この統合の複雑さを解き明かし、そのコア機能、セットアッププロセス、移行のメリット、そして前身であるRocksMQとの違いを探ります。

Milvusにおけるメッセージキューの役割を理解する

Milvusのクラウドネイティブアーキテクチャにおいて、メッセージキュー(Log Broker)は極めて重要な役割を担っている。これは、永続的なデータストリーム、同期、イベント通知、システム復旧時のデータ整合性を保証するバックボーンです。従来、Milvusスタンドアロン・モードでは、特にPulsarやKafkaと比較した場合、RocksMQが最も分かりやすい選択肢でしたが、膨大なデータや複雑なシナリオでは、その限界が明らかになりました。

Milvus 2.3では、シングル・ノードMQ実装であるNATSが導入され、データ・ストリームの管理方法が再定義されました。NATSは従来のものとは異なり、Milvusユーザをパフォーマンスの制約から解放し、大容量のデータをシームレスに処理できるようにします。

NATSとは?

NATSはGoで実装された分散システム接続技術です。システム間のRequest-ReplyやPublish-Subscribeのような様々な通信モードをサポートし、JetStreamによるデータの永続性を提供し、組み込みのRAFTによる分散機能を提供します。NATSの詳細についてはNATS公式サイトを参照してください。

Milvus2.3スタンドアロンモードでは、NATS、JetStream、PubSubはMilvusに堅牢なMQ機能を提供します。

NATSの有効化

Milvus2.3では、mq.type という新しいコントロールオプションが用意されており、使用するMQのタイプを指定することができます。NATSを有効にするには、mq.type=natsmq を設定します。Milvusインスタンスを起動した後、以下のようなログが表示されれば、メッセージキューとしてNATSを有効にしたことになります。

[INFO] [dependency/factory.go:83] ["try to init mq"] [standalone=true] [mqType=natsmq]

MilvusのNATSの設定

NATSのカスタマイズオプションには、リスニングポート、JetStreamストレージディレクトリ、最大ペイロードサイズ、および初期化タイムアウトの指定が含まれます。これらの設定を微調整することで、最適なパフォーマンスと信頼性を確保することができます。

natsmq:
server: # server side configuration for natsmq.
port: 4222 # 4222 by default, Port for nats server listening.
storeDir: /var/lib/milvus/nats # /var/lib/milvus/nats by default, directory to use for JetStream storage of nats.
maxFileStore: 17179869184 # (B) 16GB by default, Maximum size of the 'file' storage.
maxPayload: 8388608 # (B) 8MB by default, Maximum number of bytes in a message payload.
maxPending: 67108864 # (B) 64MB by default, Maximum number of bytes buffered for a connection Applies to client connections.
initializeTimeout: 4000 # (ms) 4s by default, waiting for initialization of natsmq finished.
monitor:
trace: false # false by default, If true enable protocol trace log messages.
debug: false # false by default, If true enable debug log messages.
logTime: true # true by default, If set to false, log without timestamps.
logFile: /tmp/milvus/logs/nats.log # /tmp/milvus/logs/nats.log by default, Log file path relative to .. of milvus binary if use relative path.
logSizeLimit: 536870912 # (B) 512MB by default, Size in bytes after the log file rolls over to a new one.
retention:
maxAge: 4320 # (min) 3 days by default, Maximum age of any message in the P-channel.
maxBytes: # (B) None by default, How many bytes the single P-channel may contain. Removing oldest messages if the P-channel exceeds this size.
maxMsgs: # None by default, How many message the single P-channel may contain. Removing oldest messages if the P-channel exceeds this limit.

注意してください:

  • NATSサーバーのリスニングには、server.port を指定する必要があります。ポートが競合すると、Milvusは起動できません。server.port=-1 をランダムにポートを選択するように設定してください。

  • storeDir JetStreamストレージのディレクトリを指定します。Milvusの読み書きスループットを向上させるため、高性能なソリッドステートドライブ(SSD)にディレクトリを保存することを推奨します。

  • maxFileStore JetStreamストレージサイズの上限を設定します。この上限を超えると、それ以降のデータ書き込みができなくなります。

  • maxPayload 個々のメッセージサイズを制限します。書き込み拒否を避けるため、5MB以上にしておく必要があります。

  • initializeTimeoutNATSサーバーの起動タイムアウトを制御します。

  • monitor NATSの独立ログを設定します。

  • retention NATSメッセージの保持メカニズムを制御します。

詳細はNATSの公式ドキュメントを参照してください。

RocksMQからNATSへの移行

RocksMQからNATSへの移行は、書き込み操作の停止、データのフラッシュ、設定の変更、milvusのログによる移行の検証といったステップを含むシームレスなプロセスです。

  1. 移行を開始する前に、milvusで全ての書き込み操作を停止します。

  2. MilvusでFlushALL 操作を実行し、その完了を待ちます。このステップにより、保留中のデータがすべてフラッシュされ、システムがシャットダウンできる状態になります。

  3. Milvus設定ファイルを変更し、mq.type=natsmq を設定し、natsmq セクションの関連オプションを調整します。

  4. Milvus 2.3 を起動する。

  5. rocksmq.path ディレクトリに保存されているオリジナルデータをバックアップし、クリーンアップする。(オプション)

NATS vs. RocksMQ: パフォーマンス対決

Pub/Sub パフォーマンステスト

  • テスト・プラットフォームM1 Proチップ / メモリ:16GB

  • テストシナリオトピックへのランダムなデータパケットのサブスクライブとパブリッシュを、最後にパブリッシュされた結果を受信するまで繰り返す。

  • 結果

    • 小さいデータパケット(64kb未満)では、RocksMQがメモリ、CPU、応答速度でNATSを上回る。

    • より大きなデータパケット(64kb以上)では、NATSがRocksMQを凌駕し、レスポンスタイムがはるかに速い。

テストタイプMQ演算回数opあたりのコストメモリコストCPU総時間ストレージコスト
5MB*100 Pub/SubNATS501.650328186 s/op4.29 GB85.5825G
5MB*100 Pub/SubロックMQ502.475595131 s/op1.18 GB81.4219G
1MB*500 パブ/サブNATS502.248722593 S/OP2.60 GB96.5025G
1MB*500 パブ/サブロックMQ502.554614279 S/OP614.9 MB80.1919G
64KB*10000 Pub/SubNATS502.133345262 S/OP3.29 GB97.5931G
64KB*10000 Pub/SubロックMQ503.253778195 S/OP331.2 MB134.624G
1KB*50000 パブ/サブNATS502.629391004 S/OP635.1 MB179.672.6G
1KB*50000 パブ/サブロックMQ500.897638581 s/op232.3 MB60.42521M

表 1: Pub/Sub パフォーマンステスト結果

Milvus統合テスト

データサイズ:100M

結果1億のベクトルデータセットを用いた広範なテストにおいて、NATSはベクトル検索とクエリのレイテンシが低いことを示した。

指標RocksMQ (ms)NATS (ms)
平均ベクトル検索レイテンシ23.5520.17
ベクトル検索リクエスト/秒(RPS)2.953.07
平均クエリ待ち時間7.26.74
クエリーリクエスト/秒(RPS)1.471.54

表2: 100MデータセットによるMilvus統合テスト結果

データセット: <100M

結果100M未満のデータセットでは、NATSとRocksMQは同程度のパフォーマンスを示している。

結論NATSメッセージングによるMilvusの強化

MilvusにNATSが統合されたことで、データ処理は大きく前進した。リアルタイム分析、機械学習アプリケーション、あるいはデータ集約的なベンチャーであろうと、NATSは効率性、信頼性、スピードでプロジェクトを強化します。データ環境が進化する中、MilvusにNATSのような堅牢なメッセージングシステムがあれば、シームレスで信頼性が高く、パフォーマンスの高いデータ通信が可能になります。

Like the article? Spread the word

続けて読む