Docs Menu
Docs Home
/ /
Mantener
/ / /

Cambia los nombres de host en un set de réplicas autogestionado

Para la mayoría conjuntos de réplicas, los nombres de host en el members[n].host El campo nunca cambia. Sin embargo, si las necesidades de la organización cambian, podría ser necesario migrar algunos o todos los nombres de host.

Nota

Utilice siempre nombres de host resolubles para el valor del members[n].host campo en la configuración del conjunto de réplicas para evitar confusiones y complejidad.

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.

Este documento proporciona dos procedimientos separados para cambiar los nombres de host en el campo members[n].host. Utiliza cualquiera de los siguientes enfoques:

  • Cambie los nombres de host sin interrumpir la disponibilidad. Este enfoque garantiza que sus aplicaciones siempre puedan leer y escribir datos en el conjunto de réplicas, pero puede tardar mucho tiempo y generar tiempo de inactividad en la capa de aplicación.

    Si utiliza el primer procedimiento, debe configurar sus aplicaciones para que se conecten al conjunto de réplicas tanto en la ubicación anterior como en la nueva. Esto suele requerir reiniciar y reconfigurar la capa de aplicación, lo que puede afectar la disponibilidad de las aplicaciones. La reconfiguración de aplicaciones queda fuera del alcance de este documento.

  • Detenga todos los miembros que se ejecutan en los nombres de host antiguos a la vez. Este enfoque ofrece una ventana de mantenimiento más corta, pero el conjunto de réplicas no estará disponible durante la operación.

Tip

Dado un conjunto de réplicas con tres miembros:

  • database0.example.com:27017 (la primaria)

  • database1.example.com:27017

  • database2.example.com:27017

Y con la siguiente rs.conf() salida:

{
"_id" : "rs",
"version" : 3,
"members" : [
{
"_id" : 0,
"host" : "database0.example.com:27017"
},
{
"_id" : 1,
"host" : "database1.example.com:27017"
},
{
"_id" : 2,
"host" : "database2.example.com:27017"
}
]
}

Los siguientes procedimientos cambian los nombres de host de los miembros de la siguiente manera:

  • mongodb0.example.net:27017 (la primaria)

  • mongodb1.example.net:27017

  • mongodb2.example.net:27017

Utilice el procedimiento más apropiado para su implementación.

Este procedimiento utiliza los supuestos anteriores.

  1. Para cada secundario en el conjunto de réplicas, realice la siguiente secuencia de operaciones:

    1. Detener la secundaria.

    2. Reinicie el secundario en la nueva ubicación.

    3. Conecte al puerto principal del conjunto de réplicas. En nuestro ejemplo, el puerto principal se ejecuta en el mongosh puerto,27017 por lo que debería ejecutar el siguiente comando:

      mongosh --port 27017
    4. Utilice para rs.reconfig() actualizar el documento de configuración del conjunto de réplicas con el nuevo nombre de host.

      Por ejemplo, la siguiente secuencia de comandos actualiza el nombre de host para el secundario en el índice del arreglo 1 del arreglo members (es decir, members[1]) en el documento de configuración del set de réplicas:

      cfg = rs.conf()
      cfg.members[1].host = "mongodb1.example.net:27017"
      rs.reconfig(cfg)

      Para obtener más información sobre cómo actualizar el documento de configuración, consulte Ejemplos.

    5. Asegúrese de que las aplicaciones de su cliente puedan acceder al conjunto en la nueva ubicación y que el secundario tenga la oportunidad de alcanzar a los demás miembros del conjunto.

      Repita los pasos anteriores para cada miembro no primario del conjunto.

  2. Conecte al primario y mongosh rs.stepDown() reduzca el primario usando el método:

    rs.stepDown()

    El conjunto de réplicas elige a otro miembro para que se convierta en el principal.

  3. Cuando la reducción tenga éxito, apague el primario antiguo.

  4. Inicie la instancia que se convertirá en la nueva instancia principal en la nueva mongod ubicación.

  5. Conéctese al nodo principal actual, que acaba de elegirse, y actualice el documento de configuración del conjunto de réplicas con el nombre de host del nodo que se convertirá en el nuevo nodo principal.

    Por ejemplo, si el servidor principal antiguo estaba en la posición 0 y el nombre de host del nuevo servidor principal es mongodb0.example.net:27017, deberá ejecutar:

    cfg = rs.conf()
    cfg.members[0].host = "mongodb0.example.net:27017"
    rs.reconfig(cfg)
  6. Conecte a la nueva mongosh primaria.

  7. Para confirmar la nueva configuración, llama a rs.conf() en mongosh.

    El resultado debería ser similar a lo siguiente:

    {
    "_id" : "rs",
    "version" : 4,
    "members" : [
    {
    "_id" : 0,
    "host" : "mongodb0.example.net:27017"
    },
    {
    "_id" : 1,
    "host" : "mongodb1.example.net:27017"
    },
    {
    "_id" : 2,
    "host" : "mongodb2.example.net:27017"
    }
    ]
    }

Este procedimiento utiliza los supuestos anteriores.

El siguiente procedimiento lee y actualiza la colección system.replset en la base de datos local.

Si tu implementación aplica control de acceso, el usuario que realiza el procedimiento debe tener acciones de privilegio de find y update en la colección system.replset.

Para crear un rol que proporcione los privilegios necesarios:

  1. Inicie sesión como usuario con privilegios para administrar usuarios y roles, como un usuario con el rol. El siguiente procedimiento utiliza userAdminAnyDatabase el myUserAdmin creado en "Habilitar control de acceso en implementaciones autoadministradas".

    mongosh --port 27017 -u myUserAdmin --authenticationDatabase 'admin' -p
  2. Cree un rol de usuario que proporcione los privilegios necesarios en la colección system.replset en la base de datos local:

    db.adminCommand( {
    createRole: "systemreplsetRole",
    privileges: [
    { resource: { db: "local", collection: "system.replset" }, actions: ["find","update"] }
    ],
    roles: []
    } );
  3. Otorgue el rol al usuario que realizará el procedimiento de cambio de nombre. Por ejemplo, en el siguiente ejemplo se supone que existe el usuario "userPerformingRename" en la base de datos admin.

    use admin
    db.grantRolesToUser( "userPerformingRename", [ { role: "systemreplsetRole", db: "admin" } ] );
  1. Detener todos los miembros en el conjunto de réplicas.

  2. Reinicia cada nodo en un puerto diferente y sin usar la opción de tiempo de ejecución --replSet. Al cambiar el número de puerto durante el mantenimiento se impide que los clientes se conecten a este host mientras ejecuta el mantenimiento. Utiliza el --dbpath habitual del nodo, que en este ejemplo es /data/db1. Utiliza un comando que se asemeje al siguiente:

    Advertencia

    Antes de vincular una dirección IP que no sea local (por ejemplo, de acceso público), asegúrese de 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.

    mongod --dbpath /data/db1/ --port 37017 --bind_ip localhost,<hostname(s)|ip address(es)>

    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.

  3. Para cada nodo del set de réplicas, realice la siguiente secuencia de operaciones:

    1. Conecte mongosh al que se ejecuta en el nuevo puerto temporal. Por ejemplo, para un miembro que se ejecuta en el mongod puerto 37017 temporal, ejecutaría este comando:

      mongosh --port 37017

      Si se ejecuta con control de acceso, connectarse como usuario con privilegios adecuados. Ver Prerrequisitos.

      mongosh --port 37017 -u userPerformingRename --authenticationDatabase=admin -p
    2. Edite manualmente la configuración del conjunto de réplicas. Esta configuración es el único documento de la colección system.replset en la base de datos local.


      Para cambiar los nombres de host, edita la configuración del set de réplicas para proporcionar los nuevos nombres de host y puertos para todos los miembros del set de réplicas.

      1. Cambia a la base de datos local .

        use local
      2. Cree una variable JavaScript para el documento de configuración. Modifique el valor del campo _id para que coincida con su conjunto de réplicas.

        cfg = db.system.replset.findOne( { "_id": "rs0" } )
      3. Proporcione nuevos nombres de host y puertos para cada miembro del conjunto de réplicas. Modifíquelos para que coincidan con su conjunto de réplicas.

        cfg.members[0].host = "mongodb0.example.net:27017"
        cfg.members[1].host = "mongodb1.example.net:27017"
        cfg.members[2].host = "mongodb2.example.net:27017"
      4. Actualice los nombres de host y los puertos en la colección system.replset:

        db.system.replset.updateOne( { "_id": "rs0" }, { $set: cfg } )
      5. Verificar los cambios:

        db.system.replset.find( {}, { "members.host": 1 } )
    3. Detener el proceso en el mongod miembro.

  4. Tras reconfigurar todos los miembros del conjunto, inicie cada instancia de la forma habitual: utilice mongod --replSet el número de puerto habitual y la opción. Por ejemplo:

    Advertencia

    Antes de vincular una dirección IP que no sea local (por ejemplo, de acceso público), asegúrese de 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.

    mongod --dbpath /data/db1/ --port 27017 --replSet rs0 --bind_ip localhost,<hostname(s)|ip address(es)>
  5. Conéctese a una de las mongod instancias mediante. Por mongosh ejemplo:

    mongosh --port 27017
  6. Para confirmar la nueva configuración, llama a rs.conf() en mongosh.

    El resultado debería ser similar a lo siguiente:

    {
    "_id" : "rs0",
    "version" : 4,
    "members" : [
    {
    "_id" : 0,
    "host" : "mongodb0.example.net:27017"
    },
    {
    "_id" : 1,
    "host" : "mongodb1.example.net:27017"
    },
    {
    "_id" : 2,
    "host" : "mongodb2.example.net:27017"
    }
    ]
    }

Volver

Replicación en cadena autogestionada

En esta página