更改自管理副本集中的主机名
对于大多数副本集, members[n].host
字段中的主机名永远不会改变。 但是,如果组织需要更改,您可能需要迁移部分或全部托管名。
注意
始终使用可解析的主机名作为副本集配置中 members[n].host
字段的值,避免混淆和复杂性。
重要
要避免因 IP 地址变更而更新配置,请使用 DNS 主机名而非 IP 地址。在配置副本集成员或分片集群成员时,使用 DNS 主机名而非 IP 地址尤为重要。
在水平分割网络配置下,请使用主机名而非 IP 地址来配置集群。从 MongoDB 5.0 开始,仅配置了 IP 地址的节点将无法通过启动验证,因而不会启动。
Overview
本文档提供两个单独的步骤来更改 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) 有关更新配置文档的详细信息,请参阅示例。
确保您的客户端应用程序能够访问新位置上的副本集,并且从节点有机会追赶该副本集中的其他节点。
对集合中的每个非主成员重复上述步骤。
将
mongosh
连接到主节点,并使用rs.stepDown()
方法降级主节点:rs.stepDown() 副本集选举另一个成员成为主节点。
当降级成功后,关闭旧的主节点。
启动
mongod
实例,其将成为新位置的新主成员。连接到刚刚选出的当前主节点,并使用将成为新主节点的节点主机名更新副本集配置文档。
例如,如果旧主节点在节点数组中所处位置为
0
,而新主节点的主机名为mongodb0.example.net:27017
,您应当运行如下命令:cfg = rs.conf() cfg.members[0].host = "mongodb0.example.net:27017" rs.reconfig(cfg) 将
mongosh
连接到新的主节点。要确认新配置,请在
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
特权动作。
要创建提供必要特权的角色,请执行以下操作:
以具有管理用户和角色特权的用户身份登录,例如具有
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 admin db.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 地址。在配置副本集成员或分片集群成员时,使用 DNS 主机名而非 IP 地址尤为重要。
在水平分割网络配置下,请使用主机名而非 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)> 使用
mongosh
连接到其中一个mongod
实例。例如:mongosh --port 27017 要确认新配置,请在
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" } ] }