我正在设计一种解决方案,其中将使用Google Cloud SQL来存储应用程序常规功能(OLTP数据)中的所有数据。随着时间的流逝,数据将增长到相当大的尺寸。数据本身本质上是关系的,因此我们选择了云SQL而不是云数据存储。
这些数据需要征求分析的大量查询,这需要是接近实时分析(最好的情况),尽管实际上可以预期一些滞后。但是我正在尝试设计一种将此滞后降低至最低可能的解决方案。
我的问题有3个部分 -
-
我是否应该使用云SQL来存储数据,然后将其移至BigQuery或更改基本设计本身并使用BigQuery最初也存储数据?BigQuery适合用于常规,低延迟的OLTP工作负载吗?(我认为不是这样 - 我的假设正确吗?)
-
将云SQL数据加载到BigQuery的推荐/最佳实践是什么?
-
Cloud DataFlow是一个不错的选择吗?如果我将Cloud SQL连接到Cloud DataFlow,并将其连接到BigQuery-它会起作用吗?还是有其他方法可以实现这一目标(如问题2中所问)?
看一下Wepay如何做到这一点:
- https://wecode.wepay.com/posts/bigquery-wepay
GCS操作员的MySQL针对MySQL执行选择查询 桌子。选择将所有大于(或等于)最后一个数据提取的所有数据 高水印。高水印是 表(如果表仅附加)或修改时间戳 列(如果表收到更新)。再次,选择语句 还可以返回一些时间(或行)以捕获潜在的掉落 从上一个查询到的行(由于上述问题)。
使用气流,他们设法每15分钟将BigQuery同步到其MySQL数据库。
BigQuery支持云SQL联合查询,该查询使您可以直接从BigQuery查询云SQL数据库。要使云SQL表与BigQuery同步,您可以编写一个简单的脚本,以下查询每小时同步两个表。
INSERT
demo.customers (column1)
SELECT
*
FROM
EXTERNAL_QUERY(
"project.us.connection",
"SELECT column1 FROM mysql_table WHERE timestamp > ${timestamp};");
只记得将$ {Timestamp}替换为当前时间戳-1小时。
另一种方法是将写入过程拆分为cloudsql和cloud pub/sub,然后将数据流读取器传输到bigquery中。当您为BigQuery表具有实质性不同的目标架构时,这很好地工作了 - 在使您的关系数据符合时,这很常见。
上升空间是您可以减少总体延迟来说几秒钟;但是,主要的缺点是,如果您的交易数据高度突变,则必须创建一个版本控制来跟踪更改。
Google提供了有关此主题的参考文章,与使用更改数据捕获工具来识别更改的数据并仅推动这一点有关。
这做出了一些可能对您不起作用的假设:
- 愿意学习debezium
- 愿意让GCP连接到您的源MySQL数据库
如果这些对您的情况有效,这似乎是一个很好的解决方案。
我认为您可以将联合查询用作一个可能的解决方案:
联合查询是一种向外部数据库发送查询语句并将结果作为临时表的方式。联合查询使用BigQuery Connection API与外部数据库建立连接。在您的标准SQL查询中,您使用该数据库的SQL方言,使用external_query函数将查询语句发送到外部数据库。结果将转换为BigQuery标准SQL数据类型。
您可以使用以下外部数据库使用联合查询:
云扳手云SQL最初的一次性设置后,您可以使用external_query sql函数编写查询。
我给您保留该文档,以便您可以在项目上实现它:https://cloud.google.com/bigquery/docs/federated-queries-intro