余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

用MongoDB Change Streams 在BigQuery中复制数据

xiyangw 2023-05-13 16:04 14 浏览 0 评论

译者注:

用MongoDB Change Streams 在BigQuery中复制数据

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等上运行。)和云数据流上面,但那些工作要再写文字说明了。

关于原文作者:David Gasquez,你可以在Twitter上找到他@davidgasquez.

译者:张冲

对软件工程、多媒体设计、数据库编程、程序设计方面有多年的工作经验。具有较强的网络管理知识和实践经验,现主要从事网络安全相关工作,兴趣是从事大数据分析工作。

进入MongoDB技术交流群请添加运营同学微信 cyqcyl ,添加请备注

相关推荐

辞旧迎新,新手使用Containerd时的几点须知

相信大家在2020年岁末都被Kubernetes即将抛弃Docker的消息刷屏了。事实上作为接替Docker运行时的Containerd在早在Kubernetes1.7时就能直接与Kubelet集成使...

分布式日志系统ELK+skywalking分布式链路完整搭建流程

开头在分布式系统中,日志跟踪是一件很令程序员头疼的问题,在遇到生产问题时,如果是多节点需要打开多节点服务器去跟踪问题,如果下游也是多节点且调用多个服务,那就更麻烦,再者,如果没有分布式链路,在生产日志...

Linux用户和用户组管理

1、用户账户概述-AAA介绍AAA指的是Authentication、Authorization、Accounting,即认证、授权和审计。?认证:验证用户是否可以获得权限,是3A的第一步,即验证身份...

linux查看最后N条日志

其实很简单,只需要用到tail这个命令tail-100catalina.out输入以上命令,就能列出catalina.out的最后100行。...

解决linux系统日志时间错误的问题

今天发现一台虚拟机下的系统日志:/var/log/messages,文件时间戳不对,跟正常时间差了12个小时。按网上说的执行了servicersyslogrestart重启syslog服务,还是不...

全程软件测试(六十二):软件测试工作如何运用Linux—读书笔记

从事过软件测试的小伙们就会明白会使用Linux是多么重要的一件事,工作时需要用到,面试时会被问到,简历中需要写到。对于软件测试人员来说,不需要你多么熟练使用Linux所有命令,也不需要你对Linux...

Linux运维之为Nginx添加错误日志(error_log)配置

Nginx错误日志信息介绍配置记录Nginx的错误信息是调试Nginx服务的重要手段,属于核心功能模块(nginx_core_module)的参数,该参数名字为error_log,可以放在不同的虚机主...

Linux使用swatchdog实时监控日志文件的变化

1.前言本教程主要讲解在Linux系统中如何使用swatchdog实时监控日志文件的变化。swatchdog(SimpleWATCHDOG)是一个简单的Perl脚本,用于监视类Unix系统(比如...

syslog服务详解

背景:需求来自于一个客户想将服务器的日志转发到自己的日志服务器上,所以希望我们能提供这个转发的功能,同时还要满足syslog协议。1什么是syslog服务1.1syslog标准协议如下图这里的fa...

linux日志文件的管理、备份及日志服务器的搭建

日志文件存放目录:/var/log[root@xinglog]#cd/var/log[root@xinglog]#lsmessages:系统日志secure:登录日志———————————...

运维之日志管理简介

日志简介在运维过程中,日志是必不可少的东西,通过日志可以快速发现问题所在。日志分类日志分类,对不同的日志进行不同维度的分析。操作系统日志操作系统是基础,应用都是在其之上;操作系统日志的分析,可以反馈出...

Apache Log4j 爆核弹级漏洞,Spring Boot 默认日志框架就能完美躲过

这两天沸沸扬扬的Log4j2漏洞门事件炒得热火朝天:突发!ApacheLog4j2报核弹级漏洞。。赶紧修复!!|Java技术栈|Java|SpringBoot|Spring...

Linux服务器存在大量log日志,如何快速定位错误?

来源:blog.csdn.net/nan1996jiang/articlep/details/109550303针对大量log日志快速定位错误地方tail/head简单命令使用:附加针对大量log日志...

Linux中查看日志文件的正确姿势,求你别tail走天下了!

作为一个后端开发工程师,在Linux中查看查看文件内容是基本操作了。尤其是通常要分析日志文件排查问题,那么我们应该如何正确打开日志文件呢?对于我这种小菜鸡来说,第一反应就是cat,tail,vi(或...

分享几款常用的付费日志系统,献给迷茫的你!

概述在前一篇文章中,我们分享了几款免费的日志服务器。他们各有各的特点,但是大家有不同的需求,有时免费的服务器不能满足大家的需要,下面推荐几款付费的日志服务器。1.Nagios日志服务器Nagio...

取消回复欢迎 发表评论: