说明
我们原有的 MongoDB 副本集集群部署在 k8s 上,后因业务需求,在 k8s 集群外使用三台虚拟机组建了一套相同架构的 MongoDB 副本集集群,现想将在k8s集群上mongoDB数据迁移到新的MongoDB集群里。
集群信息:
mongodb-1:10.x.x.56 | mongodb-2:10.x.x.57 | mongodb-3:10.x.x.58 | 功能 |
---|---|---|---|
mongos:23000 | mongos:23000 | mongos:23000 | 路由服务,负责客户端的连接,并把任务分给shards,然后收集结果 |
config server:24000 | config server:24000 | config server:24000 | 配置服务器,保存集群的元数据 |
shard1:主:25001 | shard2:主:25002 | shard3:主:25003 | 分片:接受读写 |
shard2:从:25002 | shard3:从:25003 | shard1:从:25001 | 副本集:备份数据 |
shard3:仲裁:25003 | shard1:仲裁:25001 | shard2:仲裁:25002 |
MongoShake
Mongo-Shake由阿里云Nosql团队开发维护。Mongo-Shake是一个基于MongoDB的oplog的通用服务平台。它从源mongo数据库中获取oplog,并在目标mongo数据库中重放或发送到不同隧道的其他端。如果目标端是mongo数据库,即直接replay oplog,它就像一个同步工具,用于将数据从源MongoDB复制到另一个MongoDB,以建立冗余复制或双活复制。除了这种直接方式,还有其他隧道类型,如rpc、file、tcp、kafka。用户编写的接收器必须定义自己的接口以分别连接到这些隧道。用户还可以定义自己的可插入隧道类型。如果连接kafka等第三方消息中间件,消费者可以在pub/sub模块中灵活的异步获取订阅者数据。
更多有关MongoShake
大家可以看下github,这里不再过多叙述。
下载 MongoShake 包
我们使用最简单的方式,直接在这里下载到最新的发行的包,免去编译的环节。
修改配置文件
对于MongoDB到MongoDB的同步需求,用户只需要修改collector.conf的配置文件。通常对于副本集的同步只需要配置两个:源mongodb的地址mongo_urls、目的mongodb的地址tunnel.address(与mongodb的url风格一致,db节点以逗号分割,没有用户名密码则不需要配置前缀username:password@),其余默认配置就行。如果有其他的需求再仔细阅读以下各个配置项信息。
以下我大概介绍一下我这边需求该如何进行配置,打开vim collector.conf
:
# 同步模式,all表示全量+增量同步,full表示全量同步,incr表示增量同步。
# 原mongodb已不接收新写的数据
sync_mode = full
# 副本集:mongodb://username1:password1@primaryA,secondaryB,secondaryC
# 更改成自己的地址
mongo_urls = mongodb://root:test123@mongodb-cluster-0.mongodb-cluster.middle.svc.cluster.local:27017,mongodb-cluster-1.mongodb-cluster.middle.svc.cluster.local:27017,mongodb-cluster-2.mongodb-cluster.middle.svc.cluster.local:27017
# 更改成自己的地址
tunnel.address = mongodb://admin:test123@10.x.x.56:23000,10.x.x.57:23000,10.x.x.58:23000
退出,保存!
# 压缩文件
tar zcvf mongo-shake-v2.8.2.tgz mongo-shake-v2.8.2
Dockerfile文件
FROM ubuntu:18.04
LABEL maintainer="wutf@test.com"
WORKDIR /app
RUN apt-get update \
&& apt-get install vim -y \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get -y autoremove \
&& apt-get clean
ADD mongo-shake-v2.8.2.tgz .
制作镜像:
docker build -t mongo-shake:v2.8.2 .
k8s deployment
这里提供个
mongo-migrate.yaml
文件供大家参考。
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongodb-migrate
spec:
selector:
matchLabels:
app: mongodb-migrate
replicas: 1
template:
metadata:
labels:
app: mongodb-migrate
spec:
containers:
- name: mongodb-migrate
image: mongo-shake:v2.8.2
command:
- /app/mongo-shake-v2.8.2/collector.linux
args:
- '-conf=/app/mongo-shake-v2.8.2/collector.conf'
- '-verbose=1'
#- sleep
#- "3600000"
resources:
limits:
cpu: '4'
memory: 6Gi
requests:
cpu: '2'
memory: 4Gi
数据迁移
不会覆盖/清除目标mongodb已有数据,数据迁移前最好做好目标target mongodb数据备份。
执行yaml:
kubectl apply -f mongo-migrate.yaml
如果出现如下问题:
可能是目标mongodb内存资源不足,副本进程宕掉了,这里不进行深度分析,可以使用netstat -lnp|grep xxx
查看服务进程。停止迁移服务。
注意事项
-
数据迁移过程中会占用一部分 mongodb 主机资源,尽量在业务低峰迁移。
-
做好数据备份。
-
最好保证mongodb主机资源充足。