迁移集群到新的硬件系统中¶
这篇教程在不中断集群读写的情况下,将一个完整的 sharded cluster 迁移到新的硬件系统中.
重要
在迁移进行时,不要试图改变 集群的元信息. 不要使用可能导致集群元信息改变的任何操作,比如创建或者删除数据库,集合,或者使用分片命令.
如果你的集群包含了 standalone 的 mongod ,使用 将单机mongod转化为复制集 将其转化为复制集,只有这样,以后的迁移过程才能变得简单,并且可以避免宕机.集群中存在单机节点,在迁移时会有宕机时间.
要迁移集群到新的硬件系统,需要做如下的工作:
禁用均衡¶
禁用均衡以停止 数据块迁移,并且在流程结束之前不要更改集群的元信息.如果有迁移正在运行中,均衡器会在这次迁移结束后再停止.
要禁用均衡,连接到一个 mongos 上,并执行以下方法:
sh.stopBalancer()
使用 sh.getBalancerState() 检查均衡状态.
参见 禁用均衡器 获得更多信息.
单独迁移每台配置服务器¶
从配置在 configDB 中的配置服务器最后一台开始,迁移每一台 config server,在迁移下一台配置服务器之前,启动已经迁移完成的配置服务器.在这个过程中,不要重命名配置服务器.
重要
从 configDB 中最后一个配置服务器开始.
重启 mongos¶
如果在迁移中 configDB 发生了改变,为了避免 configDB 字符串发生冲突,需要关掉 所有的 mongos 再修改字符串.
如果 configDB 保持不变,你可以一个一个地迁移 mongos 也可以一次迁移所有.
使用 shutdown 关闭 mongos ,如果改变了 setting:~sharding.configDB ,需要关闭 所有的 mongos.
如果配置服务器的域名发生了变化,必须修改所有 mongos 的 configDB 配置,所有:program:mongos 必须使用顺序与域名完全相同的配置服务器配置.
参见 启动 mongos 实例 获得更多信息.
迁移分片¶
一次迁移一个数据分片,对于每个分片,按照以下章节进行迁移.
迁移一个复制集的分片¶
要迁移一个集群,需要单独迁移每个成员,首先迁移非主成员,最后迁移 primary .
如果复制集有两个投票成员,添加一个 仲裁节点 以保证在迁移过程中能够保证有大多数节点在线.在迁移结束后可以移除这个仲裁节点.
迁移复制集的一个成员¶
将数据目录(即 dbPath )转移到新机器上.
在新机器上启动 mongod .
连接到复制集当前的主节点上.
如果新节点的域名发生变化,使用 rs.reconfig() 更新 复制集配置文档 .
举例,下面的命令过程将成员中位于第 2 位的域名进行更新:
cfg = rs.conf() cfg.members[2].host = "pocatello.example.net:27017" rs.reconfig(cfg)
参见 Examples 获得更多更新配置文档的信息.
使用 rs.conf() 确认使用了新的配置.
等待所有成员恢复正常,使用 rs.status() 检测成员状态.
迁移复制集中的主节点¶
在迁移主节点的时候,需要复制集选举出一个新的主节点,在进行选举的时候,复制集将读写,通常,这只会持续很短的时间,不过,应该尽可能在影响较小的时间段内迁移主节点.
将主节点降级,以使得正常的 failover 开始.要将主节点降级,连接到一个主节点,使用 replSetStepDown 方法或者使用 rs.stepDown() 方法,下面的例子使用了 rs.stepDown() 方法进行降级:
rs.stepDown()
等主节点降级为从节点,另一个成员成为 PRIMARY 之后,可以按照 迁移复制集的一个成员 迁移这个降级了的节点.
可以使用 rs.status() 来确认状态的改变.
迁移一个单机分片¶
迁移一个单节点分片合理的方法是首先按照 将单节点mongod转化为复制集 ,再按照 迁移复制集分片 进行迁移.在生产环境中,所有的分片都应该是复制集.
迁移一个单节点分片需要很多步骤,某些步骤会导致分片不可用.如果这个分片是某个数据库的 primary shard ,还需要调用 movePrimary ,在使用这个命令期间,不能修改这个数据库上的数据.参见 从集群中删除分片 获得迁移单节点分片的过程.
重新开启均衡¶
重新打开均衡器,恢复 数据块迁移 以完成迁移.
连接到一个 mongos 上,使用 sh.setBalancerState() 方法并传递 true 参数.
sh.setBalancerState(true)
使用 sh.getBalancerState() 检查均衡状态.
参见 开启均衡过程 获得更多信息.