如何在 ETl 中实现零停机

Posted

技术标签:

【中文标题】如何在 ETl 中实现零停机【英文标题】:How to achieve zero downtime in ETl 【发布时间】:2018-03-22 06:30:11 【问题描述】:

我有一个 ETL 进程,它从事务数据库中获取数据并在处理后将数据存储到另一个数据库中。在存储数据时,我们会截断旧数据并存储新数据以获得更好的性能,因为更新比截断插入需要很多时间。所以在这个过程中,我们会在一段时间内(比如 2 3 分钟)经历计数为 0 或错误数据。我们每 8 小时运行一次 ETL。

那么我们怎样才能避免这个问题呢?我们如何实现零停机?

【问题讨论】:

当完全加载比增量加载快时,它必须是一个小型数据库。我猜在更新期间,您从源中获取所有行,而不是从上次增量加载中更改的行。 我们其实是在对数据做一些计算,需要完整的数据。我们不能使用增量数据。这会使逻辑复杂很多,并可能导致性能问题。 【参考方案1】:

我们过去使用的一种方法是在名为 temp 的表中准备 prod 数据。然后在完成后(并检查,这是我们过程中的冗长部分),删除 prod 并重命名 prod 中的 temp。

几乎没有时间,即使在其他用户锁定表的情况下,该过程也是成功的。

【讨论】:

感谢您的意见。但是对当时在 prod 上运行的现有查询会有什么影响呢?这些查询将被终止,用户将不会得到任何响应。如果我错了,请纠正我

以上是关于如何在 ETl 中实现零停机的主要内容,如果未能解决你的问题,请参考以下文章

Fluent API 首先在 EF 代码中实现零或一到零或一的关系

geotrellis使用(三十九)COG 写入更新

运行时出现零错误

如何在集群环境中进行零停机时间部署?

如何在零停机的情况下迁移 Kubernetes 集群

如何在不停机的情况下更改 AWS-RDS 实例类型?