前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mongodb mongoshake 数据同步方案与搭建一个简单的测试环境,与不同版本数据同步问题

Mongodb mongoshake 数据同步方案与搭建一个简单的测试环境,与不同版本数据同步问题

作者头像
AustinDatabases
发布2022-07-13 15:00:05
1.2K0
发布2022-07-13 15:00:05
举报
文章被收录于专栏:AustinDatabasesAustinDatabases

MONGODB 数据库在很多应用场景中都有需要进行数据同步的方案需求

1 多数据中心数据同步方案

2 数据灾备方案

3 多点数据写入与数据最终一致性方案

这些方案中不可或缺的就是mongoshake 组件,mongoshake是阿里云NOSQL团队TEAM 开发的一款针对与通用性服务平台的产品,通过对mongodb的oplog进行读取将源于目的的MOGNODB 数据库之间进行数据同步的方式。通过日志的抓取和重放的方式完成数据同步的任务,数据同步中通过通道来进行数据传输,其中包含了像rpc, file, tcp,以及直连等方式。通过选择不同的同步方式,可以对接不同的中间件,如kafka,通过发布和订阅的方式来进行数据的异步的灵活同步。

基于数据同步,源端可以是单体的MONGODB ,也可以是复制集合,也可以是分片集合,在使用集合的状态下,可以通过在从库中获取OPLOG的方式,降低与主库的FETCH操作带来的对主库的性能影响。

基于MONGOSHAKE, 主要提供了如下的几种特性

1 parallel replication 并行的复制,主要通过唯一索引的方式对 collections的数据进行并行复制,或者对database collection 进行并行。

2 支持断点续传的功能,主要是在进行数据的FETCH 的情况下会将数据同步的点写入到源数据库中,在源数据库中建立了MONGOSHAKE的数据库,建立相关的表来记录信息。

下方的就是在源端存储信息的表

3 可以通过配置白名单和黑名单的方式将某些数据库或collection 集合排除或加入到复制的列表中

4 DDL 操作同步,目前的最新版本的mongoshake是 2.6.6 版本,从1.5版本的mongoshake 就开始支持了DDL 操作,但这里有一个问题,在操作DDL 后,数据同步还是持续的,会造成一个问题,目的端的DDL 操作还未完成,但是主库这边做完后,数据就推过来了,造成数据复制出错,或停止,mongoshake 通过添加了 闩的方式,要求只有目的端的DDL 操作结束后,基于这些DDL 操作后面的数据才能发送到目的端。

5 双向MONGODB 同步(仅仅阿里云MONGODB RDS 支持,DTS),在同步的数据库中标识复制的数据库的ID,通过这样的方式避免双向同步的产生重复读取数据的问题(还回数据)

6 支持数据的压缩,和重定向功能,如将传输的数据直接定位到文件中。

那么在了解了上面的信息后,实际上MONGOSHAKE 在开源的环境中,产生单向的复制是有效的。

下面基于MONGOSHAKE 的数据同步,进行一个相关MOGNODB 升级中不进行长时间的业务短接的方案。

3台虚拟机,

1 安装mongodb 3.4.24

2 安装mongodb 4.2

3 安装mongoshake 2.6.6

2台测试机需要注意,是单机,但需要打开oplogs 所以在生成单机的步骤后,需要对数据库进行 rs.initiate() 将单体的MONGODB 变成 primary 的复制集的方式。

在另一台mongoshake 的机器上将下载的二进制的压缩包进行解压,

https://github.com/alibaba/MongoShake/releases/tag/release-v2.6.6-20220323

基本参数

conf.version = 10 #配置文件版本号不要修改

id = mongoshake #id 用于输出pid文件

master_quorum = false #当一个

full_sync.http_port = 9101 #全量和增量监控窗口

incr_sync.http_port = 9100 #全量和增量监控窗口

system_profile_port = 9200 #查看mongoshake 内部性能

log.level = info #日志的等级

log.dir = /home/mongo #日志存放地

log.file = collector.log #日志文件名

log.flush = true #日志是否是实时刷新的

sync_mode = all #如果是全量+增量同步数据需要选择all 如果是仅仅迁移全量数据使用 full #如果是使用增量同步使用incr 这里需要之前有过复制信息,否则无法进行新的增量同步。

tunnel = direct #通道模式,进行数据同步

tunnel.message = raw #数据输出的方式

mongo_connect_mode = secondaryPreferred #数据的读取为secondary perfer

filter.namespace.black = #黑白名单,通过db, db.collection 提出数据库库或collection

filter.namespace.white =

filter.ddl_enable = false #传输数据是隔离DDL 操作

checkpoint.storage.db = mongoshake #存储在源端的数据库

checkpoint.storage.collection = ckpt_default #存储在源端的表名,多个mongoshake 需要避免同一个表名

checkpoint.start_position = 1970-01-01T00:00:00Z #如果checkpoint不存在,并且值为 1970-01-01T00:00:00Z, 则开始拉取所有的OPLOG ,如果发现OPLOG 时间点比1970-01-01T00:00:00Z 还要早,则直接停止复制

full_sync.reader.collection_parallel = 6 #全量拉取数据时,一次性拉取数据表的数量

full_sync.reader.write_document_parallel = 8 #针对一个表最大能并发多少线程进行数据的拉取

full_sync.reader.document_batch_size = 128 #一次发给目的端多少行数据

full_sync.collection_exist_drop = true #数据库同步时发现目的方有库,直接删除数据库,false 停止复制

full_sync.create_index = background #在数据同步完毕后在后台创建索引

full_sync.executor.insert_on_dup_update = false #发生主键冲突后,直接将insert语句改为UPDATE

incr_sync.mongo_fetch_method = oplog #增量拉取数据的方法

数据库源端信息

mongo_urls = mongodb://admin:1234.Com@192.168.198.100:27027

数据库目的信息

tunnel.address = mongodb://admin:1234.Com@192.168.198.101:27027

配置文件这边已经做好直接在MONGOSHAKE环节启动

collector.linux -conf=/usr/local/mongoshake/collector.conf -verbose 0

启动后数据开始全部同步,这里在源库上添加索引,由于两边的数据库版本不同,导致出现报错信息,参见图2

其中主要的原因是,MONGODB 3.4 中的之前的 system.indexes 在mongodb 4.2 已经清除了,导致创建索引在 mongodb 4.2 上DDL 命令操作失败。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-05-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档