OPTIONS
翻译或纠错本页面

为复制集节点修改主机名

对于大多数 replica sets 而言, host 中的主机名是不会变的。但是如果如果有特殊需求的时候,我们也许会需要修改部分或者所有主机名。

注解

保证在 host 中使用的是可解析的主机名以防混乱或是无意义的复杂。

概述

本文提供了2中不同的方式来修改 host 中的主机名。可以使用下述任一方式:

  • 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

  1. 对复制集的每个 secondary 进行如下操作:

    1. 关闭从节点。

    2. 在新的地方启动从节点。

    3. 在主节点上开启 mongo 窗口 。在我们的例子中,主节点在 27017 上,我们就用如下命令:

      mongo --port 27017
      
    4. 使用 rs.reconfig() 来更新 replica set configuration document

      比如,下列命令更新了 members 队列里数组索引为 1 的从节点配置。

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

      更多有关修改配置文件的信息请参考 Examples

    5. 确保我们的应用能连上复制集,且确保从节点能数据能追上其他节点。

      为每一个非主节点重复该操作。

  2. 在主节点上开启 mongo 窗口并使用 rs.stepDown() 来将其降职:

    rs.stepDown()
    

    复制集将重新选举出新的主节点。

  3. 当降职完成后,关闭旧的主节点。

  4. 把将成为新的主节点的 mongod 实例在新的位置启动。

  5. 连接上刚刚选举出的新的主节点,更新 replica set configuration document

    举个栗子,如果旧的主节点位置是 0 且新的主节点主机名是 mongodb0.example.net:27017 我们要这样做:

    cfg = rs.conf()
    cfg.members[0].host = "mongodb0.example.net:27017"
    rs.reconfig(cfg)
    
  6. 在主节点上开启 mongo 窗口。

  7. 使用 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

  1. replica set 中的所有节点关闭。

  2. 将每个节点在不同的端口上重启,且去掉 --replSet 配置。使用不同端口是为了防止在维护过程中应用程序链接进来。使用 --dbpath 比如 /data/db1 来启动:

    mongod --dbpath /data/db1/ --port 37017
    
  3. 在每个复制集节点中都应用如下操作:

    1. 开始 mongo 窗口连接至新的临时端口的 mongod 。举个栗子。连接至37017的实例:

      mongo --port 37017
      
    2. 手动修改复制集配置。复制集配置是在 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 )
      
    3. 关闭 mongod 实例。

  4. 在配置修改完毕后,将每个 mongod 实例正常重启(使用 --replSet):

    mongod --dbpath /data/db1/ --port 27017 --replSet rs
    
  5. 连接至其中一个 mongod 实例:

    mongo --port 27017
    
  6. 使用 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"
            }
        ]
    }