qdrant-multitenancy について
qdrant-multitenancyは、Qdrant環境内でテナントデータを分離するためのガイドです。テナントの規模や分離要件に応じて、ペイロードフィルター、専用シャード、コレクション、地域別シャーディングを選ぶ方法を説明します。
主な機能
- 013種類の分離レベルの比較
- 02ペイロードによるテナントフィルタリング
- 03共有・専用シャードの階層化
- 04テナント別コレクションの指針
- 05地域別のカスタムシャーディング
活用シーン
- 01多数の小規模テナントのデータ分割
- 02大規模テナントを共有負荷から分離
- 03テナントごとに異なるスキーマや埋め込みモデルを利用
- 04地域データの所在要件に沿った配置
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ qdrant/ skills --skill qdrant-multitenancyインストール後、Claude Code で/qdrant-multitenancyを入力して読み込まれたか確認します。
詳細
Qdrant のマルチテナンシー
マルチテナンシーとは、1 つの Qdrant デプロイメント内で複数のユーザーまたはテナント間のデータを分離する方法です。
- 問うべきなのは、テナントはいくつあり、それぞれの規模にどれほど差があるかです。その答えによって分離戦略が決まります。
- 選択する前に、ペイロードベース、シャードベース、コレクションベースの 3 つの分離レベルを理解してください。
- ほとんどのケースでは、テナントごとにコレクションを作るのではなく、ペイロードで分割した単一のコレクションが適切なデフォルトです。
多数の小規模テナント(デフォルト:ペイロードによる分割)
適用するケース:規模が概ね同程度で、比較的小さいテナントが多数ある場合です。ほとんどのユーザーに推奨されるデフォルトです。
1 つのコレクションにすべてのテナントを格納します。ペイロードフィールドで所有者を示し、クエリ時にそのフィールドでフィルターすることで、各テナントの結果を分離します。
仕組み
is_tenant=trueを指定して、テナントフィールドにキーワードペイロードインデックスを作成します(このフラグには v1.11 以降が必要です)。is_tenantによって、Qdrant はこのフィールドがテナントを識別することを認識し、各テナントのベクトルをまとめて保存して、シーケンシャル読み取りで提供します。を確認してください。- クエリ時に、テナントフィールドに対する
mustフィルターで各テナントを分離します。このフィルターがないと、クエリはすべてのテナントのデータを検索します。ペイロードベースのマルチテナンシーを確認してください。 - テキストの関連度(BM25、または IDF 修飾子を使うスパースベクトル)は、シャード全体から計算された統計情報でスコアリングされるため、語彙の異なるテナント同士でスコアに影響します。Qdrant 1.19 以降では、
idf検索パラメーターにテナントフィルターを指定し、テナントフィールドをインデックス化してください。1.20 以降では、フルテキストインデックスに対する BM25 のtextクエリも対象になります。テナントごとのスコアリング統計を参照してください。 - この戦略では、規模が大きくなると、すべてのテナントが同じコレクションにインデックスを作成するため、インデックス作成速度がボトルネックになる可能性があります。これを避けるには、グローバル HNSW の作成(コレクション全体)を無効にし、テナントごとのインデックスのみを作成できます。
m=0と、ゼロ以外の値のpayload_mを設定してください。インデックス作成は高速化しますが、テナントフィルターなしのリクエストではすべてのグループをスキャンする必要があるため、処理が遅くなる点に注意してください。そのため、ボトルネックが発生し、テナント横断検索がまれな場合に限り、この方法を選択してください。パフォーマンスの調整を参照してください。
少数の大規模テナントと多数の小規模テナント(階層型マルチテナンシー)
適用するケース:大口顧客が少数と、小規模な顧客が多数存在し、小規模テナントが時間とともに成長する可能性もある、現実的な SaaS の構成です。v1.16 以降で利用できます。これにより、1 つの大規模テナントに合わせてクラスター全体をスケールさせる必要が生じ、コストが増加して他のすべてのテナントのパフォーマンスが低下する「ノイジーネイバー」問題を回避できます。
階層型マルチテナンシーでは、小規模テナントを共有フォールバックシャードにまとめ、大規模テナントを専用シャードに分離します。すべて 1 つのコレクション内で実現できます。 これは、論理的な分離のためのペイロードベースのテナンシーと、大規模テナントを物理的に分離してリソースを分けるためのカスタムシャーディングという、2 つの分離レベルを組み合わせたものです。共有シャードを超えて成長したテナントは、ダウンタイムなしで後から専用シャードに昇格できます。
仕組み
- カスタム(ユーザー定義)シャーディングを使用してコレクションを作成し、ペイロードベースのテナント分離を設定します。共有フォールバックシャードには、小規模なテナントをすべて格納します。大規模なテナントがある場合は、テナントごとに専用シャードを作成します。階層型マルチテナンシーを確認してください。
- テナントを昇格させるタイミングは?テナントが専用リソースを用意するのに十分な規模になった場合(テナントがインデックス作成のしきい値に近づいたときが、妥当な昇格の目安です)、専用シャードに昇格させます。Qdrant はデータを新しいシャードに透過的に移動し、その間も読み取りと書き込みを処理します。テナントを専用シャードに昇格させる方法を確認してください。
- 再シャーディングはコストが高く、時間のかかるプロセスになる可能性があるため、どのテナントに専用シャードを割り当てるかを決める際は、テナントの成長傾向を慎重に検討してください。
- クラスターあたりの専用シャード数は、約 1000 を超えないことをおすすめします(リソースのオーバーヘッドが発生するため)。
- フォールバックシャード(小規模なテナント)は、単一ノードに収まる必要があります。
- シャーディング方式はコレクション作成時に固定されます。自動シャーディングされたコレクション(デフォルト)を、作成後にカスタムシャーディングへ変換することはできません。後から大規模なテナントを分離する可能性が少しでもある場合は、最初からカスタムシャーディングでコレクションを作成し、すべてのテナントをフォールバックシャードに配置してください。
少数の異種テナント(テナントごとのコレクション)
用途:テナント数が限られており、テナントごとに異なる埋め込みモデルやコレクションスキーマを使用する場合です。
- 複数のコレクションを作成するのは、厳密な分離が必要なテナント数が限られている場合、またはテナントごとに異なる埋め込みモデルでベクトルを作成する場合に限るべきです。
データの保管場所と地理的分離(カスタムシャーディング)
用途:医療業界の地域規制への準拠など、データを物理的に特定の場所に配置する必要がある場合です(ある地域のデータはカナダに、別の地域のデータはドイツに配置するなど)。これはテナントだけに関する問題ではありません。単一のテナントでも、自身のデータを地域ごとに分ける必要がある場合があります。
- 階層型マルチテナンシーと同様に、カスタムシャーディングを使用します。異なるのは、シャーディングの基準です。ここでは、シャードキーに地域を使用します。各キーのデータは、特定の場所に配置できる特定のシャードに格納され、すべてのデータは一つのコレクションに収まります。地域内でテナントごとの分離も必要な場合は、ペイロードによるパーティショニングと組み合わせてください。設定方法については、ユーザー定義シャーディングを確認してください。
- 地理的なデータ保管場所の要件を満たせるのは、クラスターのノードが実際に対象地域にある場合に限られます。
- Qdrant Cloud は単一のリージョンにクラスターをデプロイするものであり、現在、マネージドのマルチリージョンには対応していません。
避けるべきこと
- ペイロードフィルターをセキュリティモデルのすべてとして扱うこと。Qdrant では(テナントごとのコレクションを使用している場合を除き)、テナントの分離はペイロードに基づきます。これはアプリケーション層の責任であり、フィルターはその一部にすぎません。