基于Go的MongoDB实时同步工具及 Docker 化实践

摘要

讯联数据高级软件工程师马艳云分享了基于Go的MongoDB实时同步工具Magisync及 Docker化实践。

视频内容

Magisync是什么

Magisync是用Go语言开发的MongoDB到MongoDB或其他多种数据库之间的实时同步工具。

为什么选择 Go

在我们的生产应用当中,对Go语言有比较成熟的应用。我们的核心交易系统就是 Go 语言开发的。从开发到运行,Go 语言相对来说语法比较简单,使用方便。还有一个原因就是在 GitHub 上有一个用 Go 语言开发的同步的程序可以供我们参考。

为什么开发 Magisync

交易量日益增多,从2015年8月到2016年8月,我们的交易量整整增长了100倍,原有的系统架构不能满足业务需求。我们要通过数据库拆分实现冷热数据分离,灾备系统的搭建要跨机房同步,这一系列需求导致我们需要找到一个工具能够支持MongoDB的数据,而当时市面上并没有适合我们的MongoDB实时同步工具。

于是我们不得不自己开发这样一款工具,但当时对于我们来说这也是非常具有挑战性的一件事,因为我们做金融支付对数据的实时一致性要求非常高。

Magisync 同步特性

支持从特定时间点开始同步,支持选择同步特定表的特定类型的操作,支持断点续传式同步,QPS目前在3000左右,支持限流。

Magisync 同步原理

简单来说,Magisync一直监听MongoDB的日志集合oplog ,如果源数据库有新的操作产生,oplog集合中会生成有新的记录,这时,Magisync会立刻拿到oplog中新的日志记录,并将其实时的同步至目标数据库。Magisync同步的核心就是oplog。

Oplog

Oplog是MongoDB的复制集存储写操作的一个日志,它的存储位置是在local库的oplog.rs表中。这张表是Capped Collection类型,是MongoDB特有的一种类型,可以用类似于Unix中的tail -f命令来获取oplog。

Oplog 的格式

不同版本的 oplog 的格式稍有不同,我们生产环境使用的 MongoDB的版本是3.0.3, oplog 示例如下:

{
"ts" : Timestamp(1477194593, 1),
"t" : NumberLong(12),
"h" : NumberLong(8657529515144482533),
"v" : NumberInt(2),
"op" : "i",
"ns" : "caroldb.user",
"o" : {
"_id" : ObjectId("580c333e7afa56085f89a00d"),
"name" : "mike",
"age" : NumberInt(20)
}
}

Magisync 特性说明

1、Magisync如果重启,如何知道该从哪个时间点同步?

Magisync各个协程去往目标数据同步之后,会将同步的状态写入oplogMonitor表中,每个协程在oplogMonitor表中都有一条对应的记录。等到Magisync重启时,则会读取oplogMonitor中最小的ts ,然后去源数据库拉取oplog。

2、Magisync用多协程去执行oplog,如何保证oplog执行不会错序?

主线程读取到oplog后,会解析出ObjectId,取模后将其放入各个worker对应的chan中。同一条数据,插入,更新等操作会进去到同一个worker中。

3、Magisync的故障处理机制?

如果读取oplog失败,Magisync会重连,重新读取oplog ; 如果操作目标数据库失败,Magisync会根据情况判断是否需要重连,或者重试。

4、Magisync如何限流?

限流采用的是令牌桶的算法,会有一个协程定时的(比如每秒)向一个桶里放一定数量的令牌。主线程每读取一条oplog,计算oplog的大小,从桶里消费对应的令牌数,然后对比桶里剩下的令牌数,如果小于0,则阻塞,直到下一秒桶里被放入令牌,阻塞解除。

Docker化实践

我们为什么要使用Docker?首先是因为它真的很火,很多大型互联网公司都支持Docker,比如腾讯、京东、美团等等。并且Docker可以快速构建应用环境,可移植性高。

Magisync 代码示例

1、读取oplog代码

2、向目标数据库写数据

我今天的分享就到这里,谢谢大家!

原文发布于微信公众号 - IT大咖说(itdakashuo)

原文发表时间:2017-12-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

KindEditor开源富文本编辑框架XSS漏洞

0×01 前言 KindEditor 是一套开源的在线HTML编辑器,主要用于让用户在网站上获得所见即所得编辑效果,开发人员可以用 KindEditor 把传统...

51180
来自专栏腾讯社交用户体验设计

高效编写微信小程序-你还在手动创建新项目吗?

33530
来自专栏北京马哥教育

Nginx listen reuseport参数带来的性能提升

NGINX发布的1.9.1版本引入了一个新的特性:允许使用SO_REUSEPORT套接字选项,该选项在许多操作系统的新版本中是可用的,包括Bsd和Linux(内...

1K90
来自专栏月色的自留地

Mac电脑C语言开发的入门帖

39950
来自专栏做全栈攻城狮

零基础开发高大上精美网站,一步步带你建设全能网站

不管你水平如何,请你仔细看下去。因为这份技能你值得拥有。网站建设完毕之后,下一系列讲解如何建设公众号。一起带你飞。

28610
来自专栏BeJavaGod

通过spring实现javamail的那些事儿

以前很早的时候大家都用javamail实现发送邮件的功能,而且我们也一直沿用至今,代码拷过来用用就行了,现在我们改为用spring来实现,这样一来减少代码的复杂...

31040
来自专栏IT大咖说

vSAN架构解析与6.7功能介绍

内容来源:2018 年 7 月 17 日,VMware大中华区原厂高级技术讲师史峻在“VMware直播分享 第二期”进行《vSAN架构解析与6.7功能介绍》演讲...

37530
来自专栏一“技”之长

iOS10通知框架UserNotification理解与应用

        关于通知,无论与远程Push还是本地通知,以往的iOS系统暴漏给开发者的接口都是十分有限的,开发者只能对标题和内容进行简单的定义,至于UI展示和...

18520
来自专栏大前端开发

从编程小白到全栈开发:服务端的一些概念

幕后英雄总是容易被大家所忽略。在这看脸的世界,大家都以为脸就是全部了,你总是相信你所看到的就是事物的全部,可是你往往看到的只是冰山的一角而已。

12520
来自专栏梦魇小栈

不可不知的Mac OS X专用命令行工具(持续更新中)

OS X 的终端下通用很多 Unix 的工具和脚本。如果从 Linux 迁移到 OS X 会发现很多熟悉的命令和脚本工具,其实并没有任何区别。

61920

扫码关注云+社区

领取腾讯云代金券