Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

更改自管理副本集中的主机名

在此页面上

  • Overview
  • 假定条件
  • 在保持副本集可用性的同时更改主机名
  • 同时更改所有主机名

对于大多数副本集 members[n].host字段中的主机名永远不会改变。 但是,如果组织需要更改,您可能需要迁移部分或全部托管名。

注意

始终使用可解析的主机名作为副本集配置中 members[n].host 字段的值,避免混淆和复杂性。

重要

要避免因 IP 地址变更而更新配置,请使用 DNS 主机名而非 IP 地址。在配置副本集成员或分片集群成员时,使用 DNS 主机名而非 IP 地址尤为重要。

在水平分割网络配置下,请使用主机名而非 IP 地址来配置集群。从 MongoDB 5.0 开始,仅配置了 IP 地址的节点将无法通过启动验证,因而不会启动。

本文档提供两个单独的步骤来更改 members[n].host 字段中的主机名。使用以下两种方法:

  • 更改主机名而不影响可用性。这种方法可确保应用程序始终能够读取数据并将数据写入副本集,但该方法可能耗时较长,并且可能导致应用程序层停机。

    如果您使用第一个过程,则必须将应用程序配置为连接到旧位置和新位置的副本集,这通常需要在应用程序层重新启动和重新配置,并且可能会影响应用程序的可用性。重新配置应用程序超出了本文档的范围。

  • 立即停止在旧主机名上运行的所有成员。此方法的维护窗口期较短,但副本集在操作期间将不可用。

提示

另请参阅:

给定一个三节点副本集

  • database0.example.com:27017主节点)

  • database1.example.com:27017

  • database2.example.com:27017

并含有以下 rs.conf() 输出:

{
"_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"
}
]
}

以下过程更改节点的主机名,如下所示:

  • mongodb0.example.net:27017 (主节点)

  • mongodb1.example.net:27017

  • mongodb2.example.net:27017

请根据您的部署情况选择最合适的步骤。

此过程使用上述假设

  1. 对于副本集中的每个从节点,执行以下操作顺序:

    1. 停止从节点。

    2. 在新位置重新启动从节点。

    3. mongosh 连接到副本集的主节点。在我们的示例中,主节点在端口 27017 上运行,因此您可以发出以下命令:

      mongosh --port 27017
    4. 使用 rs.reconfig() 用新的主机名更新副本集配置文档

      例如,以下命令序列更新副本集配置文档中 members 数组的数组索引 1 处的从节点主机名(即 members[1]):

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

      有关更新配置文档的详细信息,请参阅示例。

    5. 确保您的客户端应用程序能够访问新位置上的副本集,并且从节点有机会追赶该副本集中的其他节点。

      对集合中的每个非主成员重复上述步骤。

  2. mongosh 连接到主节点,并使用 rs.stepDown() 方法降级主节点:

    rs.stepDown()

    副本集选举另一个成员成为主节点。

  3. 当降级成功后,关闭旧的主节点。

  4. 启动 mongod 实例,其将成为新位置的新主成员。

  5. 连接到刚刚选出的当前主节点,并使用将成为新主节点的节点主机名更新副本集配置文档

    例如,如果旧主节点在节点数组中所处位置为 0,而新主节点的主机名为 mongodb0.example.net:27017,您应当运行如下命令:

    cfg = rs.conf()
    cfg.members[0].host = "mongodb0.example.net:27017"
    rs.reconfig(cfg)
  6. mongosh 连接到新的主节点。

  7. 要确认新配置,请在 mongosh 中调用 rs.conf()

    您将得到类似以下输出:

    {
    "_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"
    }
    ]
    }

此过程使用上述假设

以下步骤读取并更新 local 数据库中的 system.replset 集合。

如果您的部署强制执行访问控制,则执行该过程的用户必须在 system.replset 集合上执行findupdate 特权动作。

要创建提供必要特权的角色,请执行以下操作:

  1. 以具有管理用户和角色特权的用户身份登录,例如具有userAdminAnyDatabase角色的用户。 以下过程将使用在对自管理部署启用访问控制中创建的myUserAdmin

    mongosh --port 27017 -u myUserAdmin --authenticationDatabase 'admin' -p
  2. 创建一个用户角色,为 local 数据库中的 system.replset 集合提供必要的特权:

    db.adminCommand( {
    createRole: "systemreplsetRole",
    privileges: [
    { resource: { db: "local", collection: "system.replset" }, actions: ["find","update"] }
    ],
    roles: []
    } );
  3. 将角色授予将执行重命名过程的用户。例如,以下假设 admin 数据库中有一个现有用户 "userPerformingRename"

    use admin
    db.grantRolesToUser( "userPerformingRename", [ { role: "systemreplsetRole", db: "admin" } ] );
  1. 停止副本集中的所有成员。

  2. 不同的端口上重新启动每个节点,而不使用 --replSet 运行时选项。在维护期间更改端口号可防止客户端在执行维护时连接到此主机。使用节点惯用的 --dbpath,在本例中为 /data/db1。使用类似下面的命令:

    警告

    将实例绑定到可公开访问的 IP 地址之前,必须保护集群免遭未经授权的访问。有关安全建议的完整列表,请参阅自管理部署的安全清单。至少应考虑启用身份验证强化网络基础设施。

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

    重要

    要避免因 IP 地址变更而更新配置,请使用 DNS 主机名而非 IP 地址。在配置副本集成员或分片集群成员时,使用 DNS 主机名而非 IP 地址尤为重要。

    在水平分割网络配置下,请使用主机名而非 IP 地址来配置集群。从 MongoDB 5.0 开始,仅配置了 IP 地址的节点将无法通过启动验证,因而不会启动。

  3. 对于副本集中的每个节点,请执行以下操作顺序:

    1. mongosh 连接到在新的临时端口上运行的 mongod。例如,对于在临时端口 37017 上运行的节点,您可以执行如下命令:

      mongosh --port 37017

      如果使用访问控制运行,请以具有相应特权的用户身份进行连接。请参阅先决条件

      mongosh --port 37017 -u userPerformingRename --authenticationDatabase=admin -p
    2. 手动编辑副本集配置。副本集配置是 local 数据库中的 system.replset 集合中的唯一文档。


      要更改主机名,请编辑副本集配置,为副本集的所有节点提供新的主机名和端口。

      1. 切换到 local 数据库。

        use local
      2. 为配置文档创建 JavaScript 变量。修改 _id 字段的值以与您的副本集相匹配。

        cfg = db.system.replset.findOne( { "_id": "rs0" } )
      3. 为副本集的每个成员提供新的主机名和端口。修改主机名和端口,确保它们与您的副本集相匹配。

        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. 更新 system.replset 集合中的主机名和端口:

        db.system.replset.updateOne( { "_id": "rs0" }, { $set: cfg } )
      5. 验证变更:

        db.system.replset.find( {}, { "members.host": 1 } )
    3. 停止节点上的 mongod 进程。

  4. 重新配置集合的所有成员后,以正常方式启动每个 mongod 实例:使用常用端口号并使用 --replSet 选项。例如:

    警告

    将实例绑定到可公开访问的 IP 地址之前,必须保护集群免遭未经授权的访问。有关安全建议的完整列表,请参阅自管理部署的安全清单。至少应考虑启用身份验证强化网络基础设施。

    mongod --dbpath /data/db1/ --port 27017 --replSet rs0 --bind_ip localhost,<hostname(s)|ip address(es)>
  5. 使用 mongosh 连接到其中一个 mongod 实例。例如:

    mongosh --port 27017
  6. 要确认新配置,请在 mongosh 中调用 rs.conf()

    您将得到类似以下输出:

    {
    "_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"
    }
    ]
    }

后退

自管理链式复制