【问题标题】:How to integrate Google Cloud SQL with Google Big Query如何将 Google Cloud SQL 与 Google Big Query 集成
【发布时间】:2018-03-04 08:12:43
【问题描述】:
我正在设计一个解决方案,在该解决方案中,Google Cloud SQL 将用于存储来自应用程序正常运行的所有数据(OLTP 数据类型)。预计数据会随着时间的推移增长到相当大的规模。数据本身是关系型的,因此我们选择了 Cloud SQL 而不是 Cloud Datastore。
这些数据需要输入 Big Query 进行分析,并且需要接近实时的分析(最好的情况),尽管实际上可能会出现一些滞后。但我正在尝试设计一种解决方案,将这种延迟降至最低。
我的问题有 3 个部分 -
我应该使用 Cloud SQL 存储数据,然后将其移至 BigQuery 还是更改基本设计本身并最初也使用 BigQuery 存储数据? BigQuery 是否适合用于常规、低延迟的 OLTP 工作负载?(我不这么认为 - 我的假设是否正确?)
将 Cloud SQL 数据加载到 BigQuery 并让这种集成近乎实时地工作的推荐/最佳做法是什么?
Cloud Dataflow 是一个不错的选择吗?如果我将 Cloud SQL 连接到 Cloud DataFlow 并进一步连接到 BigQuery - 它会起作用吗?或者有没有其他更好的方法来实现这一点(如问题 2 中所问)?
【问题讨论】:
标签:
google-bigquery
google-cloud-platform
google-cloud-sql
google-cloud-dataflow
【解决方案1】:
看看WePay是如何做到的:
MySQL 到 GCS 运算符对 MySQL 执行 SELECT 查询
桌子。 SELECT 提取所有大于(或等于)最后一个的数据
高水印。高水位线要么是主键
表(如果表是仅附加的),或修改时间戳
列(如果表接收更新)。同样,SELECT 语句
还可以回溯一点时间(或行)以捕获可能丢弃的
上次查询中的行(由于上述问题)。
借助 Airflow,他们设法使 BigQuery 每 15 分钟与他们的 MySQL 数据库同步一次。
【解决方案2】:
BigQuery 支持Cloud SQL federated queries,让您可以直接从 BigQuery 查询 Cloud SQL 数据库。为了让 Cloud SQL 表与 BigQuery 保持同步,您可以编写一个简单的脚本,使用以下查询每小时同步两个表。
INSERT
demo.customers (column1)
SELECT
*
FROM
EXTERNAL_QUERY(
"project.us.connection",
"SELECT column1 FROM mysql_table WHERE timestamp > ${timestamp};");
请记住将 ${timestamp} 替换为当前时间戳 - 1 小时。
【解决方案3】:
另一种方法是将写入过程拆分到 CloudSQL 和 Cloud Pub/Sub,然后让 Dataflow 阅读器流式传输到 BigQuery。当您的 BigQuery 表具有明显不同的目标架构时,这很有效 - 这在对关系数据进行非规范化时很常见。
好处是您可以将整体延迟减少到几秒钟;然而,主要的缺点是,如果您的事务数据高度变异,您将不得不创建一个版本控制方案来跟踪更改。
【解决方案4】:
Google 已就此主题提供了reference article,该主题与使用变更数据捕获工具识别变更数据并仅推送该工具有关。
这做出了一些可能对您不起作用的假设:
- 愿意学习 debezium
- 愿意让 GCP 连接到您的源 MySQL 数据库
如果这些适合您的情况,这似乎是一个很好的解决方案。