El motor de almacenamiento en memoria forma parte de la disponibilidad general (GA) en compilaciones de 64bits. Salvo algunos metadatos y datos de diagnóstico, el motor de almacenamiento en memoria no conserva ningún dato en disco, como datos de configuración, índices, credenciales de usuario, etc.
Al evitar la E/S de disco, el motor de almacenamiento en memoria permite una latencia más predecible de las operaciones de la base de datos.
Especificar el motor de almacenamiento en memoria
Para seleccionar el motor de almacenamiento en memoria, especifique:
inMemoryPara el--storageEngineopción, o la configuración si utiliza un archivo destorage.engineconfiguración.--dbpatho si se usa un archivo de configuración. Aunque el motor de almacenamiento en memoria no escribe datos en el sistema de archivos, mantienestorage.dbPathen--dbpathpequeños archivos de metadatos y datos de diagnóstico, así como archivos temporales para crear índices grandes.
Por ejemplo, desde la línea de comandos:
mongod --storageEngine inMemory --dbpath <path>
O, si utiliza el formato de archivo de configuración YAML:
storage: engine: inMemory dbPath: <path>
Consulte las opciones de inMemory para conocer las opciones de configuración específicas de este motor de almacenamiento. La mayoría de las mongod opciones de configuración están disponibles para su uso con el motor de almacenamiento en memoria, excepto las relacionadas con la persistencia de datos, como el registro en diario o la configuración del cifrado en reposo.
Advertencia
El motor de almacenamiento en memoria no conserva los datos después del cierre del proceso.
Concurrencia de transacciones (lectura y escritura)
A partir de la versión 7.0, MongoDB utiliza un algoritmo por defecto para ajustar dinámicamente el número máximo de transacciones concurrentes del motor de almacenamiento, o tickets de lectura y escritura. El algoritmo de transacciones del motor de almacenamiento concurrente dinámico optimiza el rendimiento de la base de datos durante la sobrecarga del clúster.
Nota
El algoritmo dinámico también resulta en un menor uso general de tickets, incluso en condiciones normales, porque el algoritmo comienza con un número base de tickets disponibles mucho más bajo. Como resultado, al actualizar a MongoDB 7.0, se puede observar una caída significativa en el uso de tickets, lo que es un comportamiento esperado.
El número máximo de transacciones concurrentes en el motor de almacenamiento, o tickets de lectura y escritura, nunca supera 128 tickets de lectura y 128 de escritura, y puede variar entre nodos dentro de un clúster. El número máximo de tickets de lectura y escritura dentro de un solo nodo siempre son iguales.
Para especificar un número máximo de transacciones de lectura y escritura, o de tickets de lectura y escritura, que el máximo dinámico no puede superar, se debe usar storageEngineConcurrentReadTransactions y storageEngineConcurrentWriteTransactions.
Si deseas deshabilitar el algoritmo de transacciones del motor de almacenamiento dinámico concurrente, presenta una solicitud de soporte para trabajar con un Ingeniero de Servicios Técnicos de MongoDB.
Concurrencia a nivel de documento
El motor de almacenamiento en memoria utiliza control de concurrencia a nivel de documento para las operaciones de escritura. Como resultado, varios clientes pueden modificar diferentes documentos de una colección simultáneamente.
Uso de memoria
El motor de almacenamiento en memoria requiere que todos sus datos (incluidos los índices,mongod el registro de operaciones si la instancia es parte de un conjunto de réplicas, etc.) se ajusten a la --inMemorySizeGB opción de línea de comandos especificada storage.inMemory.engineConfig.inMemorySizeGBo a la configuración en el archivo de configuración YAML.
Por defecto, el motor de almacenamiento en memoria utiliza el 50% de la RAM física menos 1 GB.
Si una operación de escritura hiciera que los datos excedieran el tamaño de memoria especificado, MongoDB devuelve el error:
"WT_CACHE_FULL: operation would overflow cache"
Para especificar un nuevo tamaño, utilice la configuración en el storage.inMemory.engineConfig.inMemorySizeGB formatodel archivo de configuración YAML:
storage: engine: inMemory dbPath: <path> inMemory: engineConfig: inMemorySizeGB: <newSize>
O utilice la opción de línea de --inMemorySizeGB comando:
mongod --storageEngine inMemory --dbpath <path> --inMemorySizeGB <newSize>
Durabilidad
El motor de almacenamiento en memoria no es persistente y no escribe datos en un almacenamiento persistente. Los datos no persistentes incluyen datos de aplicaciones y del sistema, como usuarios, permisos, índices, configuración del conjunto de réplicas, configuración del clúster fragmentado, etc.
Como tal, el concepto de diario o de esperar a que los datos se vuelvan duraderos no se aplica al motor de almacenamiento en memoria.
Si cualquier miembro votante de un conjunto de réplicas utiliza el motor de almacenamiento en memoria, debe writeConcernMajorityJournalDefault configurar false a.
Nota
A partir de la versión 4.2 (y 4.0.13 3.6.14y), si un miembro del conjunto de réplicas usa el motor de almacenamiento en memoria (con votación o sin votación) pero el conjunto de writeConcernMajorityJournalDefault réplicas tiene establecido como verdadero, el miembro del conjunto de réplicas registra una advertencia de inicio.
Con writeConcernMajorityJournalDefault configurado en false, MongoDB no espera a que las escrituras w: "majority" se registren en la bitácora en disco antes de confirmar las escrituras. Por lo tanto, "majority" las operaciones de escritura podrían revertirse en caso de una pérdida transitoria (p. ej., caída y reinicio) de la mayoría de los nodos en un set de réplicas determinado.
Las operaciones de escritura que especifican un journaled nivel de confirmación de escritura (write concern) se reconocen de inmediato. Cuando una instancia mongod se apaga, ya sea como resultado del comando shutdown o debido a un error del sistema, la recuperación de los datos en memoria es imposible.
Transacciones
Las transacciones se admiten en conjuntos de réplicas y clústeres fragmentados donde:
El principal utiliza el motor de almacenamiento WiredTiger y
Los miembros secundarios utilizan el motor de almacenamiento WiredTiger o los motores de almacenamiento en memoria.
Nota
No se pueden ejecutar transacciones en un clúster fragmentado que tenga un fragmento con writeConcernMajorityJournalDefault establecido false en, como un fragmento con un miembro con derecho a voto que use el motor de almacenamiento en memoria.
Arquitecturas de implementación
Además demongod ejecutarse de manera independiente, las instancias que utilizan un motor de almacenamiento en memoria pueden ejecutarse como parte de un conjunto de réplicas o parte de un clúster fragmentado.
Set de réplicas
Puede implementar instancias que utilicen un motor de almacenamiento en memoria como parte de un conjunto de réplicas. Por ejemplo, como parte de un conjunto de réplicas de tres miembros, podría mongod tener:
Dos instancias se ejecutan con motor de almacenamiento en
mongodmemoria.Una instancia
mongodse ejecuta con el motor de almacenamiento WiredTiger. Configure el miembro WiredTiger como oculto (es decir,hidden: truepriority: 0y).
Con este modelo de implementación, solo las mongod instancias que se ejecutan con el motor de almacenamiento en memoria pueden convertirse en las principales. Los clientes se conectan únicamente a las instancias del motor de almacenamiento mongod en memoria. Incluso si ambas mongod instancias que ejecutan el motor de almacenamiento en memoria fallan y se reinician, pueden sincronizarse desde el miembro que ejecuta WiredTiger. La mongod instancia oculta que se ejecuta con WiredTiger persiste los datos en el disco, incluyendo los datos de usuario, los índices y la información de configuración de replicación.
Nota
El motor de almacenamiento en memoria requiere que todos sus datos (incluyendo el oplog si mongod forma parte del set de réplicas, etc.) quepan en la opción de línea de comandos --inMemorySizeGB especificada o en la configuración storage.inMemory.engineConfig.inMemorySizeGB. Consulta Uso de memoria.
Clúster fragmentado
Puede implementar instancias que utilicen un motor de mongod almacenamiento en memoria como parte de un clúster fragmentado. El motor de almacenamiento en memoria evita la E/S de disco para permitir una latencia de operación de la base de datos más predecible. En un clúster fragmentado, un fragmento puede constar de una sola mongod instancia o de un conjunto de réplicas. Por ejemplo, podría tener un fragmento que conste del siguiente conjunto de réplicas:
Dos instancias se ejecutan con un motor de almacenamiento en
mongodmemoriaUna instancia
mongodse ejecuta con el motor de almacenamiento WiredTiger. Configure el miembro WiredTiger como oculto (es decir,hidden: truepriority: 0y).
A este fragmento,tag inmem añada. Por ejemplo, si este fragmento se shardC llama, conéctese mongos a y sh.addShardTag() ejecute.
Por ejemplo,
sh.addShardTag("shardC", "inmem")
A los demás fragmentos, agregue una etiqueta separada persisted .
sh.addShardTag("shardA", "persisted") sh.addShardTag("shardB", "persisted")
Para cada colección fragmentada que debería residir en el inmem fragmento, assign to the entire chunk range la inmem etiqueta:
sh.addTagRange("test.analytics", { shardKey: MinKey }, { shardKey: MaxKey }, "inmem")
Para cada colección fragmentada que debería residir en los persisted fragmentos, assign to the entire chunk range la persisted etiqueta:
sh.addTagRange("salesdb.orders", { shardKey: MinKey }, { shardKey: MaxKey }, "persisted")
Para el fragmento inmem, cree una base de datos o mueva la base de datos.
Nota
El nivel de preocupación de lectura no es compatible oficialmente con el motor de almacenamiento en memoria."snapshot"