/
/
/
/
/
/
对大多数副本集而言,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
请选择最适合当前部署的流程。
在维持副本集可用性的情况下更改主机名
本流程使用上面的前提假设。
-
对副本集中的每个从节点,依次执行:
-
停止该从节点。
-
在新位置重启该从节点。
-
使用mongosh连接副本集主节点。示例中的主节点运行在27017端口,因此命令如下:
mongosh --port 27017 -
使用rs.reconfig(),将副本集配置文档中的主机名更新为新名称。
例如,以下命令更新配置文档
members数组索引1处的从节点,即members[1]的主机名:cfg = rs.conf()cfg.members[1].host = "mongodb1.example.net:27017"rs.reconfig(cfg)更多配置文档更新方式见示例。
-
确保客户端应用能访问新位置的副本集,并让从节点有机会追上其他成员的复制进度。
对所有非主节点成员重复以上步骤。
-
-
退位成功后,关闭旧主节点。
-
在新位置启动预期成为新主节点的mongod实例。
-
连接刚刚选出的当前主节点,并在副本集配置文档中更新预期成为新主节点的那个节点的主机名。
例如,若旧主节点位于索引0,新主机名为
mongodb0.example.net:27017,运行:cfg = rs.conf()cfg.members[0].host = "mongodb0.example.net:27017"rs.reconfig(cfg) -
使用mongosh连接新主节点。
同时更改全部主机名
本流程使用上面的前提假设。
先决条件
下面的流程会读取并更新local数据库中的system.replset集合。
若部署启用了访问控制,执行操作的用户必须对system.replset集合拥有find和update权限动作。
按以下步骤创建提供必要权限的角色:
-
使用有权管理用户和角色的用户登录,例如具备userAdminAnyDatabase角色的用户。以下流程使用在自托管部署中启用访问控制一文创建的
myUserAdmin。mongosh --port 27017 -u myUserAdmin --authenticationDatabase 'admin' -p -
创建用户角色,授予它对
local数据库中system.replset集合的必要权限:db.adminCommand( { createRole: "systemreplsetRole", privileges: [ { resource: { db: "local", collection: "system.replset" }, actions: ["find","update"] } ], roles: []} ); -
将角色授予执行重命名的用户。例如,下面假定
admin数据库中已存在userPerformingRename用户。use admindb.grantRolesToUser( "userPerformingRename", [ { role: "systemreplsetRole", db: "admin" } ] );
操作流程
-
停止副本集的所有成员。
-
在不同端口上重启每个成员,并且不使用–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地址的节点无法通过启动校验,也不会启动。
-
对副本集每个成员依次执行:
-
使用mongosh连接运行在新临时端口上的mongod。例如,临时端口为37017时,运行:
mongosh --port 37017若启用了访问控制,使用具有适当权限的用户连接。参见先决条件。
mongosh --port 37017 -u userPerformingRename --authenticationDatabase=admin -p -
手动编辑副本集配置。它是
local数据库中system.replset集合的唯一文档。在配置中为所有成员填写新主机名与端口。
-
切换到
local数据库。use local -
用JavaScript变量保存配置文档。将
_id字段的值改为实际副本集名称。cfg = db.system.replset.findOne( { "_id": "rs0" } ) -
为每个成员提供新主机名和端口;应改成当前副本集的实际值。
cfg.members[0].host = "mongodb0.example.net:27017"cfg.members[1].host = "mongodb1.example.net:27017"cfg.members[2].host = "mongodb2.example.net:27017" -
更新
system.replset集合中的主机名和端口:db.system.replset.updateOne( { "_id": "rs0" }, { $set: cfg } ) -
核实更改:
db.system.replset.find( {}, { "members.host": 1 } )
-
-
停止该成员上的mongod进程。
-
-
完成所有成员的重新配置后,以正常方式启动各mongod实例:使用通常的端口号,并加上–replSet选项。例如:
警告
将实例绑定到可公开访问的IP地址之前,必须保护集群,防止未授权访问。完整建议见自托管部署安全检查清单。至少应考虑启用身份验证并加固网络基础设施。
mongod --dbpath /data/db1/ --port 27017 --replSet rs0 --bind_ip localhost,<hostname(s)|ip address(es)>
原文:更改自托管副本集中的主机名;作者:MongoDB文档贡献者。版本或日期:MongoDB8.0文档。原文及源码权利归相应权利人所有。











暂无评论内容