Es importante comprender el rendimiento y los costos de almacenamiento del cifrado a nivel de campo. Cada campo cifrado:
Agrega escrituras para insertar y actualizar operaciones.
Se requiere almacenamiento adicional, ya que MongoDB mantiene un índice de campo cifrado.
En esta sección se enumeran las escrituras por operación y se explica cómo compactar índices de recopilación cifrados para poder minimizar los costos de escritura y almacenamiento.
Overview
El cifrado consultable presenta la capacidad de cifrar campos confidenciales en sus documentos mediante cifrado aleatorio, sin dejar de poder consultar los campos cifrados.
Con el cifrado consultable, un valor de texto simple siempre se cifra en un texto cifrado diferente, sin dejar de ser consultable. Para habilitar esta funcionalidad, el cifrado consultable utiliza tres estructuras de datos:
Dos colecciones de metadatos
Un campo en cada documento de la colección cifrada llamado
__safeContent__
Importante
Es fundamental que estas estructuras de datos no se modifiquen ni eliminen, o los resultados de la consulta serán incorrectos.
Colecciones de metadatos
Cuando crea una colección cifrada, MongoDB crea dos colecciones de metadatos:
enxcol_.<collectionName>.esc, conocido comoESCenxcol_.<collectionName>.ecoc, conocido comoECOC
Ejemplo
Si crea una colección llamada "pacientes", MongoDB crea las siguientes colecciones de metadatos:
enxcol_.patients.escenxcol_.patients.ecoc
Al insertar documentos con un campo cifrado consultable, MongoDB actualiza las colecciones de metadatos para mantener un índice que permite la consulta. El campo se convierte en un "campo indexado". Esto implica un coste en almacenamiento y velocidad de escritura para cada uno de estos campos.
Eliminación de colecciones cifradas
Al eliminar una colección cifrada, elimine las colecciones de metadatos asociadas enxcol_.<collectionName>.esc y enxcol_.<collectionName>.ecoc inmediatamente después. De lo contrario, volver a crear la colección con el mismo nombre genera un conflicto entre las colecciones de metadatos, lo que consume demasiado espacio de almacenamiento y reduce el rendimiento de CRUD.
Costos de almacenamiento
Los costos de almacenamiento y escritura aumentan según la cantidad de campos indexados por documento.
Importante
Se espera que una colección de cifrado consultable tenga entre 2y3 veces los requisitos de almacenamiento de los documentos para cubrir las colecciones de metadatos. Por ejemplo, una colección de 1 GB puede tener un requisito de almacenamiento de entre 2y3 GB.
Costos de escritura
Operaciones de inserción
Al insertar un documento, cada campo indexado requiere dos escrituras adicionales en las colecciones de metadatos.
Uno escribe a
ESCUno escribe a
ECOC
Ejemplo
Para insertar un documento con dos campos indexados se requiere:
Un guardado en la colección cifrada.
Cuatro escrituras en las colecciones de metadatos.
Operaciones de actualizar
Al actualizar un documento, cada campo indexado requiere dos escrituras adicionales en las colecciones de metadatos.
Uno escribe a
ESCUno escribe a
ECOC
Ejemplo
Para actualizar un documento con dos campos indexados se requiere:
Un guardado en la colección cifrada.
Cuatro escrituras en las colecciones de metadatos.
Operaciones de borrar
Al eliminar un documento, los campos indexados no requieren escrituras adicionales.
Compactación de la colección de metadatos
Al insertar o actualizar documentos, las colecciones de metadatos cambian y crecen. La compactación de colecciones de metadatos las reduce y reduce su tamaño.
Importante
Debe ejecutar manualmente la compactación de la recopilación de metadatos. La compactación solo funciona en clientes configurados para el cifrado consultable.
Ejecute la compactación cuando el tamaño de ECOC supere 1 GB.
Puedes comprobar el tamaño de tus colecciones usando mongosh y emitiendo el db.collection.totalSize() comando.
Ejemplo
En este ejemplo, la colección cifrada se llama "pacientes".
db.enxcol_.patients.ecoc.totalSize()
1407960328
Para ejecutar la compactación de la colección de metadatos, utilice mongosh y ejecute el db.collection.compactStructuredEncryptionData() comando para reducir el tamaño de las colecciones de metadatos.
Ejemplo
const eDB = "encryption" const eKV = "__keyVault" const secretDB = "records" const secretCollection = "patients" const localKey = fs.readFileSync("master-key.txt") const localKeyProvider = { key: localKey } const queryableEncryptionOpts = { kmsProviders: { local: localKeyProvider }, keyVaultNamespace: `${eDB}.${eKV}`, } const encryptedClient = Mongo("localhost:27017", queryableEncryptionOpts) const encryptedDB = encryptedClient.getDB(secretDB) const encryptedCollection = encryptedDB.getCollection(secretCollection) encryptedCollection.compactStructuredEncryptionData()
{ "stats": { ... }, "ok": 1, ... }