背景:我们目前在两个关系数据库(Oracle和Postgres)之间分配数据。需要运行涉及两个数据库中的表的即席查询。目前,我们采用以下两种方式之一:
我们已经使用Google Cloud Platform(适用于使用Postgres服务器的项目)。我们熟悉Google BigQuery(BQ)。
我们想做什么: 我们希望这些数据库中的大多数表(按原样)在一个位置可用,因此查询它们既简单又快速。我们正在考虑将数据从两个数据库服务器复制到BQ,而不进行任何转换。
看起来我们需要定期(每天)对表进行完全转储并更新BQ,因为BQ是append-only。最近在BQ中DML的可用性似乎非常有限。
我们知道将表格加载到BQ并不是最佳解决方案,我们需要对效率进行非规范化,但这是我们在分析可行性后必须解决的问题。
我的问题是BQ对我们来说是否是一个很好的解决方案,如果是,如何有效地保持BQ与我们的数据库数据同步,或者我们是否应该查看其他内容(比如说,Redshift)?
答案 0 :(得分:2)
WePay一直在发表一系列有关如何解决这些问题的文章。查看https://wecode.wepay.com/posts/streaming-databases-in-realtime-with-mysql-debezium-kafka。
为了让所有事情保持同步:
数据流从每个微服务的MySQL数据库开始。这些 数据库在Google Cloud中作为具有GTID的CloudSQL MySQL实例运行 启用。我们专门设置了一个下游MySQL集群 Debezium。每个CloudSQL实例都将其数据复制到Debezium中 集群,由两台MySQL机器组成:主机(主动) 服务器和辅助(被动)服务器。这个单一的Debezium集群是 一个操作技巧,使我们更容易操作Debezium。 而不是让Debezium连接到几十个微服务 直接数据库,我们只能连接到一个数据库。这个 还可以隔离Debezium,影响生产OLTP工作负载 主CloudSQL实例正在处理。
然后:
Debezium连接器将MySQL消息提供给Kafka(并添加 他们的模式到Confluent架构注册表),在哪里下游 系统可以消耗它们。我们使用Kafka connect BigQuery连接器 使用BigQuery的流API将MySQL数据加载到BigQuery中。 这为BigQuery提供了一个通常小于的数据仓库 生产数据落后30秒。其他微服务, 流处理器和数据基础架构也会使用这些源。