sql >> Base de Datos >  >> NoSQL >> MongoDB

Fragmentos de MongoDB y cargas de agregación desequilibradas

El marco de agregación es un engranaje vital en la infraestructura de MongoDB. Le ayuda a analizar, resumir y agregar los datos almacenados en MongoDB. Consulte esta publicación de blog para obtener más detalles sobre el marco de agregación en MongoDB 2.6.

En la versión 2.6, MongoDB realizó un cambio sutil pero significativo en la forma en que se ejecutan las canalizaciones de agregación subyacentes en un entorno fragmentado. Cuando se trabaja con colecciones fragmentadas, MongoDB divide la canalización en dos etapas. La primera etapa o la fase "$match" se ejecuta en cada fragmento y selecciona los documentos relevantes. Si el planificador de consultas determina que un fragmento no es relevante según las claves del fragmento, esta fase no se ejecuta en ese fragmento.

Las etapas subsiguientes se ejecutan solo en el fragmento "principal" de la colección. Este fragmento fusiona los datos de los otros fragmentos y ejecuta el resto de la canalización. Esto da como resultado una carga considerablemente mayor en el fragmento principal de la colección que se agrega. Este es un ejemplo de uno de nuestros clientes que ejecuta tres fragmentos y utiliza principalmente consultas de agregación:

Como puede ver, la carga en el primer fragmento es consistentemente 3 o 4 veces mayor que la otra razón. Este es un ejemplo extremo, ya que en caso de que el segundo y el tercer fragmento se agregaran más tarde, por lo tanto, el fragmento principal para todas las colecciones es el primer fragmento. Entonces, esencialmente, las etapas posteriores de todos nuestros trabajos de agregación se ejecutan solo en Shard1. Si examina los registros en el fragmento principal, verá una serie de comandos de "combinación" que recuperan datos de los otros fragmentos.

Antes de la versión 2.6, las etapas posteriores de la canalización de agregación solían ejecutarse en sus servidores MongoDB y no en el fragmento principal.

Entonces, ¿cómo manejas esta distribución de carga desigual? Tienes un par de opciones:

  1. Si está ejecutando agregaciones en varias colecciones, asegúrese de que los "fragmentos primarios" de las colecciones estén distribuidos uniformemente entre sus fragmentos.
  2. Si tiene una alta carga de agregación en una sola colección, es posible que deba usar máquinas un poco más grandes para su fragmento principal.

Como siempre, si tiene alguna pregunta o comentario, envíenos un correo electrónico a [email protected].