折腾环境一点不爽😫…
数据迁移
之所以进行数据迁移是因为磁盘爆满(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 | rs0:OTHER> rs.status() |
1 | rs0:OTHER> show dbs; |
因为复制集的信息无法对应,需要我们对复制集配置进行修改:
1 | rs0:OTHER> rsconf = rs.conf() |
接下来通过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