mongo数据同步的三种方案

(一)直接复制data目录(需要停止源和目标的mongo服务)
1.针对目标mongo服务已经存在,并正在运行的(mongo2-->mongo)。
执行步骤:
(1).停止源/目标服务器的mongo服务。
mongod --dbpath /usr/local/mongodb/data/db --logpath /usr/local/mongodb/logs/mongodb.log --shutdown
mongod --dbpath /usr/local/mongodb/data/db2 --logpath /usr/local/mongodb/logs/mongodb2.log --shutdown
(2).删除目标mongo服务的数据目录
rm -rf /usr/local/mongodb/data/db
(3).将待备份的mongo数据目录复制到目标服务绑定的数据目录
cp -r /usr/local/mongodb/data/db2 /usr/local/mongodb/data/db
(4).启动目标mongo服务
mongod -f /usr/local/mongodb/mongodb.conf
2.对于目标mongo为新增,未启动的(mongo-->mongo3)
(1).新增配置文件
cp mongodb2.conf mongodb3.conf。
然后修改相应的端口和数据目录
(2).将待备份的mongo数据目录复制到新mongo的数据目录
cp -r /usr/local/mongodb/data/db /usr/local/mongodb/data/db3
(3).启动mongo服务

(二)通过mongodump、mongorestore同步
参数解释
-h host,填写ip地址加上端口号
-u username, mongo的用户名
-p passwd,mongo的密码
-d database,mongo的数据库名
-c collection,mongo的数据表名
-q query,mongo的查询条件
-o output,mongodump数据存放位置
--forceTableScan 强制扫描整个表(解决版本不一致问题)
mongodump到库级别,mongodump database1 database2两个库
mongodump -h host:port -u username -p passwd --authenticationDatabase admin -d database1 database2 -o /mongotest --forceTableScan
mongodump到表级别,mongodump database1 的database1col表
mongodump -h host:port -u username -p passwd --authenticationDatabase admin -d database1 -c database1col -o /mongotest --forceTableScan
mongodump到具体查询条件,mongodump database1 的database1col表中id>1000的数据
mongodump -h host:port -u username -p passwd --authenticationDatabase admin -d database1 -c database1col -q {"id":{$gte:1000}} -o /mongotest --forceTableScan
mongorestore到库级别,mongorestore database1库
mongorestore -h host:port -u username -p passwd --authenticationDatabase admin -d database1 /mongotest/database1
mongorestore到表级别,mongorestore database1 的database1col表
mongorestore -h host:port -u username -p passwd --authenticationDatabase admin -d database1 -c database1col -o /mongotest/database1/database1col.bson --forceTableScan

(三) 通过db.copyDatabase实现
1.去源机器的源数据库新建一个账户(跟在admin新建的一致就行,每个数据库都需要新建一个)
mongo host:port -u username -p passwd --authenticationDatabase admin
use admin
db.createUser({user:'testuser',pwd:'testpass',roles:['userAdminAnyDatabase']})
use database1(即将复制的库)
db.createUser({user:'testuser',pwd:'testpass',roles:['readWrite']})
2.登录目标机器
mongo host:port -u username -p passwd --authenticationDatabase admin
3.执行复制命令
//需要用到源机器的ip\端口\库名,目标机器--需要新增的库名\新建的用户名\密码
db.copyDatabase("database1","database1","host:port","testuser","testpass","SCRAM-SHA-1")

三种方案的优缺点
方案一
优点:数据快,特别是对于数据量比较大的库,速度优势更明显。不会产生中间数据。
缺点:需要停止服务
方案二
优点:速度相对于第三种更快。支持的版本更丰富(3,4都支持)。不需要停服务。
缺点:不会同步索引。会产生中间数据,需要额外的磁盘来存储。
方案三
优点:会同步索引。不会产生中间数据。不需要停服务
缺点:版本4不支持。速度较慢。

要想了解测开更多的技巧,或者想和更多大神交流,加入qq群856836575

实现 MongoDB 数据的增量同步通常涉及以下几个关键步骤:识别增量数据、提取变更数据、传输数据以及在目标系统中应用变更。Apache NiFi 提供了多种处理器和功能,可以有效地完成这些任务。以下是使用 Apache NiFi 实现 MongoDB 数据增量同步的详细方案。 ### ### 使用 MongoDB Change Streams 实现增量同步 MongoDB 从 3.6 版本开始引入了 **Change Streams** 功能,允许应用程序实时订阅数据库、集合或部署级别的数据变更事件。这一特性非常适合用于实现增量同步。 NiFi 提供了 `ConsumeMongoChangeStream` 处理器,可以监听 MongoDB 的变更流,并将变更事件作为 FlowFile 发送至下游处理器。该处理器支持以下配置: - **MongoDB URI**:连接 MongoDB 的 URI。 - **Database Name** 和 **Collection Name**:指定监听的数据库和集合。 - **Batch Size**:每次拉取的变更记录数量。 - **Polling Interval**:轮询变更流的时间间隔。 ```xml <processor name="ConsumeMongoChangeStream" class="org.apache.nifi.processors.mongodb.ConsumeMongoChangeStream"> <property name="MongoDB URI" value="mongodb://localhost:27017"/> <property name="Database Name" value="testdb"/> <property name="Collection Name" value="testcollection"/> <property name="Polling Interval" value="5 sec"/> </processor> ``` ### ### 使用时间戳字段进行增量拉取 如果 MongoDB 数据集中存在一个表示最后修改时间的字段(例如 `last_modified`),可以通过定期查询该字段大于上次同步时间戳的文档来实现增量同步。 NiFi 的 `ExecuteMongoQuery` 处理器可以执行自定义的 MongoDB 查询语句。通过结合 `UpdateAttribute` 和 `QueryMongoDB`,可以实现基于时间戳的增量同步流程。 ```xml <processor name="QueryMongoDB" class="org.apache.nifi.processors.mongodb.QueryMongoDB"> <property name="MongoDB URI" value="mongodb://localhost:27017"/> <property name="Database Name" value="testdb"/> <property name="Collection Name" value="testcollection"/> <property name="Query" value="{ 'last_modified': { '$gt': '${last_sync_time}' } }"/> </processor> ``` ### ### 数据传输与目标系统写入 一旦获取到增量数据,可以使用 NiFi 的其他处理器将数据写入目标系统。例如: - 使用 `PutHiveQL` 将数据写入 Hive。 - 使用 `PutKafka` 将数据发送到 Kafka 主题。 - 使用 `PutMongoRecord` 将数据写入另一个 MongoDB 实例。 若目标为 Hive,由于 Hive 通常使用 ORC 格式存储数据,而 MongoDB 输出为 JSON 格式,需进行格式转换。NiFi 提供了 `ConvertRecord` 处理器,可将 JSON 转换为 Avro,再通过 `ConvertAvroToORC` 转换为 ORC 格式[^2]。 ### ### 状态管理与持久化 为确保同步过程的连续性,NiFi 支持状态管理机制。使用 `UpdateAttribute` 和 `FetchAttribute` 可以持久化上次同步的时间戳或变更流的 token,从而在下次同步时继续从上次的位置开始处理。 ```xml <processor name="UpdateAttribute" class="org.apache.nifi.processors.attributes.UpdateAttribute"> <property name="last_sync_time" value="${now():format('yyyy-MM-dd HH:mm:ss')}"/> </processor> ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值