Los clústeres fragmentados dividen los datos en varios servidores en función de un Clave de fragmento. Un clúster fragmentado escala mejor que un conjunto de réplicas para implementaciones con grandes conjuntos de datos y operaciones de alto rendimiento.
Este tutorial convierte un conjunto de réplicas de tres miembros en un clúster fragmentado con dos fragmentos. Cada fragmento del nuevo clúster es un conjunto de réplicas independiente de tres miembros.
Puede convertir a un clúster fragmentado en la interfaz de usuario para implementaciones alojadas en MongoDB Atlas.
Acerca de esta tarea
Algunos pasos en este tutorial provocarán tiempo de inactividad en su implementación. En cada paso individual se indica cuándo ocurrirá el tiempo de inactividad.
Este tutorial es para implementaciones que tienen la autenticación habilitada.
En este tutorial, especificará la configuración del servidor mediante archivos de configuración. Los archivos de configuración contienen configuraciones equivalentes a las de...
mongodmongosOpciones de línea de comandos y.El clúster fragmentado que implementa con este tutorial contiene diez servidores:
Un servidor para el
mongos.Tres servidores para cada uno de los dos fragmentos del clúster (seis servidores en total).
Tres servidores para el conjunto de réplicas del servidor de configuración.
Arquitectura de servidor
Este tutorial utiliza los siguientes servidores:
Nombre del host | Puerto | Descripción |
|---|---|---|
|
| Miembro del fragmento inicial que contiene datos, |
|
| Miembro del fragmento inicial que contiene datos, |
|
| Miembro del fragmento inicial que contiene datos, |
|
| Miembro del segundo fragmento que contiene datos, |
|
| Miembro del segundo fragmento que contiene datos, |
|
| Miembro del segundo fragmento que contiene datos, |
|
|
|
|
| Miembro del conjunto de réplicas del servidor de configuración. |
|
| Miembro del conjunto de réplicas del servidor de configuración. |
|
| Miembro del conjunto de réplicas del servidor de configuración. |
Los nombres de host utilizados en este tutorial son ejemplos. Reemplace los nombres de host utilizados en los comandos de ejemplo con los nombres de host utilizados en sus implementaciones.
Importante
Para evitar actualizaciones de configuración debido a cambios en las direcciones IP, utilice nombres de host DNS en lugar de direcciones IP. Es particularmente importante usar un nombre de host DNS en lugar de una dirección IP al configurar miembros de set de réplicas o miembros de clústeres particionados.
Utiliza nombres de host en lugar de direcciones IP para configurar clústeres en un horizonte de red dividido. A partir de MongoDB 5.0, los nodos que solo están configurados con una dirección IP no pasan la validación de inicio y no se inician.
Antes de comenzar
Para completar este tutorial, debe tener un conjunto de réplicas que utilice autenticación por archivo de claves o certificado X.509. Para implementar un conjunto de réplicas seguro que utilice uno de estos métodos de autenticación, consulte:
Este tutorial utiliza los directorios de datos predeterminados
/data/db/data/configdby. Para usar rutas diferentes, configure elstorage.dbPathvalor en su archivo de configuración.MongoDB admite la transición en línea desde un set de réplicas a un clúster de 1 partición al permitir que los comandos se ejecuten directamente contra una partición. Sin embargo, una vez que el clúster tiene más de una partición, solo los comandos enumerados se pueden ejecutar directamente en el fragmento sin el rol exclusivo de mantenimiento
directShardOperations.
Pasos
Nota
A partir de MongoDB 8.0, solo puedes ejecutar ciertos comandos en nodos de clústeres fragmentados. Si intentas conectarte directamente a un nodo y ejecutar un comando no compatible, MongoDB devuelve un error:
"You are connecting to a sharded cluster improperly by connecting directly to a shard. Please connect to the cluster via a router (mongos)."
Para ejecutar un comando de base de datos no compatible directamente contra un nodo en un clúster fragmentado, debes conectarte a mongos o tener el rol de solo mantenimiento directShardOperations.
Implementar el conjunto de réplicas del servidor de configuración
Implemente un conjunto de réplicas de tres miembros para los servidores de configuración. En este ejemplo, los servidores de configuración utilizan los siguientes hosts:
mongodb7.example.netmongodb8.example.netmongodb9.example.net
Configurar los servidores de configuración
Configure una instancia en cada host del servidor
mongodde configuración. Especifique estas opciones en el archivo de configuración para cadamongodinstancia:OpciónValorconfigReplSetconfigsvrlocalhost, seguido de cualquier otro nombre de host en el que debe escuchar conexiones demongodcliente.replication: replSetName: configReplSet sharding: clusterRole: configsvr net: bindIp: localhost,<ipaddress> Incluya opciones adicionales según corresponda para su implementación.
Inicie los servidores de configuración
Implemente el con la configuración
mongodespecificada:mongod --config <PATH_TO_CONFIG_FILE> Los servidores de configuración utilizan el directorio de datos predeterminado
/data/configdby el puerto predeterminado27019.Conéctese a uno de los servidores de configuración.
Utilice para conectarse a uno de los servidores de configuración. Por
mongoshejemplo:mongosh "mongodb://mongodb7.example.net:27019" Inicie el conjunto de réplicas del servidor de configuración.
Para iniciar el conjunto de réplicas,
rs.initiate()ejecute:rs.initiate( { _id: "configReplSet", configsvr: true, members: [ { _id: 0, host: "mongodb7.example.net:27019" }, { _id: 1, host: "mongodb8.example.net:27019" }, { _id: 2, host: "mongodb9.example.net:27019" } ] } ) El comando anterior utiliza la excepción localhost para realizar acciones administrativas sin autenticación.
Importante
Se debe ejecutar
rs.initiate()en una sola instanciamongodpara el set de réplicas.
Restaurar usuarios y roles existentes a la nueva configuración
Restaure los usuarios y roles existentes que tenía cuando ejecutó mongodump.
mongorestore ./adminDump --nsInclude "admin.*" --host <configPrimaryURI>
El comando anterior utiliza la excepción localhost para realizar acciones administrativas sin autenticación.
El resultado de ejecutar este comando puede ser similar a:
0 document(s) restored successfully
Este mensaje no indica ningún problema. Significa que se restauraron 0 documentos, aparte de los usuarios y roles.
Secure servidor de configuración set de réplicas
Reconfigure y reinicie el conjunto de réplicas del servidor de configuración.
Reconfigurar los servidores de configuración
Seleccione la pestaña para su mecanismo de autenticación:
Reinicie una instancia en cada uno de estos
mongodhosts:mongodb7.example.netmongodb8.example.netmongodb9.example.net
Especifique estas opciones en el archivo de configuración para cada
mongodinstancia:OpciónValorLa ruta al archivo de clave utilizado para su conjunto de réplicas inicial.
security: keyFile: <PATH_TO_KEYFILE> replication: replSetName: configReplSet sharding: clusterRole: configsvr net: bindIp: localhost,<ipaddress> Incluya opciones adicionales según corresponda para su implementación.
Reinicie una instancia en cada uno de estos
mongodhosts:mongodb7.example.netmongodb8.example.netmongodb9.example.net
Especifique estas opciones en el archivo de configuración para cada
mongodinstancia además de las opciones que ya configuró:OpciónValorx509requireTLSLa ruta absoluta al archivo
.pemque contiene el certificado TLS y la clave.La ruta absoluta hacia el archivo
.pemque contiene la cadena de certificados raíz de la Autoridad Certificadora.localhost, seguido de cualquier otro nombre de host en el que debe escuchar conexiones demongodcliente.ADVERTENCIA: Antes de vincular su instancia a una dirección IP pública, debe proteger su clúster contra accesos no autorizados. Para obtener una lista completa de recomendaciones de seguridad, consulte la Lista de verificación de seguridad para implementaciones autogestionadas. Como mínimo, considere habilitar la autenticación y reforzar la infraestructura de red.
sharding: clusterRole: configsvr replication: replSetName: configReplSet security: clusterAuthMode: x509 net: tls: mode: requireTLS certificateKeyFile: <FILE_WITH_COMBINED_CERT_AND_KEY> CAFile: <CA_FILE> bindIp: localhost,<ipaddress> Incluya opciones adicionales según corresponda a su implementación, como si su archivo de clave de certificado TLS está encriptado con una
net.tls.certificateKeyFilePasswordcontraseña.Reiniciar MongoDB
Reinicie el con la configuración
mongodespecificada:mongod --config <PATH_TO_CONFIG_FILE> --shutdown mongod --config <PATH_TO_CONFIG_FILE>
Implementar el mongos
mongos proporciona la interfaz entre las aplicaciones cliente y el clúster fragmentado.
Crea un archivo de configuración para mongos.
Especifique estas opciones en su
mongosarchivo de configuración:OpciónValorconfigReplSet, seguido de una barra/y al menos uno de los nombres de host y puertos del servidor de configuración.La ruta al archivo de clave utilizado para su conjunto de réplicas inicial.
localhost, seguido de cualquier otro nombre de host en el que debe escuchar conexiones demongoscliente.sharding: configDB: configReplSet/mongodb7.example.net:27019,mongodb8.example.net:27019,mongodb9.example.net:27019 security: keyFile: <PATH_TO_KEYFILE> net: bindIp: localhost,<ipaddress> Incluya opciones adicionales según corresponda para su implementación.
Especifique estas opciones en su
mongosarchivo de configuración:OpciónValorconfigReplSet, seguido de una barra/y al menos uno de los nombres de host y puertos del servidor de configuración.x509requireTLSLa ruta absoluta al archivo
.pemque contiene el certificado TLS y la clave.La ruta absoluta hacia el archivo
.pemque contiene la cadena de certificados raíz de la Autoridad Certificadora.localhost, seguido de cualquier otro nombre de host en el que debe escuchar conexiones demongoscliente.sharding: configDB: configReplSet/mongodb7.example.net:27019,mongodb8.example.net:27019,mongodb9.example.net:27019 security: clusterAuthMode: x509 net: tls: mode: requireTLS certificateKeyFile: <FILE_WITH_COMBINED_CERT_AND_KEY> CAFile: <CA_FILE> bindIp: localhost,<ipaddress> Incluya cualquier opción adicional adecuada para su implementación.
Implementar los mongos.
Implemente el con la configuración
mongosespecificada:mongos --config <PATH_TO_CONFIG_FILE>
Reiniciar el conjunto de réplicas inicial como un fragmento
En este ejemplo, el conjunto de réplicas inicial consta de tres miembros. Este paso actualiza el conjunto de réplicas inicial para que pueda añadirse como fragmento al clúster fragmentado.
El conjunto de réplicas se ejecuta en estos hosts:
mongodb0.example.net:27017mongodb1.example.net:27017mongodb2.example.net:27017
Para clústeres fragmentados, debe configurar el rol para cada instancia mongod del shardsvr fragmento. Para especificar el rol del servidor, configure el valor en sharding.clusterRole el mongod archivo de configuración.
Nota
Conéctese a un miembro de su conjunto de réplicas inicial.
Utilice para conectarse a uno
mongoshde los miembros de su conjunto de réplicas inicial.mongosh "mongodb://<username>@mongodb0.example.net:27017" Si su implementación utiliza509 autenticación X., especifique estas
mongoshopciones:Por ejemplo:
mongosh "mongodb://<username>@mongodb0.example.net:27017" --tls --tlsCAFile <CA_FILE> --tlsCertificateKeyFile <filename> Determinar los elementos primarios y secundarios del conjunto de réplicas.
Ejecute para determinar los primarios y
rs.status()secundarios:rs.status() En la salida del comando, el campo indica qué miembro es el principal y cuáles son los
replSetGetStatus.members[n].stateStrsecundarios.Reinicie los secundarios con la opción
--shardsvr.Advertencia
Este paso requiere cierto tiempo de inactividad para las aplicaciones conectadas a los secundarios del conjunto de réplicas.
Conectarse a un secundario.
Utilice para conectarse a uno de los
mongoshsecundarios.mongosh "mongodb://<username>@<host>:<port>" Apague el secundario.
Ejecute los siguientes comandos:
use admin db.shutdownServer() Editar el archivo de configuración del secundario.
En el archivo de configuración del secundario,
sharding.clusterRoleestablezcashardsvren:security: keyFile: <PATH_TO_KEYFILE> replication: replSetName: rs0 sharding: clusterRole: shardsvr net: port: 27017 bindIp: localhost,<ipaddress> Incluya opciones adicionales según corresponda para su implementación.
Reinicie el secundario como servidor de particiones.
Ejecute el siguiente comando en el host que contiene el secundario:
mongod --config <PATH_TO_CONFIG_FILE> Repita los pasos de apagado y reinicio para el otro secundario.
Conectarse a un secundario.
Utilice para conectarse a uno de los
mongoshsecundarios.Si su implementación utiliza509 autenticación X., especifique estas
mongoshopciones:mongosh "mongodb://<username>@<host>:<port>" --tls --tlsCAFile <CA_FILE> --tlsCertificateKeyFile <filename> Apague el secundario.
Ejecute los siguientes comandos:
use admin db.shutdownServer() Editar el archivo de configuración del secundario.
En el archivo de configuración del secundario,
sharding.clusterRoleestablezcashardsvren:replication: replSetName: rs0 sharding: clusterRole: shardsvr security: clusterAuthMode: x509 net: port: 27017 tls: mode: requireTLS certificateKeyFile: <FILE_WITH_COMBINED_CERT_AND_KEY> CAFile: <CA_FILE> bindIp: localhost,<ipaddress> Incluya opciones adicionales según corresponda a su implementación, como si su archivo de clave de certificado TLS está encriptado con una
net.tls.certificateKeyFilePasswordcontraseña.Reinicie el secundario como servidor de particiones.
Ejecute el siguiente comando en el host que contiene el secundario:
mongod --config <PATH_TO_CONFIG_FILE> Repita los pasos de apagado y reinicio para el otro secundario.
Reinicie el servidor principal con la --shardsvr opción.
Advertencia
Este paso requiere cierto tiempo de inactividad para las aplicaciones conectadas a la parte principal del conjunto de réplicas.
Conectarse al primario.
Usa
mongoshpara conectarte al primario:mongosh "mongodb://<username>@<host>:<port>" Reducir la primaria.
Ejecuta el siguiente comando:
rs.stepDown() Verifique que el paso hacia abajo se haya completado.
Ejecute para confirmar que el miembro al que está conectado se ha retirado y ahora es
rs.status()secundario:rs.status() Cerrar las antiguas primarias.
Ejecute los siguientes comandos:
use admin db.shutdownServer() Espere a que se complete el apagado.
Editar el archivo de configuración principal.
En el archivo de configuración principal,
sharding.clusterRoleestablezcashardsvren:security: keyFile: <PATH_TO_KEYFILE> replication: replSetName: rs0 sharding: clusterRole: shardsvr net: port: 27017 bindIp: localhost,<ipaddress> Incluya opciones adicionales según corresponda para su implementación.
Reinicie el servidor principal como un servidor fragmentado.
Ejecute el siguiente comando en el host que contiene el servidor principal:
mongod --config <PATH_TO_CONFIG_FILE>
Conectarse al primario.
Utilice para conectarse a uno de los
mongoshsecundarios.Si su implementación utiliza509 autenticación X., especifique estas
mongoshopciones:Si su implementación utiliza509 autenticación X., especifique estas
mongoshopciones:mongosh "mongodb://<username>@<host>:<port>" --tls --tlsCAFile <CA_FILE> --tlsCertificateKeyFile <filename> Reducir la primaria.
Ejecuta el siguiente comando:
rs.stepDown() Verifique que el paso hacia abajo se haya completado.
Ejecute para confirmar que el miembro al que está conectado se ha retirado y ahora es
rs.status()secundario:rs.status() Cerrar las antiguas primarias.
Ejecute los siguientes comandos:
use admin db.shutdownServer() Espere a que se complete el apagado.
Editar el archivo de configuración principal.
En el archivo de configuración principal,
sharding.clusterRoleestablezcashardsvren:replication: replSetName: rs0 sharding: clusterRole: shardsvr security: clusterAuthMode: x509 net: port: 27017 tls: mode: requireTLS certificateKeyFile: <FILE_WITH_COMBINED_CERT_AND_KEY> CAFile: <CA_FILE> bindIp: localhost,<ipaddress> Incluya opciones adicionales según corresponda a su implementación, como si su archivo de clave de certificado TLS está encriptado con una
net.tls.certificateKeyFilePasswordcontraseña.Reinicie el servidor principal como un servidor fragmentado.
Ejecute el siguiente comando en el host que contiene el servidor principal:
mongod --config <PATH_TO_CONFIG_FILE>
Agregar el conjunto de réplicas inicial como un fragmento
Después de convertir el conjunto de réplicas inicial (rs0) en un fragmento, agréguelo al clúster fragmentado.
Conéctese a
mongoscomo usuario administrativo de su clúster.La instancia
mongosse está ejecutando en el hostmongodb6.example.net.Para conectar
mongoshalmongos, ejecuta el siguiente comando:mongosh "mongodb://admin01@mongodb6.example.net:27017" Este comando lo autentica como el usuario
admin01que creó en el clúster fragmentado. Después de ingresar el comando, ingrese su contraseña.Añade el fragmento.
Para agregar un fragmento al clúster, ejecute el
sh.addShard()método:sh.addShard( "rs0/mongodb0.example.net:27017,mongodb1.example.net:27017,mongodb2.example.net:27017" )
Actualiza tu cadena de conexión de la aplicación
Después de agregar el primer fragmento a su clúster, actualice la cadena de conexión que usan sus aplicaciones con la cadena de conexión de su clúster fragmentado. Luego, reinicie sus aplicaciones.
Advertencia
Una vez que el nuevo fragmento esté activo, mongosh y los demás clientes siempre deben conectarse a la mongos instancia. No se conecte directamente a las mongod instancias. Si sus clientes se conectan directamente a los fragmentos, podrían generarse inconsistencias en los datos o metadatos.
Implementar un segundo conjunto de réplicas
Implemente un nuevo conjunto de réplicas llamado rs1. Los miembros del conjunto de réplicas rs1 se encuentran en los siguientes hosts:
mongodb3.example.netmongodb4.example.netmongodb5.example.net
Inicie cada miembro del conjunto de réplicas.
Para cada instancia en el conjunto de réplicas, cree un archivo de configuración con estas
mongodopciones:OpciónValorLa ruta al archivo de clave utilizado para su conjunto de réplicas inicial.
rs1shardsvrlocalhost, seguido de cualquier otro nombre de host en el que debe escuchar conexiones demongodcliente.security: keyFile: <PATH_TO_KEYFILE> replication: replSetName: rs1 sharding: clusterRole: shardsvr net: bindIp: localhost,<ipaddress> Incluya opciones adicionales según corresponda para su implementación.
Para cada miembro, inicie un con las siguientes
mongodopciones:OpciónValorrs1shardsvrx509requireTLSLa ruta absoluta al archivo
.pemque contiene el certificado TLS y la clave.La ruta absoluta hacia el archivo
.pemque contiene la cadena de certificados raíz de la Autoridad Certificadora.localhost, seguido de cualquier otro nombre de host en el que debe escuchar conexiones demongodcliente.replication: replSetName: rs1 sharding: clusterRole: shardsvr security: clusterAuthMode: x509 net: tls: mode: requireTLS certificateKeyFile: <FILE_WITH_COMBINED_CERT_AND_KEY> CAFile: <CA_FILE> bindIp: localhost,<ipaddress> Implemente el con la configuración
mongodespecificada:mongod --config <PATH_TO_CONFIG_FILE> Nota
Cuando especifica la
--shardsvropción para una instancia, la instancia se ejecuta en elmongodpuerto27018de forma predeterminada.Inicie cada miembro del conjunto de réplicas.
Conectarse a un miembro del conjunto de réplicas.
Utilice para conectarse a uno de los miembros del conjunto de réplicas. Por
mongoshejemplo:mongosh "mongodb://mongodb3.example.net:27018" mongosh "mongodb://mongodb3.example.net:27018" --tls --tlsCAFile <CA_FILE> --tlsCertificateKeyFile <filename> Inicia el set de réplicas.
mongoshEn, ejecute elrs.initiate()método para iniciar un conjunto de réplicas que contenga el miembro actual:rs.initiate( { _id : "rs1", members: [ { _id: 0, host: "mongodb3.example.net:27018" }, { _id: 1, host: "mongodb4.example.net:27018" }, { _id: 2, host: "mongodb5.example.net:27018" } ] } ) El comando anterior requiere la excepción localhost para realizar acciones administrativas sin autenticación.
Importante
Se debe ejecutar
rs.initiate()en una sola instanciamongodpara el set de réplicas.Agregue un usuario administrativo para el conjunto de réplicas.
Después de implementar el conjunto de réplicas, utilice la excepción localhost para crear el primer usuario del conjunto de réplicas.
Determinar el conjunto de réplicas primario.
Para determinar el primario,
rs.status()ejecute:rs.status() En la salida del comando, el campo indica qué miembro es el
replSetGetStatus.members[n].stateStrprincipal.Conéctate al primario del conjunto de réplicas.
Conéctese al conjunto de réplicas principal con. Por ejemplo, si el
mongoshprincipalmongodb4.example.netes, ejecute este comando:mongosh "mongodb://mongodb4.example.net:27018" Crear un usuario administrativo.
Ejecute el siguiente método para crear un usuario
db.createUser()llamadors1Admincon eluserAdminrol:use admin db.createUser( { user: "rs1Admin", pwd: passwordPrompt(), roles: [ { role: "userAdmin", db: "admin" } ] } ) Después de ejecutar el comando, la base de datos le solicitará que ingrese una contraseña para el usuario
rs1Admin.
Agregue el segundo conjunto de réplicas al clúster como un fragmento
Agregue el nuevo conjunto de réplicas, rs1, al clúster fragmentado.
Conecte
mongoshalmongos.Ejecute el siguiente comando desde la línea de comandos para conectarse a la instancia que se
mongosejecuta en elmongodb6.example.nethost:mongosh "mongodb://admin01@mongodb6.example.net:27017/admin" mongosh "mongodb://admin01@mongodb6.example.net:27017/admin" --tls --tlsCAFile <CA_FILE> --tlsCertificateKeyFile <filename> Este comando lo autentica como el usuario
admin01que creó en el clúster fragmentado. Después de ingresar el comando, ingrese su contraseña.Añade el segundo fragmento.
Después de conectarse a, agregue el conjunto de
mongosréplicasrs1como un fragmento al clúster con elsh.addShard()método:sh.addShard( "rs1/mongodb3.example.net:27018,mongodb4.example.net:27018,mongodb5.example.net:27018" )
Fragmenta una colección
El paso final del procedimiento es fragmentar una colección en el clúster fragmentado.
Determinar la clave del fragmento.
Determine la clave de fragmento para la colección. La clave de fragmento indica cómo MongoDB distribuye los documentos entre fragmentos. Claves de fragmento adecuadas:
Tener valores distribuidos uniformemente entre todos los documentos.
Agrupe documentos a los que se accede con frecuencia al mismo tiempo en fragmentos contiguos.
Permitir una distribución efectiva de la actividad entre fragmentos.
Para obtener más información, consulte Elegir una clave de fragmento.
Este procedimiento utiliza el campo
numbercomo clave de fragmento para la coleccióntest_collection.Crea un índice en la clave del fragmento.
Antes de fragmentar una colección que no esté vacía, cree un índice en la clave de fragmentación:
use test db.test_collection.createIndex( { "number" : 1 } ) Fragmentar la colección.
En la base de datos
test, fragmentetest_collection. Especifiquenumbercomo clave de fragmentación.sh.shardCollection( "test.test_collection", { "number" : 1 } ) La próxima vez que se ejecute el balanceador, redistribuirá fragmentos de documentos entre los fragmentos. A medida que los clientes insertan documentos adicionales en esta colección, el los enruta
mongosal fragmento correspondiente.Cuando el balanceador redistribuye fragmentos, puede afectar negativamente el rendimiento de la aplicación. Para minimizar el impacto en el rendimiento, puede especificar cuándo se ejecuta el balanceador para que no lo haga durante las horas punta. Para obtener más información, consulte Programar la ventana de balanceo.
Obtén más información
Para obtener más tutoriales y procedimientos de fragmentación, consulte estas páginas: