マルチテナント戦略
ChatGPTの普及に伴い、CVP(ChatGPT, Vector Database, Prompt)スタックを利用して独自のSaaSサービスを作る開発者が増えています。本ガイドでは、このトレンドに対応するため、世界で最も広く利用されているベクターデータベースの一つであるMilvusでマルチテナントを実現する方法を解説します。
マルチテナントとは、1つのMilvusインスタンスが複数のテナントにサービスを提供するアーキテクチャです。テナントを区別する最も簡単な方法は、テナントのデータとリソースを他のテナントから分離することです。各テナントは、データベース、コレクション、パーティションなどのMilvusオブジェクトを管理するために、それぞれ専用のリソースを持つか、他のテナントとリソースを共有します。これらのオブジェクトに基づいて、Milvusマルチテナントを実現するための対応する方法があります。
データベース指向マルチテナンシー
Milvusバージョン2.2.9からオブジェクトデータベースが利用できるようになりました。一つのMilvusクラスタに複数のデータベースを作成することができます。この新機能により、各テナントにデータベースを割り当てることで、データベース指向のマルチテナントを実現し、各テナントが独自のコレクションやパーティションを作成してデータを最大限に活用できるようになります。ただし、この戦略ではテナントのデータ分離と検索パフォーマンスは確保されるが、アイドル状態のテナントではリソースが無駄になる可能性がある。
コレクション指向のマルチテナント
コレクション指向のマルチテナントを実現するには、2つの方法が考えられます。
すべてのテナントに1つのコレクション
テナントを区別するためにテナントフィールドを追加することによって、1つのコレクションを使用してマルチテナントを実装することは簡単なオプションです。特定のテナントに対してANN検索を行う場合、フィルタ式を追加して、他のテナントに属するすべてのエンティティをフィルタリングします。これは、マルチテナントを実現する最も簡単な方法です。ただし、フィルタのパフォーマンスがANN検索のボトルネックになる可能性があることに注意してください。
テナントごとに1つのコレクション
もう1つの方法は、すべてのテナントのデータを1つのコレクションに格納するのではなく、テナントごとに独自のデータを格納するコレクションを作成することです。これにより、データの分離とクエリのパフォーマンスが向上します。ただし、このアプローチではリソースのスケジューリング、運用能力、コストへの投資が必要となり、テナントの数が1つのMilvusクラスタがサポートする最大コレクション数を超える場合には適用できない可能性があることに留意してください。
パーティション指向マルチテナント
パーティション指向のマルチテナンシーを実現するには、2つの方法が考えられます:
テナントごとに1つのパーティション
1つのコレクションを管理することは、複数のコレクションを管理するよりもはるかに簡単です。複数のコレクションを作成する代わりに、テナントごとにパーティションを割り当てて、柔軟なデータ分離とメモリ管理を実現することを検討してください。パーティション指向のマルチテナントの検索パフォーマンスは、コレクション指向のマルチテナントよりもはるかに優れています。ただし、コレクションのテナントの数は、コレクションが保持できるパーティションの最大数を超えてはならないことに注意してください。
パーティションキーベースのマルチテナンシー
Milvus 2.2.9では、パーティションキーという新機能が導入されました。コレクションの作成時に、テナントフィールドを指定し、それをパーティションキーフィールドにします。Milvusはパーティションキーフィールドの値に従って、エンティティをパーティションに格納します。ANN検索を行う際、Milvusは指定されたパーティション・キーに基づくパーティションに変更し、パーティション・キーに従ってエンティティをフィルタリングし、フィルタリングされたエンティティ間で検索を行う。