这实际上取决于您想要对来自 MySQL 的数据进行哪些转换,以及哪种语言和框架最适合您的环境。
以下是我的建议
- 在 MySQL 和 Redshift 之间添加中间存储,例如 S3
- 考虑数据重新加载机制,以防数据加载到 Redshift 失败
为此,我会考虑使用AWS Data Pipeline,因为它具有现成的模板、重试机制以及内置的日志记录和监控。
它可能看起来像这样:
MySQL -> S3 -> Redshift(暂存)-> SQL -> Redshift(生产)
MySQL -> S3
此数据管道将从“ RDS MySQL 到 S3 的增量副本”模板开始。
您可以参数化存储来自 MySQL 的增量数据的 S3 路径,以便使用 S3 前缀更轻松地管理这些增量。如果不再使用 S3 上的数据,您可以使用 S3 对象生命周期管理定期删除这些对象。
但是,将数据保存在 S3 上还有其他一些好处,您可以使用 AWS Athena 对其进行查询,使用 QuickSight 进行可视化,或者使用 Infrequent Access 或 Glacier 存储类进行归档,以降低存储成本,但保留以供将来使用。
S3 -> Redshift(暂存)
当然,对于你的用例,它必须去 Redshift,所以我推荐 AWS Redshift Loader Lambda。它的设置有点复杂,但一旦成功完成,就像他们声称的那样,它非常接近于零管理。看到这个
使用 AWS Redshift Loader,每次数据到达定义的 S3 前缀时,它都会加载到 Redshift 集群(另外一个),您可以配置 SNS 以通知您或某些日志记录系统。还有其他选项,例如,在加载之前等待 x 个文件,或者每 y 分钟加载一次。
此外,您可能需要仅将部分数据从 S3 加载到 Redshift 到测试或开发环境中。使用 AWS Redshift Loader,您可以只定义一个特定的 S3 前缀,例如 /data/2017/11 以加载到 Redshift。
通过使用 Redshift Loader,您可以使数据加载异步,因此,次要和控制该过程有点困难。对于您的情况,这可能是一个问题。
如果数据加载到 Redshift 失败,您可以使用 Redshfit Loader 命令行工具将特定对象重新加载到 Redshfit。
红移(暂存)-> 红移(生产)
请注意,Redshift 不强制执行引用完整性,例如唯一键,这意味着您必须具有防止将重复行插入 Redshift 表的机制。如果您不担心重复,这无关紧要,您的数据已经在 Redshift 中。
为什么这有关系?因为,如果从源(即 MySQL)检索到的数据已经在 Redshift 中,您必须知道要执行哪些操作。你覆盖它,还是忽略它。
通过在 Redshift 本身中执行此操作,可以很容易地使用唯一列比较新行和现有行,然后删除和插入或仅更新。在 Redshfit 之外进行,可能意味着跟踪 Redshift 之外已经可用的唯一键并在那里进行比较。在哪里?什么时候更新它们?如何?也许您已经有了解决方案。
因此,在上一步中,您将数据插入到 Redshift(暂存)。为了在将数据移动到生产表时确保数据完整性,我们必须进行合并。AWS 建议使用以下技术在 Redsift 中合并数据。
如果是这种情况,为什么不使用 SQL 进行转换,以便管理更少的组件呢?
您可以使用 SQL 定义转换作业,将这些 SQL 脚本存储在 S3 上并在 SQLActivity 中引用它们,以便在 Redsshift 集群上与数据合并脚本一起执行。
考虑到 AWS Kinesis 向 S3 的转换和存储功能,它也可能是合适的。我在上面提出的一些观点也适用于使用 Kinesis。