Bloqueo en MongoDB

Bilal Shahid 20 junio 2023
  1. Bloqueo en MongoDB
  2. Niveles de bloqueo en MongoDB
  3. Modos de bloqueo en MongoDB
  4. Comprobar el estado de bloqueo en MongoDB
  5. Conclusión
Bloqueo en MongoDB

En los sistemas de gestión de bases de datos, el mecanismo de bloqueo garantiza la coherencia en todos los resultados.

Por ejemplo, un comando de lectura no se puede ejecutar simultáneamente si se realiza algún procedimiento de escritura sobre los datos. Los recursos de la base de datos están “bloqueados” para evitar imprecisiones en los datos resultantes de tales situaciones.

MongoDB también utiliza el bloqueo para garantizar la coherencia de los datos, ya que varios clientes pueden acceder o modificar los mismos datos al mismo tiempo. En este artículo, explicaremos el concepto de bloqueo en MongoDB.

Bloqueo en MongoDB

El bloqueo en MongoDB funciona de manera diferente al bloqueo en otros sistemas de administración de bases de datos relacionales. Permítanos describirle cómo funciona el bloqueo en MongoDB.

MongoDB hace uso del bloqueo de granularidad múltiple. Esto significa que los procesos se pueden bloquear a nivel global, de base de datos o de colección, o incluso a nivel de documento para motores de almacenamiento individuales.

Estos niveles de bloqueo se describirán más adelante en el artículo. En las versiones recientes de MongoDB, a partir de la v2.2, existe un latch lector/escritor para cada base de datos.

Debido a estos pestillos de lector/escritor, es posible el acceso simultáneo a los recursos de la base de datos. Vamos a explicar cómo funcionan estos.

Pestillo de lector/grabador

El latch lector/escritor de MongoDB se puede explicar mejor con las siguientes propiedades:

  1. Es un lector múltiple. Esto significa que cualquier número de lectores puede acceder a las colecciones simultáneamente sin afectar la consistencia de los datos ya que los datos no se modifican, solo se leen.

  2. Es un escritor único. Esto significa que solo puede haber un escritor a la vez para garantizar la coherencia de los datos.

  3. Es escritor-codicioso. Ser escritor codicioso significa que los escritores tienen prioridad sobre los lectores.

    Por lo tanto, si un escritor solicita usar la base de datos, todos los lectores entrantes se bloquean (o bloquean) temporalmente hasta que completen su trabajo.

    Sin embargo, el escritor espera hasta que los lectores actuales se vayan. Esta implementación evita que los escritores pasen hambre indefinidamente.

Nota: El pestillo del lector/escritor se denomina bloqueo del lector/escritor. Sin embargo, llamarlo pestillo es más apropiado ya que es liviano.

Debido a la presencia de este pestillo en MongoDB, cualquier consulta simultánea se puede ejecutar sin conflictos de bloqueo importantes.

Aquí, el pestillo del escritor se vuelve interesante porque, en MongoDB, todos los que escriben operaciones en un solo documento se consideran atómicos. Dado que la operación de escritura es atómica, el kernel de MongoDB mantiene el pestillo del escritor solo durante el tiempo que lleva actualizar un solo documento.

Por lo tanto, si se ejecuta una operación de escritura de ejecución lenta (debido a un diseño de esquema deficiente o a la paginación de un documento desde el disco, por ejemplo), se dice que ha cedido el pestillo.

Otra cosa a tener en cuenta es que, como se especificó anteriormente, MongoDB tiene un pestillo de lectura/escritura independiente para cada base de datos. Para explicar esto, supongamos que tenemos dos bases de datos, A y B.

Para una operación de “escritura” en la base de datos A, el escritor adquirirá un pestillo separado en comparación con las operaciones de “escritura” en la base de datos B.

De manera similar, si varias conexiones a la base de datos realizan operaciones de “escritura” al mismo tiempo, los latches se mantendrán por base de datos. Además, estas conexiones simultáneas estarán intercaladas.

Nota: puede parecer que debido al bloqueo, el rendimiento y la velocidad del sistema de la base de datos se ven afectados. En realidad, esto no es una gran preocupación ya que, para la carga promedio, MongoDB satura la capacidad de E/S del disco o SSD antes de que el porcentaje de bloqueo en una base de datos supere el 50 %.

Por lo tanto, decimos que el bloqueo en MongoDB no es por conexión. Más bien, es por mongod.

mongod se refiere al proceso en segundo plano principal del sistema MongoDB, que gestiona las solicitudes de datos, el acceso a los datos y otras operaciones en segundo plano.

Niveles de bloqueo en MongoDB

En MongoDB, hay cuatro niveles de bloqueo:

  1. Bloqueo a nivel global: Esto también se conoce como bloqueo a nivel de instancia. Esto implica que todas las bases de datos estarán bloqueadas.
  2. Bloqueo a nivel de base de datos: Solo la base de datos especificada se bloqueará en este tipo de bloqueo.
  3. Bloqueo a nivel de colección: en MongoDB, una colección es un grupo de documentos relacionados (similar a una tabla en RDBMS tradicional). Las manijas de bloqueo a nivel de colección se bloquean para colecciones individuales.
  4. Bloqueo a nivel de documento: un documento en MongoDB se puede denominar un registro que tiene pares de campo y valor. Este tipo de bloqueo bloquea únicamente el documento en particular.

Modos de bloqueo en MongoDB

En MongoDB, hay cuatro modos de bloqueo, que se explican a continuación.

  1. R: Representa un candado Compartido (S). Este modo de bloqueo se utiliza para los lectores.

    Los recursos se compartirán entre los lectores, accediendo a ellos simultáneamente en esta modalidad.

  2. W: Representa un candado Exclusivo (X). Este modo de bloqueo se utiliza para escritores.

    En este modo, los recursos no estarán disponibles para otros lectores o escritores simultáneos.

  3. r: Esto representa un bloqueo Intent Shared (IS). Es un bloqueo de intención de nivel superior.

    Dichos bloqueos se adquieren antes de pasar a bloqueos de nivel inferior. Por ejemplo, si se adquiere un bloqueo r en el nivel de la base de datos, significa que ahora se puede adquirir un bloqueo R en los niveles (inferiores) de la colección y del documento.

  4. w: Esto representa un bloqueo Intent Exclusive (IX). También es un bloqueo de intención de nivel superior.

    De manera similar a cómo funciona un bloqueo r, si se adquiere un bloqueo w en el nivel de la base de datos, significa que ahora se puede adquirir un bloqueo W en los niveles (inferiores) de colección y documento.

Comprobar el estado de bloqueo en MongoDB

Entonces, ¿hay alguna forma de verificar el estado de los bloqueos en su instancia mongod? Sí, puede hacerlo utilizando el siguiente método:

db.serverStatus()

Puede usar este método para monitorear los bloqueos en varios niveles, por ejemplo:

  1. Para el nivel global, utilice este código db.serverStatus().globalLock.
  2. Para el nivel de la base de datos, utilice este código db.serverStatus().locks.Database.
  3. Para el nivel de colección, utilice este código db.serverStatus().locks.Collection.
  4. Para monitorear bloqueos en oplog (registro de operaciones), use este código db.serverStatus().locks.oplog.

También puede utilizar el siguiente método:

db.currentOp()

Conclusión

Este artículo explica el concepto de bloqueo en MongoDB, seguido de sus diversos niveles y modos. Esperamos que hayas podido comprender estos conceptos.

Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub