为复制集节点修改主机名¶
On this page
For most replica sets, the hostnames in the members[n].host field never change. However, if organizational needs change, you might need to migrate some or all host names.
注解
Always use resolvable hostnames for the value of the members[n].host field in the replica set configuration to avoid confusion and complexity.
概述¶
This document provides two separate procedures for changing the hostnames in the members[n].host field. Use either of the following approaches:
Change hostnames without disrupting availability. This approach ensures your applications will always be able to read and write data to the replica set, but the approach can take a long time and may incur downtime at the application layer.
如果我们使用第一个方法,我们必须让应用同时连接至新的和老的位置,这将可能在应用层造成混乱可能会影响到应用的可用性。 Re-configuring applications is beyond the scope of this document。
Stop all members running on the old hostnames at once 。该方法耗时较少,但是在操作过程中复制集将不可用。
参见
假设¶
为 replica set 配置3个节点:
database0.example.com:27017 ( primary )
- 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
根据应用情况选择适合的方法。
修改主机名并保持复制集可用¶
该方法使用如下的 assumptions 。
对复制集的每个 secondary 进行如下操作:
关闭从节点。
在新的地方启动从节点。
在主节点上开启 mongo 窗口 。在我们的例子中,主节点在 27017 上,我们就用如下命令:
mongo --port 27017
使用 rs.reconfig() 来更新 replica set configuration document 。
比如,下列命令更新了 members 队列里数组索引为 1 的从节点配置。
cfg = rs.conf() cfg.members[1].host = "mongodb1.example.net:27017" rs.reconfig(cfg)
更多有关修改配置文件的信息请参考 Examples 。
确保我们的应用能连上复制集,且确保从节点能数据能追上其他节点。
为每一个非主节点重复该操作。
在主节点上开启 mongo 窗口并使用 rs.stepDown() 来将其降职:
rs.stepDown()
复制集将重新选举出新的主节点。
当降职完成后,关闭旧的主节点。
把将成为新的主节点的 mongod 实例在新的位置启动。
连接上刚刚选举出的新的主节点,更新 replica set configuration document 。
举个栗子,如果旧的主节点位置是 0 且新的主节点主机名是 mongodb0.example.net:27017 我们要这样做:
cfg = rs.conf() cfg.members[0].host = "mongodb0.example.net:27017" rs.reconfig(cfg)
在主节点上开启 mongo 窗口。
使用 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" } ] }
同时修改所有的主机名¶
该过程使用如下的 assumptions。
将 replica set 中的所有节点关闭。
将每个节点在不同的端口上重启,且去掉 --replSet 配置。使用不同端口是为了防止在维护过程中应用程序链接进来。使用 --dbpath 比如 /data/db1 来启动:
mongod --dbpath /data/db1/ --port 37017
在每个复制集节点中都应用如下操作:
开始 mongo 窗口连接至新的临时端口的 mongod 。举个栗子。连接至37017的实例:
mongo --port 37017
手动修改复制集配置。复制集配置是在 local 数据库中的 system.replset 表中。使用新的主机名和端口来修改复制集配置。可以参考下列命令:
use local cfg = db.system.replset.findOne( { "_id": "rs" } ) cfg.members[0].host = "mongodb0.example.net:27017" cfg.members[1].host = "mongodb1.example.net:27017" cfg.members[2].host = "mongodb2.example.net:27017" db.system.replset.update( { "_id": "rs" } , cfg )
关闭 mongod 实例。
在配置修改完毕后,将每个 mongod 实例正常重启(使用 --replSet):
mongod --dbpath /data/db1/ --port 27017 --replSet rs
Connect to one of the mongod instances using the mongo shell. For example:
mongo --port 27017
使用 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" } ] }