回填数据到 TimescaleDB 的超表中可能会非常棘手,尤其是当涉及到自动任务(如压缩策略)时。从以往的经验来看,如果回填操作没有正确处理,它们可能会干扰这些自动任务,有时甚至会导致它们完全停止工作。
本文介绍了更安全、更可靠的回填超表的方法,以及防止压缩和其他后台进程中断的最佳实践。
什么是回填操作?
回填是指在时间已经过去后,将旧的或缺失的数据添加到数据库表中。
想象一下,你每小时收集一次温度读数,但你的系统停机了一天,没有保存任何数据。后来,你从设备的本地存储或云存储中获取了这些缺失的数据,并希望将其放回正确的超表中,这就称为回填。
在 TimescaleDB 中,这种情况在时间序列数据中很常见,但需要谨慎操作。因为 TimescaleDB 可能在后台执行一些操作,比如压缩旧数据以节省空间。如果不小心,回填可能会干扰这些自动任务。
执行回填前的准备工作
以下是执行生产环境中平滑回填的几个重要步骤,以确保在出现问题时做好准备。
切勿在生产环境中进行实验
始终避免在生产环境中直接进行更改,即使它们看起来微不足道。每个操作都应在暂存环境中进行彻底测试,以确保其按预期工作,然后再应用于生产环境。
即使目标是修复或调查已知问题,直接在生产环境中进行未经测试的更改仍然可能导致意外停机。在实时系统上调试或重现问题存在风险,可能会干扰可用性,即使更改看起来是安全的。
为了避免这种风险,维护一个与生产环境尽可能接近的暂存环境至关重要。在执行像回填这样的重大操作之前,在暂存环境中进行测试,观察系统的响应情况,只有在确信其行为符合预期后,才进行生产部署。
任何回填场景都可能在数据量、持续时间、结构以及对压缩的影响方面有所不同。在暂存环境中进行测试有助于尽早发现潜在问题,并确保在生产环境中更安全、更稳定的推出。
在执行回填之前备份生产环境
这是执行安全回填的另一个关键方面。
备份提供了在回填过程中出现问题时恢复数据库到先前状态的能力。
为了更加谨慎,在开始回填之前,强烈建议检查你正在使用的备份工具。确认最近的备份可用,并验证是否可以进行时间点恢复(PITR)。这确保了在出现任何意外问题时,我们可以快速恢复数据库,尽量减少干扰。
选择低客户活动时间
作为最佳实践,我们建议为任何维护活动(如回填)选择一个数据库或服务器流量低的时间窗口。这可以最大限度地降低操作风险,如果出现问题,将对更少的客户产生影响,并且有足够的时间在高峰时间之前恢复操作。
提前通知客户数据库维护
一旦选择了低流量的时间窗口和日期,下一步是通知客户即将进行的数据库维护。告知他们在此过程中可能会出现临时性能下降和轻微操作不一致的可能性。
如果回填在选定的日期和时间按计划进行,将不会存在操作风险,数据库将继续平稳运行。然而,如果出现任何问题,我们将有足够的时间将数据库恢复到其原始状态,并且客户已经得到了通知。
一旦满足所有前提条件,我们就可以继续进行回填操作。
执行回填的方法
在本节中,我们将介绍在生产环境中执行大规模回填操作的三种关键方法。
方法 1:Timescale 推荐的回填方法
要执行大规模回填,Timescale 推荐以下方法:
- 删除现有的压缩策略。
- 确定将受到回填影响的块。
- 解压缩这些特定的块。
- 执行回填操作。
- 重新启用压缩策略。
一旦重新启用,该策略将自动压缩在回填期间更新的块。
请注意,此方法需要事先知道哪些块将参与回填。解压缩这些块可能会对磁盘空间造成很大压力,具体取决于数据量,可能会迅速增长。此外,此过程可能耗时较长。
这种方法的简单缺点是,在以下方面可能会显著增加成本
- 磁盘空间(因为它需要解压缩整个块),
- 时间(由于解压缩和重新压缩的开销),
- 成本(与资源使用相关)。
然而,如果你更倾向于遵循 Timescale 推荐的方法,并且能够接受上述列出的权衡,那么你可以继续进行,因为这被认为是一种更安全、更值得信赖的方法。
我们也可以考虑以下可能更符合我们需求的方法。
方法 2:在压缩数据上执行回填
另一种方法包括以下步骤:
- 删除超表上的压缩策略。
- 执行完整的回填操作。
- 重新启用压缩策略。
一旦重新启用,该策略将在其下次运行时自动压缩回填的块。
虽然这种方法看起来比之前推荐的方法更简单、更高效,但有一个重要的观察结果需要考虑。
有时,我们注意到在压缩策略正在压缩回填数据时,某些 SELECT 查询失败了。有趣的是,一旦压缩过程完成,相同的查询执行成功且迅速。
如果我们选择按照这种方法进行,建议在服务器活动低的时期安排,这将有助于减少客户的 SELECT 查询数量,并降低错误的可能性。
方法 3:分块执行回填
这是另一种可以用来执行回填的替代方法。以下是建议的步骤:
- 暂时删除压缩策略。
- 在较小的块上对压缩数据执行回填。
例如,如果你需要回填六个月的数据,不要一次性完成。相反,将其分成一个月的块,并在每隔几天或几周进行一次回填。这意味着回填将在多轮中运行。
在每轮之后,重新启用压缩策略,以便它可以压缩新修改的块。
一旦你确信该过程对第一个月的数据运行良好,再重复相同的步骤,处理剩余的月份,要么在第二天,要么在下周。
如果满足以下条件,这种方法才有效:
- 你可以将回填数据分成较小的子集。
- 你有足够的时间(分布在几天或几周内)来完成回填。
通过使用这种方法,我们可以减少磁盘使用量的峰值,并且可能避免在暂存环境中测试方法 2 时遇到的问题。我们还将对回填操作拥有更多控制权。
结论
虽然方法 1 中的建议直接来自 Timescale,但方法 2 和方法 3 中概述的方法是基于我们自己的学习和经验。在将任何方法应用于生产环境之前,重要的是在暂存环境中对其进行彻底测试,确保所有必要的验证都已完成,并且只有在你对结果完全有信心后,才进入生产环境。
原文地址:https://stormatics.tech/blogs/how-to-safely-perform-backfill-operations-in-timescaledb
原文作者:Semab Tariq




