因为mongo数据库占用机器内存过大,且主服务器上运行得服务比较多,内存有些吃紧,故考虑将主节点的mongodb迁移到另一台主机,目前存在三种方案,对比其优缺点,考虑使用副本集的方式进行。
第一种:关闭数据库,数据写回磁盘,停止服务,直接拷贝库文件
优点:各种信息都会附带,操作简单,时间段
缺点:碎片多,文件大
第二种:停止服务,使用monogoexport/mongodump
优点:没有碎片和日志信息,库比较干净
缺点:耗时长
第三种:新增一个mongodb实例,加入副本集,自动同步
优点:不需要停机,没有碎片信息
缺点:操作复杂,需要手动切换主从,配置RC信息,需要同时启动两个数据库实例,存在一定开销
考虑使用第三种方案,可以做到不停机迁移数据
准备信息:
1、原mongo docker容器的运行参数,包括网络、命令、卷、端口等。
2、原mongodb 的配置文件。
声明:
1、迁入节点称为节点B,迁出节点称为节点A
2、因为在docker环境中运行容器,为减小复杂度,未开启副本集认证。
详细步骤:
1、拷贝节点A mongodb配置文件到节点B,并检查副本集设置是否正确。
cat /etc/mongo/mongo.config
########################################
...
replication: #副本集设置
oplogSizeMB: 25600
replSetName: rs0
...
2、节点B建立数据库文件夹和配置文件夹
mkdir /mongodb
chmod 777 mongodb
3、节点B建立docker容器并且挂载配置文件夹和数据卷
docker run -d -p 27017:27017 -v /etc/mongo:/etc/mongo -v /database/mongo:/data/db /etc/mongo:/etc/mongo mongdb:<version>
4、登录节点A数据库,执行命令
>config = {_id:"rs0",protocolVersion:1,members:[{_id:0,host:'xx.xx.xx.xx',priority :1},{_id:1,host:'xx.xx.xx.xx',priority:5}]}
>## 这里ip和优先级需要更改,优先级越大选为主节点的可能性越大
>rs.initiate(config)
## 如果提示已经注册的话,运行以下命令:
>re.reconfig(config)
## 检查同步状态
>db.printSlaveReplicationInfo()
5、主从节点切换
## 节点A 执行mongo命令,重新选举主库
>rs.stepDown()
## 切换到节点B,如果切换成功的话,会发现节点B的mongo命令行显示RIMARY
## 从副本集移除节点A数据库
>re.remove("xx.xx.xx.xx")
## 至此完成数据库迁移工作
6、检查数据完整性 关闭节点A mongo服务
通过工具连接数据库,检查数据没有问题后,停止节点A的mongo 容器,有需要的话可以备份原来的数据库文件。