Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/

Preguntas frecuentes: Almacenamiento de MongoDB para implementaciones autogestionadas

Este documento aborda preguntas frecuentes sobre el sistema de almacenamiento de MongoDB.

Un motor de almacenamiento es la parte de una base de datos responsable de gestionar el almacenamiento de los datos, tanto en memoria como en disco. Muchas bases de datos admiten varios motores de almacenamiento, y cada uno ofrece un mejor rendimiento para cargas de trabajo específicas. Por ejemplo, un motor de almacenamiento podría ofrecer un mejor rendimiento para cargas de trabajo con mucha lectura, mientras que otro podría ofrecer un mayor rendimiento para operaciones de escritura.

Tip

Motores de almacenamiento para implementaciones autogestionadas

Sí. Puedes tener miembros de set de réplicas que usen diferentes motores de almacenamiento (WiredTiger y en memoria)

El rendimiento del clúster podría degradarse una vez que el número combinado de colecciones e índices supere los 100,000. Además, muchas colecciones grandes tienen un mayor impacto en el rendimiento que las colecciones más pequeñas.

Sí. Ver:

La relación de datos comprimidos a datos no comprimidos depende de tus datos y de la librería de compresión utilizada. Por defecto, los datos de la colección en WiredTiger utilizan compresión de bloques Snappy; también están disponibles las compresiones zlib y zstd. El uso de índices de datos utiliza la reducción de prefijo por defecto.

Con WiredTiger, MongoDB utiliza tanto la caché interna de WiredTiger como la caché del sistema de archivos.

El tamaño de caché interno por defecto de WiredTiger es el mayor de los siguientes:

  • El 50% de (RAM - 1GB), o

  • 0.256 GB.

Por ejemplo, en un sistema con un total de 4GB de RAM, la caché WiredTiger utiliza 1.5GB de RAM (0.5 * (4GB - 1GB) = 1.5 GB). Al proporcionar un tamaño específico de caché, asegúrate de que la RAM no supere los límites de 0.256GB a 10000GB.

Evita aumentar el tamaño de la caché interna de WiredTiger por encima de su valor predeterminado. Si tu caso requiere hacerlo, puedes usar --wiredTigerCacheSizePct para contabilizar cambios de memoria debido a aumentos verticales. Debes especificar un porcentaje de hasta un 80% de la memoria disponible. Los valores calculados pueden oscilar entre 0.256GB y 10000GB. Por ejemplo, en un sistema con 2GB de RAM, el --wiredTigerCacheSizePct no puede configurarse en 10 porque el 10% de 2GB es 0.2 GB, lo que es menor que 0.256GB.

Nota

En algunos casos, como al ejecutarse en un contenedor configurado para usar menos RAM que la memoria asignada al host, es necesario tener en cuenta los límites. Es posible que deba configurar la caché de WiredTiger con un valor adecuado, ya que WiredTiger podría no tener en cuenta los límites de memoria del contenedor específico en ciertos casos.

Para ver, el valor que WiredTiger utiliza como memory limit hostInfo la cantidad máxima de RAM disponible, utilice el comando.

Por defecto, WiredTiger utiliza la compresión de bloques Snappy para todas las colecciones y la reducción de prefijo para todos los índices. Los valores de compresión por defecto son configurables a nivel global y también pueden establecerse por colección y por índice durante la creación de colecciones e índices.

Se utilizan diferentes representaciones para los datos en la caché interna de WiredTiger frente al formato en disco:

  • Los datos en la caché del sistema de archivos son idénticos al formato en disco, incluidos los beneficios de cualquier compresión para los archivos de datos. La caché del sistema de archivos es utilizada por el sistema operativo para reducir la E/S del disco.

  • Los índices cargados en la caché interna de WiredTiger tienen una representación de datos diferente al formato en disco, pero aún pueden aprovechar la reducción de prefijo de índice para reducir el uso de RAM. La reducción de prefijo de índice elimina duplicados de los prefijos comunes de los campos indexados.

  • Los datos de la colección en la caché interna de WiredTiger están sin comprimir y utilizan una representación diferente al formato en disco. La compresión de bloques puede proporcionar un ahorro significativo de almacenamiento en disco, pero los datos deben ser descomprimidos para que el servidor los manipule.

Con la caché del sistema de archivos, MongoDB utiliza automáticamente toda la memoria libre que no está siendo utilizada por la caché de WiredTiger ni por otros procesos.

Para ajustar el tamaño de la caché interna de WiredTiger, consulta --wiredTigerCacheSizeGB y storage.wiredTiger.engineConfig.cacheSizeGB. Se debe evitar aumentar el tamaño de la caché interna de WiredTiger por encima de su valor por defecto. Si el caso de uso requiere un aumento del tamaño de la caché interna, consulta --wiredTigerCacheSizePct y storage.wiredTiger.engineConfig.cacheSizePct.

Nota

El storage.wiredTiger.engineConfig.cacheSizeGB limita el tamaño de la caché interna de WiredTiger. El sistema operativo utiliza la memoria libre disponible para la caché del sistema de archivos, lo que permite que los archivos de datos comprimidos de MongoDB permanezcan en la memoria. Además, el sistema operativo utiliza cualquier RAM libre para almacenar en búfer los bloques del sistema de archivos y la caché del sistema de archivos.

Para acomodar a los consumidores adicionales de RAM, es posible que debas reducir el tamaño de la caché interna de WiredTiger.

El valor por defecto del tamaño de la caché interna de WiredTiger asume que hay una única instancia de mongod por máquina. Si una sola máquina contiene varias instancias de MongoDB, reduce la configuración para acomodar las otras instancias mongod.

Si ejecutas mongod en un contenedor (por ejemplo, lxc, cgroups, Docker, etc.) que no tiene acceso a toda la RAM disponible en un sistema, debes establecer storage.wiredTiger.engineConfig.cacheSizeGB o storage.wiredTiger.engineConfig.cacheSizePct a un valor inferior a la cantidad de RAM disponible en el contenedor. La cantidad exacta depende de los otros procesos que se ejecutan en el contenedor. Consulta memLimitMB.

Solo puedes proporcionar uno de storage.wiredTiger.engineConfig.cacheSizeGB o storage.wiredTiger.engineConfig.cacheSizePct.

Para ver las estadísticas sobre la caché y la tasa de desalojos, consultar el campo wiredTiger.cache devuelto por el comando serverStatus.

Cada conexión usa hasta 1 megabyte de RAM.

Para optimizar el uso de memoria para las conexiones, asegúrate de:

  • Supervise the number of open connections to your implementación. Demasiadas conexiones abiertas provocan un uso excesivo de la RAM y reducen la memoria disponible para el conjunto de trabajo.

  • Cierra pool de conexiones cuando ya no sean necesarios. Un pool de conexiones es una caché de conexiones de base de datos abiertas y listas para usar, mantenida por el controlador. Cerrar los grupos innecesarios hace que haya recursos de memoria adicionales disponibles.

  • Administre el tamaño de su grupo de conexiones. La maxPoolSize opción de cadena de conexión especifica el número máximo de conexiones abiertas en el grupo. De forma predeterminada, puede tener hasta 100 conexiones abiertas en el grupo. Al reducir el valor de, se maxPoolSize reduce la cantidad máxima de RAM utilizada para las conexiones.

    Tip

    Para configurar tu pool de conexiones, consulta Ajustes de configuración del pool de conexiones.

Puntos de control
MongoDB configura WiredTiger para crear puntos de control, específicamente, escribiendo los datos del snapshot en el disco a intervalos de 60 segundos.
Journal Data
WiredTiger sincroniza los registros de bitácora almacenados en búfer con el disco bajo cualquiera de las siguientes condiciones:
  • Para los miembros del set de réplicas (miembros primarios y secundarios):

    • Si una operación de guardar incluye o implica un nivel de confirmación de escritura (write concern) de j: true.

    • Adicionalmente para los miembros secundarios, después de cada aplicación en lotes de las entradas del oplog.

    Nota

    El nivel de confirmación de escritura (write concern) "majority" implica j: true si el writeConcernMajorityJournalDefault es verdadero.

  • Cada 100 milisegundos (ver storage.journal.commitIntervalMs).

  • Cuando WiredTiger crea un nuevo archivo de diario. Puesto que MongoDB utiliza un límite de tamaño de archivo de diario de 100 MB, WiredTiger crea un nuevo archivo de diario aproximadamente cada 100 MB de datos.

El motor de almacenamiento de WiredTiger mantiene listas de registros vacíos en los archivos de datos a medida que elimina documentos. WiredTiger puede reutilizar este espacio, pero no se devolverá al sistema operativo a menos que se den circunstancias muy específicas.

La cantidad de espacio vacío disponible para reutilización por WiredTiger se refleja en la salida de db.collection.stats() bajo el encabezado wiredTiger.block-manager.file bytes available for reuse.

Para permitir que el motor de almacenamiento WiredTiger libere este espacio vacío al sistema operativo, puedes desfragmentar tu archivo de datos. Esto puede lograrse resincronizando un miembro del set de réplicas o usando el comando compact.

Para ver las estadísticas de una colección, incluyendo el tamaño de los datos, utiliza el método db.collection.stats() desde dentro de mongosh. El siguiente ejemplo emite para db.collection.stats() la orders colección:

db.orders.stats();

MongoDB también proporciona los siguientes métodos para devolver tamaños específicos para la colección:

El siguiente script imprime las estadísticas de cada base de datos:

db.adminCommand("listDatabases").databases.forEach(function (d) {
mdb = db.getSiblingDB(d.name);
printjson(mdb.stats());
})

El siguiente script imprime las estadísticas de cada colección en cada base de datos:

db.adminCommand("listDatabases").databases.forEach(function (d) {
mdb = db.getSiblingDB(d.name);
mdb.getCollectionNames().forEach(function(c) {
s = mdb[c].stats();
printjson(s);
})
})

Para ver el tamaño de los datos asignados a cada índice, usa el db.collection.stats() método y revisa el campo indexSizes en el documento devuelto.

Si un índice utiliza reducción de prefijo (que es el default for WiredTiger), el tamaño devuelto para ese índice refleja el tamaño comprimido.

El db.stats() método en devuelve el estado actual de la base de datos activa. Para obtener la descripción de los campos devueltos, consulte la sección "Salida mongosh de dbStats".

Volver

Gestionar el registro en la bitácora

En esta página