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



内容来源:2017年2月25日,讯联数据高级软件工程师马艳云在“New version, New vision”进行《基于Go的MongoDB实时同步工具及Docker化实践》演讲分享。IT 大咖说(id:itdakashuo)做为独家视频合做方,经主办方和讲者审阅受权发布。
算法

阅读字数:1772 | 4分钟阅读数据库

嘉宾演讲视频回顾及PPT:suo.im/2GfNIK
bash

摘要

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

Magisync是什么

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

为何选择 Go

在咱们的生产应用当中,对Go语言有比较成熟的应用。咱们的核心交易系统就是 Go 语言开发的。从开发到运行,Go 语言相对来讲语法比较简单,使用方便。还有一个缘由就是在 GitHub 上有一个用 Go 语言开发的同步的程序能够供咱们参考。工具

为何开发 Magisync

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

因而咱们不得不本身开发这样一款工具,但当时对于咱们来讲这也是很是具备挑战性的一件事,由于咱们作金融支付对数据的实时一致性要求很是高。线程

Magisync 同步特性

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

Magisync 同步原理

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

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 特性说明

一、Magisync若是重启,如何知道该从哪一个时间点同步?

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

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

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

三、Magisync的故障处理机制?

若是读取oplog失败,Magisync会重连,从新读取oplog ; 若是操做目标数据库失败,Magisync会根据状况判断是否须要重连,或者重试。

四、Magisync如何限流?

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

Docker化实践

咱们为何要使用Docker?首先是由于它真的很火,不少大型互联网公司都支持Docker,好比腾讯、京东、美团等等。而且Docker能够快速构建应用环境,可移植性高。

Magisync 代码示例

一、读取oplog代码

二、向目标数据库写数据

我今天的分享就到这里,谢谢你们!

相关文章
相关标签/搜索