可以创建每天将 SQL 数据库写入 MongoDB 的管道吗?

Posted

技术标签:

【中文标题】可以创建每天将 SQL 数据库写入 MongoDB 的管道吗?【英文标题】:Possible to create pipeline that writes an SQL database to MongoDB daily? 【发布时间】:2020-04-20 19:02:25 【问题描述】:

TL:DR 我想将 BigQuery 的强大功能与我的 MERN 堆栈应用程序结合起来。 (a) 使用 nodejs-biquery 直接使用 BigQuery 编写 Node/Express API,或者 (b) 创建一个将我的(整个)BigQuery DB 写入 MongoDB 的日常作业,然后使用 mongoose 编写会更好吗?带有 MongoDB 的 Node/Express API?

我需要确定将创建 BigQuery 数据库的数据 ETL 工作流与 react/node Web 应用程序相结合的最佳方法。数据 ETL 使用 Airflow 创建一个工作流,该工作流 (a) 将日常数据备份到 GCS,(b) 将该数据写入 BigQuery 数据库,以及 (c) 运行一堆 SQL 以在 BigQuery 中创建额外的表。在我看来,我唯一的两个选择是:

    每天从 BigQuery 数据库写入/转换/传输/迁移(无论正确的动词是什么)到 MongoDB。我已经有一个使用 mongoose 编写的 node/express API,连接到 MongoDB 集群,这种方法可以让我保留该 API。 使用 nodejs-biquery 库创建直接连接到 BigQuery 的节点 API。我的应用程序将从 MERN 堆栈 (BQ)ERN 堆栈更改。我必须重新编写 node/express API 才能使用 BigQuery,但我不再需要 MongoDB(也不必每天将数据从 BigQuery 传输到 Mongo)。但是,如果我正在寻找单个条目,BigQuery 可能是一个非常慢的数据库,因为它不打算用作 Mongo 或 SQL 数据库(它没有索引,单行检索查询运行缓慢作为全表扫描)。我的大多数 API 调用都是针对数据库中非常少的数据。

我不确定哪种方法最好。我不知道为 1 个 Web 应用程序拥有 2 个数据库是否是一种不好的做法。我不知道是否可以(1)每天从一个数据库传输到另一个数据库,我不知道如果我直接将 BigQuery 与我的 API 一起使用它会有多慢。我认为如果很容易将 (1) 添加到我的数据工程工作流程中,这是首选,但同样,我不确定。

【问题讨论】:

可能吗?是的。也可以尝试在 reddit.com/r/bigquery 上提问 - 因为这个问题的范围似乎太大了 问题的范围有点宽。 @Canovic。对此几乎没有什么建议,因为我们最近做了一些类似于将数据库从 Postgres 转移到 MongoDB 的事情。您可以编写 cronjobs 以使两个数据库保持同步,从而无需人工交互进行传输。您还需要保留一个关于成功传输多少数据并处理各种错误的矩阵。向其他人添加对 DB 的任何人的引用可能对将来解决错误有很大帮助。 【参考方案1】:

我选择 (1)。编写一个从 BigQuery 查询表、转换并将集合写入 Mongo 的 Python 脚本应该不会有太多的工作。有一些事情需要处理(增量更改等),但这比编写一个全新的节点/bigquery API 更容易处理。

【讨论】:

【参考方案2】:

FWIW 在过去的生活中,我曾在一个有 4 个不同数据库后端的电子商务网站上工作。 (Mongo,mysql,Redis,ElasticSearch)所以超过1根本不是问题,但是你需要考虑一个作为记录的数据库,IE如果它们之间有什么不匹配,一个是真相的来源,另一个是是可疑的。对于我的示例,Redis 和 ElasticSearch 几乎是短暂的 - 将它们吹走,它们会从不可靠的 mysql 和 mongo 源重新创建。现在同时使用 mySql 和 Mongo 有点奇怪,而且我们正在进行缓慢的滚动迁移。这意味着各种记录类型正在从 MySql 转换到 mongo。这个过程看起来有点像: - ORM 层写入 mysql 和 mongo,读取仍然来自 MySql。 - 定期比较数据。 - 几个月过去了,没有任何异常情况,对 MySql 的写入被关闭,读取被转移到 Mongo。

最终目标不再是 MySql,一切都是 Mongo。我跑了那个切线,因为看起来你可以做类似的事情——在你使用的任何数据库抽象层(ORM、DAO、其他我没有跟上的东西等)中写入两个数据库,并最终将读取移动为适合他们需要去的任何地方。如果您需要大批量写入,您可以在该抽象层进行缓冲,直到达到您选择的阈值,然后再发送。

话虽如此,根据您的数据复杂性,夜间 ETL 作业也完全可行,但您确实会遇到管理和监控该额外流程的额外复杂性。另一个潜在的缺点是数据总是过时一天。

【讨论】:

伟大的见解,谢谢!我的 bigquery 数据库将成为唯一的事实来源。目标是让 Mongo 数据库完全可以从 bigquery 数据库重新创建

以上是关于可以创建每天将 SQL 数据库写入 MongoDB 的管道吗?的主要内容,如果未能解决你的问题,请参考以下文章

每天将服务器负载写入日志文件

SQLite - 每天将 .csv 数据导入数据库

mongodb优缺点分析

每天将 Postgresql 数据库从小型 SSD 自动备份到多个硬盘

mongodb千万级写入怎么优化

Mongodb:在 RAM 中保存经常写入的集合