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.
Tip
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.
Consulte Zonas predefinidas y rangos de zonas para una colección vacía o inexistente para ver un ejemplo.
Este tutorial utiliza Zonas para segmentar datos según un área geográfica.
A continuación se presentan algunos ejemplos de casos de uso de segmentación de datos por área geográfica:
Una aplicación que tenga que segmentar los datos de los usuarios por país.
Una base de datos que debe asignar recursos por país
El siguiente diagrama ilustra un clúster fragmentado que utiliza zonas geográficas para administrar y satisfacer los requisitos de segmentación de datos.
Scenario
Una aplicación de chat financiero registra mensajes y rastrea el país del usuario originario. La aplicación almacena los registros en el chat base de datos bajo la colección messages. Los chats contienen información que debe ser segmentada por país para que los servidores locales en cada país puedan servir las solicitudes de lectura y guardar de los usuarios de ese país. Se puede asignar la misma zona a un grupo de países para compartir recursos.
La aplicación actualmente tiene usuarios en EE. UU., Reino Unido y Alemania. El campo country representa el país del usuario basado en su
ISO 3166-1 Alfa-2 códigos de país de dos caracteres.
Los siguientes documentos representan una vista parcial de tres mensajes de chat:
{ "_id" : ObjectId("56f08c447fe58b2e96f595fa"), "country" : "US", "userid" : 123, "message" : "Hello there", ..., } { "_id" : ObjectId("56f08c447fe58b2e96f595fb"), "country" : "UK", "userid" : 456, "message" : "Good Morning" ..., } { "_id" : ObjectId("56f08c447fe58b2e96f595fc"), "country" : "DE", "userid" : 789, "message" : "Guten Tag" ..., }
clave de partición
La colección messages utiliza el índice compuesto { country : 1, userid : 1 } como clave de partición.
El campo country en cada documento permite crear una zona para cada valor de país distinto.
El userid campo proporciona una cardinalidad alta y un componente de frecuencia baja a la clave del fragmento en relación country con.
Consulte Elegir una clave de partición para obtener instrucciones más generales sobre cómo seleccionar una clave de partición.
Arquitectura
El clúster fragmentado tiene fragmentos en dos centros de datos: uno en Europa y otro en América del Norte.
Zones
Esta aplicación requiere una zona por centro de datos.
EU- Centro de datos europeoLas particiones implementadas en este centro de datos están asignadas a la zona
EU.Para cada país que utilice el centro de datos
EUpara lecturas y escrituras locales, cree un rango de zona para la zonaEUcon:un límite inferior de
{ "country" : <country>, "userid" : MinKey }un límite superior de
{ "country" : <next country>, "userid" : MinKey }
NA- Centro de datos de NorteaméricaLas particiones implementadas en este centro de datos están asignadas a la zona
NA.Para cada país que utilice el centro de datos
NApara lecturas y escrituras locales, cree un rango de zona para la zonaNAcon:un límite inferior de
{ "country" : <country>, "userid" : MinKey }un límite superior de
{ "country" : <next country>, "userid" : MinKey }
Operaciones de escritura
Con las zonas, si un documento insertado o actualizado coincide con una zona configurada, solo podrá escribirse en una partición dentro de esa zona.
MongoDB puede guardar documentos que no coinciden con una zona configurada en cualquier partición del clúster.
Nota
El comportamiento descrito anteriormente requiere que el clúster esté en un estado estable, sin fragmentos que violen una zona configurada. Consulta la siguiente sección sobre el balanceador para obtener más información.
Operaciones de lectura
MongoDB puede enrutar consultas a un fragmento específico si la consulta incluye al menos el campo country.
Por ejemplo, MongoDB puede intentar una operación de lectura específica en la siguiente consulta:
chatDB = db.getSiblingDB("chat") chatDB.messages.find( { "country" : "UK" , "userid" : "123" } )
Las consultas sin el campo country realizan operaciones de difusión.
Balanceador
El balanceador migra los fragmentos a la partición apropiada cumpliendo cualquier zona configurada. Hasta la migración, las particiones pueden contener fragmentos que violan las zonas configuradas. Una vez que se complete el equilibrio, las particiones solo deberían contener fragmentos cuyos rangos no violen sus zonas asignadas.
Agregar o remover zonas o rangos de zonas puede provocar migraciones de fragmentos. Dependiendo del tamaño de tu conjunto de datos y de la cantidad de fragmentos que una zona o rango de zonas afecte, estas migraciones podrían afectar el rendimiento del clúster. Considera ejecutar tu balanceador durante ventanas programadas específicas. Consulta Programar la Ventana de Balance para un tutorial sobre cómo configurar una ventana de programación.
Seguridad
Para los clústeres fragmentados que se ejecutan clusterManager con admin control de acceso basado en roles en implementaciones autoadministradas, autentíquese como un usuario con al menos el rol en la base de datos.
Procedimiento
Debes estar conectado a una mongos para crear zonas y rangos de zonas. No puedes crear zonas o rangos de zonas conectándote directamente a una partición.
Deshabilitar el balanceador (opcional)
Para reducir los impactos en el rendimiento, el balanceador puede estar desactivado en todo el clúster particionado para garantizar que no se produzcan migraciones durante la configuración de las nuevas zonas.
Utiliza sh.stopBalancer() para detener el balanceador del clúster.
sh.stopBalancer()
Utiliza sh.isBalancerRunning() para comprobar si el proceso de balanceador está en ejecución actualmente. Espere a que finalicen las rondas de equilibrado actuales antes de continuar.
Añade cada fragmento a la zona apropiada
Agregue cada fragmento del centro de datos de América del Norte a la zona NA.
sh.addShardTag(<shard name>, "NA")
Agregue cada fragmento del centro de datos europeo a la zona EU.
sh.addShardTag(<shard name>, "EU")
Puede revisar las zonas asignadas a cualquier fragmento determinado sh.status() ejecutando.
Define los rangos para cada zona
Para los valores de la clave de partición donde country : US, defina un rango de la clave de partición y asócielo a la zona NA utilizando el método sh.addTagRange(). Este método requiere:
El namespace completo de la colección objetivo.
El límite inferior inclusivo del rango.
El límite superior exclusivo del rango.
El nombre de la zona.
sh.addTagRange( "chat.messages", { "country" : "US", "userid" : MinKey }, { "country" : <next country>, "userid" : MinKey }, "NA" )
Para los valores de la clave de partición donde country : UK, defina un rango de la clave de partición y asócielo a la zona EU utilizando el método sh.addTagRange(). Este método requiere:
El namespace completo de la colección objetivo.
El límite inferior inclusivo del rango.
El límite superior exclusivo del rango.
El nombre de la zona.
sh.addTagRange( "chat.messages", { "country" : "UK", "userid" : MinKey }, { "country" : "US", "userid" : MinKey }, "EU" )
Para los valores de la clave de partición donde country : DE, defina un rango de la clave de partición y asócielo a la zona EU utilizando el método sh.addTagRange(). Este método requiere:
El namespace completo de la colección objetivo.
El límite inferior inclusivo del rango.
El límite superior exclusivo del rango.
El nombre de la zona.
sh.addTagRange( "chat.messages", { "country" : "DE", "userid" : MinKey }, { "country" : "UK", "userid" : MinKey }, "EU" )
Los valores MinKey y MaxKey son valores reservados especiales para comparaciones. MinKey siempre se compara como menor que cualquier otro valor posible, mientras que MaxKey siempre se compara como superior a cualquier otro valor posible. Los rangos configurados capturan cada valor de userid para cada valor de country que se lista.
Se asignan tanto country : UK como country : DE a la zona EU. Esto asocia cualquier documento con UK o DE como valor para country en el centro de datos de la UE.
Habilitar el balanceador (opcional)
Si el equilibrador se desactivó en los pasos anteriores, vuelva a habilitar el equilibrador al completar este procedimiento para reequilibrar el clúster.
Use sh.enableBalancing(), especificando el namespace de la colección, para iniciar el balanceador.
sh.enableBalancing("chat.messages")
Utiliza sh.isBalancerRunning() para comprobar si el proceso del balanceador se está ejecutando actualmente.
Revisar los cambios
La próxima vez que se ejecute el balanceador, dividirá los fragmentos donde sea necesario y los migrará a través de los fragmentos respetando las zonas configuradas.
Una vez que se complete el balanceo:
Las particiones en la zona
NAsolo deben contener documentos concountry : USylas particiones en la zona
EUsólo deben contener documentos concountry : UKocountry : DE.
Un documento con un valor para country diferente a US, UK o DE puede residir en cualquier partición del clúster.
Para confirmar la distribución de fragmentos, ejecuta sh.status().
Actualizando Zonas
La aplicación requiere las siguientes actualizaciones:
Los documentos con
country : UKahora deben estar asociados al nuevo centro de datosUK. Los datos del centro de datosEUdeben migrarseLa aplicación de chat ahora brinda soporte a usuarios en México. Los documentos con
country : MXdeben ser enviados al centro de datosNA.
Realice los siguientes procedimientos para actualizar los rangos de zonas.
Deshabilitar el balanceador (opcional)
Para reducir el impacto en el rendimiento, es posible deshabilitar el balanceador en todo el clúster fragmentado para garantizar que no se realicen migraciones mientras se configuran las nuevas zonas o se eliminan las antiguas.
Utiliza sh.stopBalancer() para detener el balanceador del clúster.
sh.stopBalancer()
Utiliza sh.isBalancerRunning() para comprobar si el proceso de balanceador está en ejecución actualmente. Espere a que finalicen las rondas de equilibrado actuales antes de continuar.
Agrega la nueva zona UK
Agregue cada fragmento del centro de datos UK a la zona UK.
sh.addShardTag("<shard name>", "UK")
Puede revisar las zonas asignadas a cualquier fragmento determinado sh.status() ejecutando.
Remover los antiguos rangos de zonas
Utilice el método sh.removeTagRange() para remover los antiguos rangos de zonas asociados a los países DE y UK. Este método requiere:
El namespace completo de la colección objetivo.
El límite inferior inclusivo del rango.
El límite superior exclusivo del rango.
sh.removeTagRange( "chat.messages", { "country" : "DE", "userid" : MinKey }, { "country" : "UK", "userid" : MinKey } ) sh.removeTagRange( "chat.messages", { "country" : "UK", "userid" : MinKey }, { "country" : "US", "userid" : MinKey } )
Agregar nuevos rangos de zonas
Para los valores de la clave de partición donde country : DE, define un rango de clave de partición y utiliza el método sh.addTagRange() para asociarlo a la zona EU. Este método requiere:
El namespace completo de la colección objetivo.
El límite inferior inclusivo del rango.
El límite superior exclusivo del rango.
El nombre de la zona.
sh.addTagRange( "chat.messages", { "country" : "DE", "userid" : MinKey }, { "country" : "MX", "userid" : MinKey }, "EU" )
Para los valores de la clave de partición donde country : UK, define un rango de clave de partición y utiliza el método sh.addTagRange() para asociarlo a la zona UK. Este método requiere:
El namespace completo de la colección objetivo.
El límite inferior inclusivo del rango.
El límite superior exclusivo del rango.
El nombre de la zona.
sh.addTagRange( "chat.messages", { "country" : "UK", "userid" : MinKey }, { "country" : "US", "userid" : MinKey }, "UK" )
Para los valores de la clave de partición donde country : MX, define un rango de clave de partición y utiliza el método sh.addTagRange() para asociarlo a la zona NA. Este método requiere:
El namespace completo de la colección objetivo.
El límite inferior inclusivo del rango.
El límite superior exclusivo del rango.
El nombre de la zona.
sh.addTagRange( "chat.messages", { "country" : "MX", "userid" : MinKey }, { "country" : "UK", "userid" : MinKey }, "NA" )
MongoDB reserva MinKey los MaxKey valores y como valores especiales para comparaciones. siempre se compara como inferiorMinKey MaxKey a userid cualquier country otro valor posible, mientras que siempre se compara como superior a cualquier otro valor posible. Esto garantiza que los rangos capturen todo el espacio de valores posibles de para sus valores.
Habilitar el balanceador (opcional)
Si el equilibrador se desactivó en los pasos anteriores, vuelva a habilitar el equilibrador al completar este procedimiento para reequilibrar el clúster.
sh.enableBalancing()Utilice, que especifica el espacio de nombres de la colección, para iniciar el balanceador
sh.enableBalancing("chat.messages")
Utiliza sh.isBalancerRunning() para comprobar si el proceso del balanceador se está ejecutando actualmente.
Revisar los cambios
La próxima vez que se ejecute el balanceador, dividirá los fragmentos donde sea necesario y migrará los fragmentos entre las particiones según las zonas configuradas.
Antes de balancear:
las particiones en la zona
EUsolo contienen documentos dondecountry : DEocountry : UK, ydocumentos en los que
country : MXpodrían almacenarse en cualquier partición del clúster.
Después de equilibrar:
las particiones en la zona
EUsolo contienen documentos dondecountry : DE,las particiones en la zona
UKsolo contienen documentos dondecountry : UK, ylas particiones en la zona
NAsolo contienen documentos en los quecountry : USocountry : MX.
Un documento con un valor para country distinto de US, MX, UK o DE puede residir en cualquier partición del clúster.
Para confirmar la distribución de fragmentos, ejecuta sh.status().