OPTIONS
翻译或纠错本页面

迁移集群到新的硬件系统中

这篇教程在不中断集群读写的情况下,将一个完整的 sharded cluster 迁移到新的硬件系统中.

重要

在迁移进行时,不要试图改变 集群的元信息. 不要使用可能导致集群元信息改变的任何操作,比如创建或者删除数据库,集合,或者使用分片命令.

如果你的集群包含了 standalonemongod ,使用 将单机mongod转化为复制集 将其转化为复制集,只有这样,以后的迁移过程才能变得简单,并且可以避免宕机.集群中存在单机节点,在迁移时会有宕机时间.

要迁移集群到新的硬件系统,需要做如下的工作:

禁用均衡

禁用均衡以停止 数据块迁移,并且在流程结束之前不要更改集群的元信息.如果有迁移正在运行中,均衡器会在这次迁移结束后再停止.

要禁用均衡,连接到一个 mongos 上,并执行以下方法:

sh.stopBalancer()

使用 sh.getBalancerState() 检查均衡状态.

参见 禁用均衡器 获得更多信息.

单独迁移每台配置服务器

从配置在 configDB 中的配置服务器最后一台开始,迁移每一台 config server,在迁移下一台配置服务器之前,启动已经迁移完成的配置服务器.在这个过程中,不要重命名配置服务器.

注解

如果集群中一台配置服务器的域名发生改变,必须重启集群中 所有的 mongodmongos,可以使用 CNAMEs 避免宕机时间.

参见 迁移配置服务器到不同的域名 获得更多信息.

重要

configDB 中最后一个配置服务器开始.

  1. 关闭配置服务器

    这使得所有配置服务器变为只读.

  2. 更改DNS条目使得之前指向旧的配置服务器的域名在 不改变 的前提下指向新的配置服务器,具体如何做取决于你怎样组织你的DNS与域名解析服务.

  3. 从旧的配置服务器上将 dbPath 拷贝到新的配置服务器上.

    比如,为了将 dbPath 拷贝到名为 mongodb.config2.example.net 的机器上,你需要使用像这样的命令:

    rsync -az /data/configdb/ mongodb.config2.example.net:/data/configdb
    
  4. 启动新系统的配置服务器,默认的指令为:

    mongod --configsvr
    

重启 mongos

如果在迁移中 configDB 发生了改变,为了避免 configDB 字符串发生冲突,需要关掉 所有的 mongos 再修改字符串.

如果 configDB 保持不变,你可以一个一个地迁移 mongos 也可以一次迁移所有.

  1. 使用 shutdown 关闭 mongos ,如果改变了 setting:~sharding.configDB ,需要关闭 所有的 mongos.

  2. 如果配置服务器的域名发生了变化,必须修改所有 mongosconfigDB 配置,所有:program:mongos 必须使用顺序与域名完全相同的配置服务器配置.

    注意事项

    To avoid downtime, give each config server a logical DNS name (unrelated to the server’s physical or virtual hostname). Without logical DNS names, moving or renaming a config server requires shutting down every mongod and mongos instance in the sharded cluster.

  3. 如果配置服务器域名发生变化,重启 mongos 时要确保使用了更新之后的 configDB.

参见 启动 mongos 实例 获得更多信息.

迁移分片

一次迁移一个数据分片,对于每个分片,按照以下章节进行迁移.

迁移一个复制集的分片

要迁移一个集群,需要单独迁移每个成员,首先迁移非主成员,最后迁移 primary .

如果复制集有两个投票成员,添加一个 仲裁节点 以保证在迁移过程中能够保证有大多数节点在线.在迁移结束后可以移除这个仲裁节点.

迁移复制集的一个成员

  1. 关闭 mongod 实例,为了确保安全关闭,使用 shutdown 命令.

  2. 将数据目录(即 dbPath )转移到新机器上.

  3. 在新机器上启动 mongod .

  4. 连接到复制集当前的主节点上.

  5. 如果新节点的域名发生变化,使用 rs.reconfig() 更新 复制集配置文档 .

    举例,下面的命令过程将成员中位于第 2 位的域名进行更新:

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

    参见 Examples 获得更多更新配置文档的信息.

  6. 使用 rs.conf() 确认使用了新的配置.

  7. 等待所有成员恢复正常,使用 rs.status() 检测成员状态.

迁移复制集中的主节点

在迁移主节点的时候,需要复制集选举出一个新的主节点,在进行选举的时候,复制集将读写,通常,这只会持续很短的时间,不过,应该尽可能在影响较小的时间段内迁移主节点.

  1. 将主节点降级,以使得正常的 failover 开始.要将主节点降级,连接到一个主节点,使用 replSetStepDown 方法或者使用 rs.stepDown() 方法,下面的例子使用了 rs.stepDown() 方法进行降级:

    rs.stepDown()
    
  2. 等主节点降级为从节点,另一个成员成为 PRIMARY 之后,可以按照 迁移复制集的一个成员 迁移这个降级了的节点.

    可以使用 rs.status() 来确认状态的改变.

迁移一个单机分片

迁移一个单节点分片合理的方法是首先按照 将单节点mongod转化为复制集 ,再按照 迁移复制集分片 进行迁移.在生产环境中,所有的分片都应该是复制集.

迁移一个单节点分片需要很多步骤,某些步骤会导致分片不可用.如果这个分片是某个数据库的 primary shard ,还需要调用 movePrimary ,在使用这个命令期间,不能修改这个数据库上的数据.参见 从集群中删除分片 获得迁移单节点分片的过程.

重新开启均衡

重新打开均衡器,恢复 数据块迁移 以完成迁移.

连接到一个 mongos 上,使用 sh.setBalancerState() 方法并传递 true 参数.

sh.setBalancerState(true)

使用 sh.getBalancerState() 检查均衡状态.

参见 开启均衡过程 获得更多信息.