Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /
Implementar
/ / /

Hardware jerarquizado autogestionado para diferentes niveles de SLA o SLO

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 los rangos de zonas antes de fragmentar una colección vacía o inexistente, la operación de "shard colletion" crea fragmentos para la zona definida rangos así como cualquier fragmento adicional para cubrir todo el rango de los valores de la clave de partición y realiza una distribución inicial de fragmentos basada en los rangos de zonas. Esta creación y distribución inicial de fragmentos permite una configuración más rápida del particionado zonificado. Después de la distribución inicial, el balanceador gestiona la distribución de fragmentos en adelante.

Consulta Predefinir zonas y rangos de zonas para una colección vacía o inexistente para ver un ejemplo.

Este tutorial utiliza Zonas para enrutar documentos en función de la fecha de creación, ya sea a particiones orientadas a admitir documentos recientes, o a aquellos destinados a admitir documentos archivados.

Los siguientes son algunos casos de uso de ejemplo para segmentar datos según el Acuerdo de Nivel de Servicio (SLA) u Objetivo de Nivel de Servicio (SLO):

  • Una aplicación requiere proporcionar acceso de baja latencia a documentos insertados/actualizados recientemente

  • Una aplicación requiere priorizar el acceso de baja latencia a un rango o subconjunto de documentos

  • Una aplicación que se beneficia al garantizar que rangos o subconjuntos específicos de datos se almacenen en servidores con hardware que se adapte a los SLA para acceder a esos datos

El siguiente diagrama ilustra un clúster particionado que utiliza zonas basadas en hardware para satisfacer los Acuerdos de Nivel de Servicio (SLA) o los Objetivos de Nivel de Servicio (SLO) de acceso a los datos.

Diagrama de la arquitectura del clúster fragmentado para SLA escalonados.

Una aplicación de uso compartido de fotos requiere acceso rápido a las fotos subidas en los últimos 6 meses. La aplicación almacena la ubicación de cada foto junto con sus metadatos en la photoshare base de datos bajo la colección data.

Los siguientes documentos representan fotos subidas por un único usuario:

{
"_id" : 10003010,
"creation_date" : ISODate("2012-12-19T06:01:17.171Z"),
"userid" : 123,
"photo_location" : "example.net/storage/usr/photo_1.jpg"
}
{
"_id" : 10003011,
"creation_date" : ISODate("2013-12-19T06:01:17.171Z"),
"userid" : 123,
"photo_location" : "example.net/storage/usr/photo_2.jpg"
}
{
"_id" : 10003012,
"creation_date" : ISODate("2016-01-19T06:01:17.171Z"),
"userid" : 123,
"photo_location" : "example.net/storage/usr/photo_3.jpg"
}

Ten en cuenta que sólo el documento con _id : 10003012 se cargó en el último año (a partir de junio de 2016).

La colección de fotos utiliza el índice { creation_date : 1 } como clave de partición.

El campo creation_date en cada documento permite crear zonas en la fecha de creación.

La implementación del clúster particionado actualmente consta de tres particiones.

Diagrama de la arquitectura del clúster fragmentado para SLA escalonados.

La aplicación requiere añadir cada partición a una zona según su nivel de hardware. Cada nivel de hardware representa una configuración de hardware específica diseñada para cumplir con un SLA o SLO determinado.

Diagrama de la arquitectura del clúster fragmentado para SLA escalonados.
Nivel rápido ("reciente")

Estas son las máquinas de mayor desempeño, con grandes capacidades de RAM, discos SSD rápidos y potentes CPUs.

La zona requiere un rango con:

  • un límite inferior de { creation_date : ISODate(YYYY-mm-dd)}, donde el año, el mes y la fecha especificados por YYYY-mm-dd están dentro de los últimos 6 meses.

  • un límite superior de { creation_date : MaxKey }.

Nivel de Fichero ("fichero")

Estas máquinas usan menos RAM, discos más lentos y CPUs más básicas. Sin embargo, tienen una mayor capacidad de almacenamiento por servidor.

La zona requiere un rango con:

  • un límite inferior de { creation_date : MinKey }.

  • un límite superior de { creation_date : ISODate(YYYY-mm-dd)}, donde el año, el mes y la fecha coinciden con los valores utilizados para el límite inferior del nivel recent.

Nota

Los valores de MinKey y MaxKey son valores reservados especiales para comparaciones.

A medida que aumentan las necesidades de rendimiento, añadir particiones adicionales y asociarlos a la zona adecuada, en función de su nivel de hardware, permite que el clúster se escale horizontalmente.

Al definir rangos de zonas basados en períodos de tiempo, considera los beneficios de las actualizaciones poco frecuentes en los rangos de zonas frente a la cantidad de datos que deben migrarse en una actualización. Por ejemplo, establecer un límite de 1 año para que los datos se consideren 'recientes' probablemente cubre más datos que establecer un límite de 1 mes. Si bien se requieren más migraciones al rotar en una escala de 1 mes, la cantidad de documentos que deben migrarse es menor que al rotar en una escala de 1 año.

Con las zonas, si un documento insertado o actualizado coincide con una zona configurada, sólo se puede escribir 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.

MongoDB puede dirigir las queries a una partición específica si la query incluye la clave de partición.

Por ejemplo, MongoDB puede intentar realizar una operación de lectura dirigida en la siguiente query porque incluye creation_date en el documento de query:

photoDB = db.getSiblingDB("photoshare")
photoDB.data.find( { "creation_date" : ISODate("2015-01-01") } )

Si el documento solicitado se encuentra dentro del rango de zona recent, MongoDB enviará esta query a las particiones dentro de esa zona, asegurando así una lectura más rápida en comparación con una operación de lectura por difusiónen todo el clúster.

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.

Para clústeres fragmentados que ejecutan Control de acceso basado en roles en implementaciones autogestionadas, autentícate como un usuario con al menos el rol clusterManager en la base de datos admin.

Debe estar conectado(a) a una mongos para crear zonas o rangos de zonas. No puedes crear zonas o rangos de zonas conectándote directamente a una partición.

1

El balanceador debe estar deshabilitado en todo el clúster compartido para asegurar que no ocurran migraciones mientras se configuran 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.

2

Agregue shard0000 a la zona recent.

sh.addShardTag("shard0000", "recent")

Agregue shard0001 a la zona recent.

sh.addShardTag("shard0001", "recent")

Agregue shard0002 a la zona archive.

sh.addShardTag("shard0002", "archive")

Puedes revisar la zona asignada a cualquier partición ejecutando sh.status().

3

Defina el rango para fotos recientes y asocíelo a la zona recent usando el método sh.addTagRange(). Este método requiere:

  • el namespace completo de la colección de destino.

  • el límite inferior inclusivo del rango.

  • el límite superior exclusivo del rango.

  • la zona.

sh.addTagRange(
"photoshare.data",
{ "creation_date" : ISODate("2016-01-01") },
{ "creation_date" : MaxKey },
"recent"
)

Define el rango para fotos más antiguas y asócialo a la zona archive utilizando el método sh.addTagRange(). Este método requiere:

  • el namespace completo de la colección de destino.

  • el límite inferior inclusivo del rango.

  • el límite superior exclusivo del rango.

  • la zona.

sh.addTagRange(
"photoshare.data",
{ "creation_date" : MinKey },
{ "creation_date" : ISODate("2016-01-01") },
"archive"
)

MinKey y MaxKey son valores especiales reservados para comparaciones.

4

Vuelva a habilitar el balanceador para rebalancear el clúster.

Utiliza sh.enableBalancing(), especificando el namespace de la colección, para iniciar el balanceador

sh.enableBalancing("photoshare.data")

Utiliza sh.isBalancerRunning() para comprobar si el proceso del balanceador se está ejecutando actualmente.

5

La próxima vez que se ejecute el balanceador, este dividirá y migrará fragmentos entre las particiones respetando las zonas configuradas.

Una vez que se complete el balanceo, las particiones en la zona recent solo deben contener documentos con creation_date mayor o igual que ISODate("2016-01-01"), mientras que las particiones en la zona archive solo deben contener documentos con creation_date menor que ISODate("2016-01-01").

Puede confirmar la distribución de los fragmentos ejecutando sh.status().

Para actualizar los rangos de partición, realiza las siguientes operaciones como parte de una tarea cron o de otro procedimiento programado:

1

El balanceador debe estar deshabilitado en todo el clúster compartido para asegurar que no ocurran migraciones mientras se configuran 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.

2

Remover el antiguo rango de zona recent utilizando el método sh.removeTagRange(). Este método requiere:

  • el namespace completo de la colección de destino.

  • el límite inferior inclusivo del rango.

  • el límite superior exclusivo del rango.

sh.removeTagRange(
"photoshare.data",
{ "creation_date" : ISODate("2016-01-01") },
{ "creation_date" : MaxKey }
)

Remover el antiguo rango de zona archive utilizando el método sh.removeTagRange(). Este método requiere:

  • el namespace completo de la colección de destino.

  • el límite inferior inclusivo del rango.

  • el límite superior exclusivo del rango.

sh.removeTagRange(
"photoshare.data",
{ "creation_date" : MinKey },
{ "creation_date" : ISODate("2016-01-01") }
)

MinKey y MaxKey son valores especiales reservados para comparaciones.

3

Defina el rango para fotos recientes y asocíelo a la zona recent usando el método sh.addTagRange(). Este método requiere:

  • el namespace completo de la colección de destino.

  • el límite inferior inclusivo del rango.

  • el límite superior exclusivo del rango.

  • la zona.

sh.addTagRange(
"photoshare.data",
{ "creation_date" : ISODate("2016-06-01") },
{ "creation_date" : MaxKey },
"recent"
)

Define el rango para fotos más antiguas y asócialo a la zona archive utilizando el método sh.addTagRange(). Este método requiere:

  • el namespace completo de la colección de destino.

  • el límite inferior inclusivo del rango.

  • el límite superior exclusivo del rango.

  • la zona.

sh.addTagRange(
"photoshare.data",
{ "creation_date" : MinKey },
{ "creation_date" : ISODate("2016-06-01") },
"archive"
)

MinKey y MaxKey son valores especiales reservados para comparaciones.

4

Vuelva a habilitar el balanceador para rebalancear el clúster.

Utiliza sh.enableBalancing(), especificando el namespace de la colección, para iniciar el balanceador

sh.enableBalancing("photoshare.data")

Utiliza sh.isBalancerRunning() para comprobar si el proceso del balanceador se está ejecutando actualmente.

5

La próxima vez que se ejecute el balanceador, migrará datos entre las particiones respetando las zonas configuradas.

Antes de la equilibración, las particiones en la zona recent solo contenían documentos con creation_date mayor o igual que ISODate("2016-01-01"), mientras que las particiones en la zona archive solo contenían documentos con creation_date menor que ISODate("2016-01-01").

Una vez que se complete el balanceo, las particiones en la zona recent solo deben contener documentos con creation_date mayor o igual que ISODate("2016-06-01"), mientras que las particiones en la zona archive solo deben contener documentos con creation_date menor que ISODate("2016-06-01").

Puede confirmar la distribución de los fragmentos ejecutando sh.status().

Volver

Implementar

En esta página