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

Possible to create pipeline that writes an SQL database to MongoDB daily?

TL:DR 我想将 BigQuery 的强大功能与我的 MERN-stack 应用程序结合起来。 (a) 使用 nodejs-biquery to write a Node/Express API directly with BigQuery, or (b) create a daily job that writes my (entire) BigQuery DB over to MongoDB, and then use mongoose 用 MongoDB 编写 Node/Express API 是否更好?

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

  1. 每天 write/convert/transfer/migrate(无论正确的动词是什么)从 BigQuery 数据库到 MongoDB。我已经有一个使用 mongoose 编写的 node/express API,连接到 MongoDB 集群,这种方法可以让我保留 API.
  2. 使用 nodejs-biquery 库创建一个直接连接到 BigQuery 的节点 API。我的应用程序将从 MERN 堆栈 (BQ) ERN 堆栈更改。我将不得不重写 node/express API 以使用 BigQuery,但我将不再需要 MongoDB(也不必每天将数据从 BigQuery 传输到 Mongo).但是,如果我正在寻找单个条目,BigQuery 可能是一个非常慢的数据库,因为它不打算用作 Mongo 或 SQL 数据库(它没有索引,一行检索查询运行 与完整 table 扫描一样慢)。我的大多数 API 调用都是为了从数据库中获取非常少的数据。

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

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

更容易处理

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,其他我没有跟上的东西等)中写入两个数据库并最终将 reads 适当地移动到他们需要去的地方。如果您需要大批量写入,您可以在该抽象层进行缓冲,直到在发送之前达到您选择的阈值。

综上所述,根据您的数据复杂性,每晚的 ETL 作业也完全可行,但您 运行 会陷入管理和监控该额外流程的额外复杂性。另一个潜在的缺点是数据总是过时一天。