MongoDB数据迁移踩坑

折腾环境一点不爽😫…

数据迁移

之所以进行数据迁移是因为磁盘爆满(97%+),机器的配置也无法满足更多业务需要。MongoDB的数据迁移有以下几个方式:

  • mongoimport、mongoexport
  • 阿里的MongoShake
  • 数据目录拷贝

mongoimport

数据量小、磁盘空间等允许的时候用这个肯定是没问题的,也是常用的小规模数据备份方案。但是当前的场景并不适用。

MongoShake

因为跨着区域,两个MongoDB复制集并不在一个地点,首先想采用网络同步的方式,通过MongoShake来完成迁移工具。

MongoShake项目地址: https://github.com/alibaba/MongoShake

使用release-v2.4.20-20210305版本,之所以没用最新的,是因为测试的时候一直显示某个参数配置不正确,但是根据wiki,第一次使用的时候不需要配置的。

对于MongoDB到MongoDB的同步需求,用户只需要修改collector.conf的配置文件。通常对于副本集的同步只需要配置两个:源mongodb的地址mongo_urls、目的mongodb的地址tunnel.address(与mongodb的url风格一致,db节点以逗号分割,没有用户名密码则不需要配置前缀username:password@),其余默认配置就行。

修改完配置文件后,同步开始,满心欢喜等数据同步结束。但实际上遇到MongoShake进程因为网络问题报错i/o timeout,同步中断。全量同步,重新启动MongoShake会自动清空目的端的数据重新从0开始同步。

相关的issue:
1、https://github.com/alibaba/MongoShake/issues/547

因为数据很大,试错的成本高,主要是时间比较长,网络的不稳定也造成失败几率较大,因此MongoShake的方案暂时放弃。

数据目录拷贝

俗话说海量数据迁移靠快递,不过我这不是海哈😅,鉴于之前有MongoDB复制集故障恢复的经验在,讨论后决定人工到A点关闭MongoDB服务后对数据目录拷贝(主要是为了防止checksum等问题),带回B点服务器上进行数据恢复。

因为是新建MongoDB复制集,数据目录为空,就比较省事了。数据目录拷贝到服务器上后,需要删除mongo.lock文件和diagnostic.data目录:
1)mongo.lock在mongodb启动时生成,如果正常退出,该文件即使还存在,也不会影响下一次启动mongod服务。防止出现问题,先删除此文件。另外当mongodb非正常退出,无法启动的时候,也是需要删除此文件的。
2)diagnostic.data是诊断文件,为了便于MongoDB工程师分析MongoDB服务器行为,MongoDB定期将服务器统计信息记录到诊断文件中,该目录无需备份。

启动MongoDB节点(这里为数据拷贝到服务器所在上的一个节点),进入mongo shell,可以看到复制集处理OTHER状态,不管是rs.status()还是show dbs;,都是报错的:

1
2
3
4
5
6
7
rs0:OTHER> rs.status()
{
"ok" : 0,
"errmsg" : "Our replica set config is invalid or we are not a member of it",
"code" : 93,
"codeName" : "InvalidReplicaSetConfig"
}
1
2
3
4
5
6
7
rs0:OTHER> show dbs;
2021-05-24T15:43:18.193+0800 E QUERY [js] uncaught exception: Error: listDatabases failed:{
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotPrimaryNoSecondaryOk"
} :

因为复制集的信息无法对应,需要我们对复制集配置进行修改:

1
2
3
4
5
6
rs0:OTHER> rsconf = rs.conf()
rs0:OTHER> rsconf.members = [{_id: 0, host: "hostname:27017"}]
rs0:OTHER> rs.reconfig(rsconf, {force: true})
rs0:OTHER>
rs0:SECONDARY>
rs0:PRIMARY>

接下来通过rs.add()添加复制集的其他节点即可,添加完毕后,新添加的节点会进入同步状态STARTUP2,正常同步完成后会切换到Secondary。此处应该也可以通过拷贝当前PRIMARY节点数据目录的方式进行恢复。

参考

1、https://github.com/alibaba/MongoShake/wiki/%E7%AC%AC%E4%B8%80%E6%AC%A1%E4%BD%BF%E7%94%A8%EF%BC%8C%E5%A6%82%E4%BD%95%E8%BF%9B%E8%A1%8C%E9%85%8D%E7%BD%AE%EF%BC%9F
2、https://stackoverflow.com/questions/6857781/what-is-the-use-of-the-mongo-lock-file
3、https://docs.mongodb.com/manual/reference/parameters/#diagnostic-parameters
4、https://stackoverflow.com/questions/47439781/mongodb-replica-set-member-state-is-other

0%