Queryable Encryptionでフィールドを暗号化し、暗号化されたフィールドでクエリを有効にすると、コレクションに必要なストレージが増加します。暗号化スキーマを確定する前に、これらの増加を見積もります。増加を変更するにはコレクションを再作成する必要があるためです。
これらのコレクション値は、 mongodb-qe-サイズ推定値エージェントを使用して、コレクションの パブリックリポジトリから直接、またはmongodb またはmongodb-atlas プラグインから計算できます。
Queryable Encryptionの詳細については、 Queryable Encryption のホワイトペーパーを参照してください。
このタスクについて
MongoDB は、クエリ可能な暗号化された各フィールドのインデックスを生成するタグ T を生成します。このタグは、暗号化されたコレクションごとに作成されるメタデータコレクションに保存されます。ストレージは、各値が生成するタグの数に応じて増加します。以下の式は、 値が生成できるタグの最大数の式です。
クエリできない(「インデックスなし」)フィールドではタグは生成されません(
T=0)。等価クエリ用にインデックス付けされたフィールドは、
T=1という 1 つのタグを生成します。プレフィックスまたはサフィックス クエリのインデックス作成されたフィールドは、1 つの初期タグを生成し、クエリの最大長と最小長の差(
T = 1 + (strMaxQueryLength - strMinQueryLength + 1))に応じて直線的に増加します。プレフィックス クエリとサフィックス クエリの両方でインデックス付けされたフィールドは、プレフィックス クエリとサフィックス クエリの最大長と最小長さの差に応じて直線的に増加します。
T = 1 + (strMaxQueryLength_prefix - strMinQueryLength_prefix + 1) + (strMaxQueryLength_suffix - strMinQueryLength_suffix + 1)部分文字列 クエリ用にインデックスされたフィールドは、
T = 1 + (strMaxQueryLength - strMinQueryLength + 1) * (2 * strMaxLength + 2 - strMaxQueryLength - strMinQueryLength) / 2という式を使用して、ほとんどのタグを生成します。
コレクションでQueryable Encryptionを有効にすると、ディスクストレージとメモリへの影響が計算された よりも小さくなる可能性があります。これらの式は最大のケースを防ぎます。
重要
暗号化されたフィールド値を書き込むたびに、タグごとに 2 つのメタデータドキュメントが書き込まれます。1 つは ESC に、1 つは ECOC に 1 つのメタデータ ドキュメントを書込むため、スループットスループットはストレージと同様に、タグ数に応じてスケーリングされます。
クエリ タイプ別のタグの変更
プレフィックス クエリとサフィックス クエリの場合、最大クエリ長と最小クエリ長の差のみがタグの増加に影響します。部分文字列クエリの場合、すべてのパラメーターが貢献します。検索可能な長さが最大の貢献要素です。次の表は、strMaxLength が 50 で、strMinQueryLength が 2 であると仮定して、strMaxQueryLength の増加に応じて stringフィールドが生成するタグの数を比較します。部分文字列クエリでは最大 6 の最大 strMaxQueryLength が強制されるため、この表ではプレフィックスとサフィックス クエリではより高い値が許可されているにもかかわらず、2 から 6 の値のみが比較されます。
strMaxQueryLength | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|
| 2 | 3 | 4 | 5 | 6 |
| 50 | 98 | 145 | 191 | 236 |
この増加に対応するために、 複数のフィールドで部分文字列クエリを有効にしないようにしてください。プレフィックスとサフィックス クエリがニーズを満たせず、コレクションに含まれるドキュメントが 5000 万未満の場合にのみ有効にしてください。
始める前に
次の情報があることを確認してください。
暗号化されたフィールドを含むコレクション内のドキュメントの数。
各暗号化されたフィールドのプレーンテキスト値の平均バイト長。
暗号化する予定のフィールドの数と、その暗号化されたクエリ構成。
手順
各フィールドとクエリタイプごとにワーストケースのタグ数を計算します。
暗号化されたフィールドごとに、単一の値が生成するタグの数の上限である T を計算します。フィールドごとに 1 つの T を計算します。プレフィックス クエリとサフィックス クエリの両方にインデックス付けされたフィールドは、両方のクエリ タイプを組み合わせた単一の式を使用します。
インデックスのないフィールドの場合、
T = 0。等価クエリ用にインデックスされたフィールドの場合、
T = 1。prefixまたはsuffixクエリのインデックス付きフィールドの場合:T = 1 + (strMaxQueryLength - strMinQueryLength + 1) prefixクエリとsuffixクエリの両方でインデックス付けされたフィールドの場合:T = 1 + (strMaxQueryLength_prefix - strMinQueryLength_prefix + 1) + (strMaxQueryLength_suffix - strMinQueryLength_suffix + 1) substringクエリのインデックスが作成されたフィールドの場合:T = 1 + (strMaxQueryLength - strMinQueryLength + 1) * (2 * strMaxLength + 2 - strMaxQueryLength - strMinQueryLength) / 2 例、
strMinQueryLength2、strMaxQueryLength6、strMaxLength50 を含むフィールドの場合は次のようになります。T = 1 + (6 - 2 + 1) * (2 * 50 + 2 - 6 - 2) / 2 = 1 + 5 * 94 / 2 = 236
各フィールドのドキュメントストレージを計算します。
前のステップのタグ数を使用して、フィールドに 1 つのドキュメントに必要なストレージを計算します(バイト単位)。次の式を使用します。ここで、v はフィールドの非暗号化値の平均バイト長です。
インデックスのないフィールドの場合は、以下を使用します。
document storage = 71 + ceil((v+6)/16) * 16
その他のフィールドには、次を使用します。
document storage = 1.2 * (255 * T + 122 + ceil((v + 6) / 16) * 16)
ドキュメントがサイズ制限内にあることを確認します。暗号化された値とそのメタデータ数は、16 MB BSONドキュメント サイズ の制限に加算されます。
インデックスストレージ、 ディスクの合計ストレージ、およびメモリを計算します。
すべてのフィールドの T 値を合計して T_Total にします。次に、N を使用して、暗号化されたフィールドを含むドキュメントの数を使用し、次の値を計算します(バイト単位)。
index storage = 1.2 * (67 * T_Total + 640)
total disk storage = N * (index storage + sum of the document storage per field)
memory = N * (52 * T_Total + 17)
ディスクストレージをGBに変換するには、1、000、000、000 で割ります。 1、073、741、824 で割ってメモリを GiB に変換します。
推定値を配置のキャパシティーと比較します。
ディスクとメモリへの推定影響を現在のコレクションサイズに追加し、合計値を配置内で使用可能なストレージとメモリと比較します。
配置がストレージとメモリの要件を満たしている場合は、 暗号化スキーマの作成 に進みます。
配置が要件を満たしていない場合は、次のオプションを検討してください。
部分文字列クエリをプレフィックスまたは接尾辞クエリに置き換える
部分文字列クエリのインデックス作成されたフィールドの
strMaxLengthを削減部分文字列クエリ用のインデックス付きフィールドで
strMinQueryLengthからstrMaxQueryLengthの範囲を絞り込む
暗号化されたフィールドのクエリ構成オプションの詳細については、「 フィールド リファレンス 」を参照してください。
詳細
暗号化されたフィールドとクエリ タイプを設定するには、「 暗号化スキーマの作成 」を参照してください。
各構成オプションがセキュリティとパフォーマンスにどのように影響するかについては、「 最適な検索およびストレージのための暗号化されたフィールドの構成 」を参照してください。