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

La colección fragmentada de MongoDB no se reequilibra

En MongoDB, cuando va a un sistema fragmentado y no ve ningún equilibrio, podría ser una de varias cosas.

  1. Es posible que no tenga suficientes datos para activar el equilibrio. Definitivamente esa no era su situación, pero es posible que algunas personas no se den cuenta de que con un tamaño de fragmento predeterminado de 64 MB, puede llevar un tiempo insertar datos antes de que haya suficiente para dividir y equilibrar algunos de ellos con otros fragmentos.

  2. Es posible que el equilibrador no se haya estado ejecutando, ya que sus otras colecciones se estaban equilibrando, lo que era poco probable en su caso, a menos que esta colección se fragmentara por última vez después de que el equilibrador se detuviera por algún motivo.

  3. Los fragmentos de tu colección no se pueden mover. Esto puede suceder cuando la clave de fragmento no es lo suficientemente granular para dividir los datos en fragmentos lo suficientemente pequeños. Resultó que este era su caso porque su clave fragmentada resultó no ser lo suficientemente granular para una colección tan grande:tiene 105 fragmentos (lo que probablemente corresponde a la cantidad de valores únicos de job_id) y más de 30 GB de datos. Cuando los trozos son demasiado grandes y el balanceador no puede moverlos, los etiqueta como "jumbo" (para que no gire sus ruedas tratando de migrarlos).

¿Cómo recuperarse de una mala elección de una clave fragmentada? Normalmente es muy doloroso cambiar la clave de fragmento, dado que la clave de fragmento es inmutable, debe hacer un equivalente a una migración de datos completa para incluirla en una colección con otra clave de fragmento. Sin embargo, en su caso, la colección todavía está en un fragmento, por lo que debería ser relativamente fácil "desfragmentar" la colección y volver a fragmentarlo con una nueva clave de fragmento. Debido a que la cantidad de job_ids es relativamente pequeña, recomendaría usar un índice regular para dividir en job_id,customer_code, ya que probablemente lo consulte y supongo que siempre se establece en el momento de la creación del documento.