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

/

/

/

/

/

/

对大多数副本集而言,members[n].host字段中的主机名不会改变。但组织需求变化后,可能需要迁移部分或全部主机名。

注意

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

重要

为避免IP变化导致配置更新,应使用DNS主机名而非IP地址。配置副本集成员或分片集群成员时尤其如此。

在具有分割网络视图(split network horizon)的环境中,应使用主机名配置集群。从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集合拥有find和update权限动作。

按以下步骤创建提供必要权限的角色:

  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 admindb.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地址。配置副本集成员或分片集群成员时尤其如此。

    在具有分割网络视图的环境中,应使用主机名配置集群。从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"        }    ]}


原文:更改自托管副本集中的主机名;作者:MongoDB文档贡献者。版本或日期:MongoDB8.0文档。原文及源码权利归相应权利人所有。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容