En los clústeres fragmentados, puedes crear zonas de datos particionados según la clave de partición. Puedes asociar cada zona con una o más particiones en el clúster. Una partición puede asociarse con cualquier número de zonas. En un clúster equilibrado, MongoDB migra fragmentos cubiertos por una zona solo a aquellos particiones asociados con la zona.
Algunos patrones de implementación comunes donde se pueden aplicar zonas son los siguientes:
Aísla un subconjunto específico de datos en un conjunto específico de particiones.
Asegure que los datos más relevantes residen en las particiones que están geográficamente más cercanas a los servidores de aplicaciones.
Enrutar datos a fragmentos en función del hardware y el rendimiento del hardware del fragmento.
La siguiente imagen ilustra un clúster fragmentado con tres fragmentos y dos zonas. A zona representa un rango con un límite inferior de 1 y un límite superior de 10. La zona B representa un rango con un límite inferior de 10 y un límite superior de 20. Las particiones Alpha y Beta tienen la zona A. La partición Beta también tiene la zona B. La partición Charlie no tiene zonas asociadas. El clúster se encuentra en un estado estable y no hay fragmentos que violen ninguna de las zonas.
Comportamiento y operaciones
rango
Cada zona cubre uno o más rangos de valores de la clave de partición para una colección. Cada rango cubierto por una zona siempre incluye su límite inferior y excluye su límite superior. Las zonas no pueden compartir rangos ni tener rangos superpuestos.
Por ejemplo, considere una clave de fragmento en {"x": 1}. El clúster tiene los siguientes rangos de zona:
{ "x" : 5 } --> { "x" : 10 } // Zone A { "x" : 10} --> { "x" : 20 } // Zone B
Un documento con una clave de partición con valor
7se enruta a la zona A.Un documento con un valor de clave de fragmento de
10se enruta a la zona B.
Claves de fragmentos con hash y rangos de zonas
Para las colecciones cuya clave de partición incluye un campo hasheado, los rangos de zona y la distribución de datos en ese campo dependen de los valores hasheados. La zona contiene documentos cuyo valor de clave de partición con hash cae dentro del rango definido. Un rango de zona en un campo hasheado no tiene el mismo comportamiento predecible de direccionamiento de documentos que un rango de zona en un campo no hasheado.
Por ejemplo, considera una clave de partición en {"x" : "hashed"}. El siguiente rango representa el rango encriptada entre 5 y 10:
{ "x": Long("4470791281878691347") } --> { "x": Long("7766103514953448109") } // Zone A
Un documento con un valor de la clave de partición de
1se dirige a la Zona A ya que el valor encriptada de1cae dentro del rango definido.Un documento con un valor de la clave de partición de
15se dirige a la Zona A ya que el valor encriptada de15cae dentro del rango definido.Un documento con un valor de la clave de partición
8no se enruta a la zona A, ya que el valor encriptada de8no entra dentro del rango definido.
mongosh proporciona el convertShardKeyToHashed() para calcular el valor post-hash del parámetro especificado.
Un uso válido de los rangos de zona en un campo hash es restringir los datos de una colección al fragmento o fragmentos de una sola zona. Cree un rango de zona que cubra todo el rango de posibles valores de clave de fragmento hash utilizando como MinKey MaxKey límite inferior y como límite superior.
Para definir rangos, MongoDB proporciona el comando updateZoneKeyRange y los métodos auxiliares asociados sh.updateZoneKeyRange() y sh.addShardTag().
Puede ejecutar el comando de base de datosupdateZoneKeyRangey sus ayudantessh.updateZoneKeyRange()ysh.addTagRange()en una colección no fragmentada o en una colección inexistente.
Al descartar una colección, se borran sus rangos de zona/etiqueta asociados.
Distribución inicial de fragmentos
Al definir las zonas y sus rangos antes de fragmentar una colección vacía o inexistente, la operación de recopilación de fragmentos crea fragmentos para los rangos de zona definidos, así como fragmentos adicionales para cubrir todo el rango de valores de clave de fragmento, y realiza una distribución inicial de fragmentos basada en los rangos de zona. Esta creación y distribución inicial de fragmentos permite una configuración más rápida de la fragmentación por zonas. Tras la distribución inicial, el balanceador gestiona la distribución de fragmentos en adelante.
MongoDB admite particionar colecciones en índices compuestos encriptados. Al fragmentar una colección vacía o inexistente utilizando una clave de fragmento hash compuesta, se aplican requisitos adicionales para que MongoDB pueda realizar la creación y distribución inicial de fragmentos.
Consulta Predefinir zonas y rangos de zonas para una colección vacía o inexistente para un ejemplo.
Balanceador
El balanceador intenta distribuir uniformemente los fragmentos de una colección particionada en todas las particiones del clúster.
Para cada fragmento marcado para migración, el balanceador revisa cada posible partición de destino en busca de cualquier zona configurada. Si el rango del fragmento cae dentro de una zona, el balanceador migra el fragmento dentro de una partición en esa zona. Los fragmentos que no caen en una zona pueden existir en cualquier partición del clúster y se migran normalmente.
Durante las rondas de equilibrio, si el equilibrador detecta que algún fragmento viola las zonas configuradas para un fragmento determinado, el equilibrador migra esos fragmentos a un fragmento donde no existe ningún conflicto.
Tras asociar una zona con uno o más fragmentos y configurarla con un rango de claves de fragmento para una colección fragmentada, el clúster puede tardar un tiempo en migrar los datos afectados de la colección. Esto depende de la división de fragmentos y de la distribución actual de los datos en el clúster. Una vez completado el balanceo, las lecturas y escrituras de los documentos de una zona determinada se enrutan únicamente al fragmento o fragmentos dentro de esa zona.
Una vez configurado, el equilibrador respeta las zonas durante futuras rondas de equilibrio.
clave de partición
Debes usar los campos contenidos en la clave de partición al definir un nuevo rango para que una zona lo cubra. Si utilizas una clave de partición compuesta, el rango debe incluir el prefijo de la clave de partición.
Por ejemplo, dada la clave de partición { a : 1, b : 1, c : 1 }, crear o actualizar un rango para cubrir valores de b requiere incluir a como prefijo. Crear o actualizar un rango para cubrir valores de c requiere incluir a y b como prefijo.
No se pueden crear rangos con campos que no estén incluidos en la clave de partición. Por ejemplo, si se quisieran usar zonas para particionar datos según la ubicación geográfica, la clave de partición necesitaría que el primer campo contuviera datos geográficos.
Al elegir una clave de partición para una colección, considera qué campos podrías querer utilizar para configurar las zonas. Consulte Elegir una clave de partición para consideraciones al elegir una clave de partición.
Límites de la zona de particiones
Los rangos de zona siempre incluyen el límite inferior y excluyen el límite superior.
Colecciones de series de tiempo
La partición por zonas no admite colecciones de series de tiempo. El balanceador siempre distribuye los datos en colecciones de series de tiempo fragmentadas de manera uniforme en todos los fragmentos del clúster.