Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用MongoDB Change Streams 在BigQuery中复制数据

用MongoDB Change Streams 在BigQuery中复制数据

作者头像
MongoDB中文社区
修改于 2019-09-27 10:31:36
修改于 2019-09-27 10:31:36
4.3K0
举报
文章被收录于专栏:MongoDB中文社区MongoDB中文社区
MongoDB中文社区(微信公众号:mongoing-mongoing)
MongoDB中文社区(微信公众号:mongoing-mongoing)

译者注:

Chang Stream(变更记录流) 是指collection(数据库集合)的变更事件流,应用程序通过db.collection.watch()这样的命令可以获得被监听对象的实时变更。BigQuery是Google推出的一项Web服务,该服务让开发者可以使用Google的架构来运行SQL语句对超级大的数据库进行操作。

本文将分享:当我们为BigQuery数据管道使用MongoDB变更流构建一个MongoDB时面临的挑战和学到的东西。

在讲技术细节之前,我们最好思考一下为什么要建立这个管道。主要有以下两个原因:

1. 在一定的规模上为了分析而查询MongoDB是低效的;

2. 我们没有把所有数据放在MongoDB中(例如分条计费信息)。

在一定的规模上,作为服务供应商的数据管道价格昂贵。通常也不会提供类似软删除(例如,使用一个deleted_at字段)这样的复制删除记录的方法。

复制无模式数据

使用MongoDB数据库是我们要注意的第一件事情就是一些集合有一个需要注意的模式:嵌套文档,而且其中一些文档也是数组。

通常,一个嵌套文档代表一个一对一关系,一个数组是一对多关系。幸运的是Big Query同时支持重复的和嵌套的字段。

根据我们的研究,最常用的复制MongoDB数据的方法是在集合中使用一个时间戳字段。该字段的典型名称是updated_at,在每个记录插入和更新时该字段就会更新。使用批处理的方法是很容易实现这种方式的,只需要查询预期的数据库即可。当将这种方法运用到我们的数据和集合,我们发现两个主要的问题:

1. 并非所有我们想要复制的集合都有这个字段。没有updated_at字段,我们如何知道要复制那些更新的记录呢?

2. 这种方法不会跟踪已删除记录。我们只是把他们从原始集合中移除了,但永远不会在Big Query表中进行更新。

幸运的是,MongoDB把对集合产生的所有的变化都记录在oplog的(oplog是local库下的一个固定集合)日志里面。MongoDB 3.6版本以来,你可以使用变更流API来查询日志。这样,我们就会在集合中发生每个变化(包括删除操作)时得到警示。

那么我们的目的就是构建一个管道,该管道可以移动所有变更事件记录,这些记录来自一个Big Query表,MongoDB使用每个记录最近的状态把流变更为这张表。

构建管道

我们的第一个方法是在Big Query中为每个集合创建一个变更流,该集合是我们想要复制的,并从那个集合的所有变更流事件中获取方案。这种办法很巧妙。如果在一个记录中添加一个新的字段,管道应该足够智能,以便在插入记录时修改Big Query表。

由于想要尽可能的在Big Query中获取数据,我们用了另外一个方法。把所有的变更流事件以JSON块的形式放在BigQuery中。我们可以使用dbt这样的把原始的JSON数据工具解析、存储和转换到一个合适的SQL表中。这当然有一些缺点,但可以让我们拥有一个真正及时的端到端管道。管道有以下部件:

1. 一个运行在Kubernetes(是一个开源的,用于管理云平台中多个主机上的容器化的应用/(carden,一款开发人员工具)的服务,他可以读取每个集合的MongoDB变更流,并将其放在一个简单的Big Query表当中(添加所有的记录)。

2. 一个读取带有增量原始数据的源表并实现在一个新表中查询的dbt cronjob(dbt,是一个命令行工具,只需编写select语句即可转换仓库中的数据;cronjob,顾名思义,是一种能够在固定时间运行的Job对象)。这个表中包含了每一行自上一次运行以来的所有状态。这是一个dbt SQL在生产环境下如何操作的例子。

通过这两个步骤,我们实时拥有了从MongoDB到Big Query的数据流。我们也可以跟踪删除以及所有发生在我们正在复制的表上的变化(这对一些需要一段时间内的变化信息的分析是很有用的)。

由于在MongoDB变更流爬行服务日期之前我们没有任何数据,所以我们错失了很多记录。为了解决这一问题,我们决定通过创建伪变化事件回填数据。我们备份了MongoDB集合,并制作了一个简单的脚本以插入用于包裹的文档。这些记录送入到同样的BigQuery表中。现在,运行同样的dbt模型给了我们带有所有回填记录的最终表。

我们发现最主要的问题是需要用SQL写所有的提取操作。这意味着大量额外的SQL代码和一些额外的处理。当时使用dbt处理不难。另外一个小问题是BigQuery并不天生支持提取一个以JSON编码的数组中的所有元素。

结论

对于我们来说付出的代价(迭代时间,轻松的变化,简单的管道)是物超所值的。因为我们一开始使用这个管道(pipeline)就发现它对端到端以及快速迭代的所有工作都非常有用!我们用只具有BigQuery增加功能的变更流表作为分隔。未来我们计划迁移到Apache Beam(是一个统一的编程框架,支持批处理和流处理,并可以将用Beam编程模型构造出来的程序,在多个计算引擎如Apache Apex, Apache Flink, Apache Spark, Google Cloud Dataflow等上运行。)和云数据流上面,但那些工作要再写文字说明了。

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

本文分享自 Mongoing中文社区 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
技术干货 | 如何利用 MongoDB Change Streams 实现数据实时同步?
当前实时数据同步的应用场景较多,实现方式主要有两种,一是数据库厂家本身提供了实时数据捕获工具,如 Oracle 的 OGG 等;另外一种是实时解析数据库的事务日志,获取到实时变化的数据后进行同步,如 Flink CDC 等。
MongoDB中文社区
2023/01/04
3.8K0
技术干货 | 如何利用 MongoDB Change Streams 实现数据实时同步?
MongoDB Change Stream初体验
Change Stream是MongoDB从3.6开始支持的新特性。这个新特性有哪些奇妙之处,会给我们带来什么便利?本次的文章将就这个主题进行初步讨论。
MongoDB中文社区
2019/07/08
1K0
MongoDB Change Stream之一——上手及初体验
Change Stream可以直译为"变更流",也就是说会将数据库中的所有变更以流式的方式呈现出来。用户可以很方便地对数据库建立一个监听(订阅)进程,一旦数据库发生变更,使用change stream的客户端都可以收到相应的通知。使用场景可以包括但不限于以下几种:
phoenix、
2020/10/10
10.3K0
MongoDB Change Stream之一——上手及初体验
MongoDB Change Stream之三——应用场景及实践
change streams从本质上来说是提供了一种基于mongoDB的CDC(Change Data Capture)的解决方案。所谓的CDC就是变化数据捕获,简单理解为监听数据库系统的变更就好。下面的图中描述了CDC的典型场景,左边的是主数据库,不同的客户端可以向其中插入数据(有前后关系);中间是一个队列,这些数据变化都会被放到里面;右边是派生数据系统,消费队列里的变化,然后用作搜索和数据仓库等应用。市场上也不乏这种专门做CDC的产品,比如:HEVO,其宣称的优势包括:1)简单易上手,无需代码;2)良好的交互式用户界面;3)支持多种数据源;4)可容错的安全架构等。
phoenix、
2021/02/24
3.2K1
MongoDB Change Stream之三——应用场景及实践
MongoDB Change Stream简介
MongoDB的Change Stream有点类似关系型数据库中的触发器,但是原理不完全相同。
AsiaYe
2021/10/14
1K0
Flink CDC MongoDB Connector 的实现原理和使用实践
摘要:本文整理自 XTransfer 资深 Java 开发工程师、Flink CDC Maintainer 孙家宝在 Flink CDC Meetup 的演讲。主要内容包括:
从大数据到人工智能
2022/09/09
2.7K0
Flink CDC MongoDB Connector 的实现原理和使用实践
Change Stream源码解读
MongoDB从3.6开始推出了Change Stream功能,提供实时的增量数据流功能,为同步、分析、监控、推送等多种场景使用带来福音。4.0中引入的混合逻辑时钟,可以支持分片集群在不关闭balancer的情况下,吐出的增量数据在即使发生move chunk发生的情况下,还能够保证数据的因果一致性。不但如此,随着4.0.7开始推出的High Water Mark功能,使得返回的change stream cursor包括Post Batch Resume Token,更好的解决Change Stream中ResumeToken推进的问题。关于Change Stream的功能解读,网上可以找到比较多的资料,比如张友东的这篇解读介绍了Change Stream与oplog拉取的对比以及基本的使用。本文将主要侧重从内核源码层面进行解读,主要介绍分片集群版下Change Stream在mongos和mongod上都执行了哪些操作。此外,由于4.0开始MongoDB使用了混合逻辑时钟,从而保证了move chunk的因果一致性,所以本文还会先简单介绍一下MongoDB中混合逻辑时钟的原理。
MongoDB中文社区
2020/11/02
2.5K0
Change Stream源码解读
MongoDB从0开始到实践,整的很明白!
MongoDB是一个以JSON为数据模型的文档数据库,所谓“文档”,就是“JSON Document”,并不是我们一般理解的pdf,word,excel文档。
行百里er
2021/05/11
1.5K0
MongoDB从0开始到实践,整的很明白!
MongoDB从事务到复制
事务和复制对于很多数据库来说是共性,但每一种数据库在这两个问题的细节之处都会有各自的考量,带来了各自的特性;围绕着对共性和特性的讨论,我们将得以还原设计的权衡与思量。
MongoDB中文社区
2019/03/05
1.1K0
了解 MongoDB 看这一篇就够了
MongoDB 是一款流行的开源文档型数据库,从它的命名来看,确实是有一定野心的。MongoDB 的原名一开始来自于 英文单词"Humongous", 中文含义是指"庞大",即命名者的意图是可以处理大规模的数据。
美码师
2019/10/18
1.3K0
了解 MongoDB 看这一篇就够了
【五分钟了解MongoDB】Change Stream 和MongoDB 4.x
充分获知数据库的数据变动是从MongoDB向其他数据服务进行数据同步的关键点。与直接查询collection来获取数据变动相比,通过流式的方式进行监听会有效并及时的多。这是一种非常强大的“响应式编程”模式。随着MongoDB的版本更新,流式的获取方式将变得原来越易用。
MongoDB中文社区
2019/07/08
1.2K0
【五分钟了解MongoDB】Change Stream 和MongoDB 4.x
深入浅出MongoDB复制
笔者最近在生产环境中遇到许多复制相关问题,查阅网上资料发现官方文档虽然系统但是不够有深度,网上部分深度文章则直接以源码展示,不利于大家了解。所以本文则是结合前两者最终给读者以简单的方式展现MongoDB复制的整个架构。本文分为以下5个步骤:
MongoDB中文社区
2018/08/14
9270
深入浅出MongoDB复制
MongoDB 新功能介绍-Change Streams
MongoDB 3.6已经GA有一段时间,网络上对于该版本新特性的详细介绍文章比较少为此借机会对部分新特性做一个相对详细的介绍。基于早期MongoDB版本实现如跨平台数据同步、消息通知、ETL及oplog备份等服务时大多依赖于 Tailable Cursors 的方式。当然这样的实现一来相对复杂同时也存在着一些风险(如不同版本oplog兼容性及过滤特定操作类型等)。
MongoDB中文社区
2018/08/14
2.2K0
MongoDB 新功能介绍-Change Streams
MongoDB 3.6中的新功能 (1) - 发展的速度
New in MongoDB 3.6. What’s New in MongoDB 3.6. Part 1 – Speed to Develo
MongoDB中文社区
2018/08/14
1.6K0
MongoDB 3.6中的新功能 (1) - 发展的速度
MongoDB 基础浅谈
作者:hazenweng,腾讯 QQ 音乐后台开发工程师 MongoDB 作为一款优秀的基于分布式文件存储的 NoSQL 数据库,在业界有着广泛的应用。下文对 MongoDB 的一些基础概念进行简单介绍。 1 MongoDB 特点 面向集合存储:MongoDB 是面向集合的,数据以 collection 分组存储。每个 collection 在数据库中都有唯一的名称。 模式自由:集合的概念类似 MySQL 里的表,但它不需要定义任何模式。 结构松散:对于存储在数据库中的文档,不需要设置相同的字段,并且
腾讯技术工程官方号
2021/09/18
1.5K0
完美数据迁移-MongoDB Stream的应用
尽管如此,目前还是有许多企业踏上了服务化改造的道路,这其中则免不了”旧改”的各种繁杂事。
MongoDB中文社区
2018/08/14
1.1K0
完美数据迁移-MongoDB Stream的应用
Java和Node.js实战 MongoDB 4.x 新特性:Change Streams 变化流
监控数据库发生的变化是MongoDB同步数据服务的关键。我们不需要去定期轮训查询集合中的更改文档,我们就可以可以更轻松地过滤Change Streams 变化流,并立即采取处理错误。这是一种Reactive反应式编程风格,可以非常强大。如今,获取这些变更信息流非常简单。
MongoDB中文社区
2019/03/21
1.1K0
Java和Node.js实战 MongoDB 4.x 新特性:Change Streams 变化流
02 . MongoDB复制集,分片集,备份与恢复
MongoDB复制集RS(ReplicationSet): 基本构成是1主2从的结构,自带互相监控投票机制(Raft(MongoDB)Paxos(mysql MGR 用的是变种))
iginkgo18
2022/05/09
2.7K0
MongoDB Change Stream之二——自顶向下流程剖析
事实上,所有的query基本也是这样一个流程,只是不同的命令会获得不同类型的cursor罢了。这里如果暂时不好理解的话,不妨把第一章内容浏览完再回过头来看看。
phoenix、
2021/02/24
3.4K2
MongoDB Change Stream之二——自顶向下流程剖析
MongoDB系列10:Change Streams构建实时同步数据流
本文是第10篇,主要讲述Change Streams构建实时同步数据流的实战经验,非常值得一看。
大数据和云计算技术
2018/07/26
2.4K0
MongoDB系列10:Change Streams构建实时同步数据流
相关推荐
技术干货 | 如何利用 MongoDB Change Streams 实现数据实时同步?
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档