我们都熟悉DevOps的原则:构建小型、经过良好测试的增量,频繁部署,并自动化管道以消除手动步骤的需要。我们密切监控我们的应用程序,设置警报,回滚有问题的更改,并在出现问题时接收通知。
然而,当涉及到数据库时,我们往往缺乏同样的控制和可见性。调试性能问题可能具有挑战性,我们可能会努力理解为什么数据库会变慢。模式迁移和修改可能会失控,导致重大挑战。
克服这些障碍需要简化模式迁移和适应的策略,使数据库结构变更高效,停机时间或性能影响最小化。重要的是在整个管道中对所有更改进行统一测试。让我们探讨如何实现这一目标。
自动化您的测试
数据库容易出现多种类型的故障,但它们通常没有像应用程序那样接受严格的测试。虽然开发人员通常测试应用程序是否能够正确读取和写入数据,但他们往往忽视这是如何实现的。确保正确使用索引、避免不必要的延迟加载或验证查询效率等关键方面往往没有得到检查。
例如,我们关注数据库返回了多少行,但忽视了分析它必须读取多少行。同样,回滚程序很少经过测试,这使得我们在每次更改时都面临潜在的数据丢失风险。为了填补这些空白,我们需要全面的自动化测试,能够主动检测问题,最小化手动干预的需要。
我们通常依赖负载测试来识别性能问题,虽然它们可以揭示我们的查询是否足够快速以用于生产,但它们也有显著的缺点。首先,构建和维护负载测试成本高,要求仔细处理GDPR合规性、数据匿名化和有状态应用程序。此外,它们在开发流程中进行得太晚。当负载测试发现问题时,变更已经被实施、审查和合并,这迫使我们重新开始并可能从头开始。最后,负载测试耗时,通常需要数小时来填充缓存和验证应用程序的可靠性,使得它们在早期捕获问题时不够实用。
模式迁移通常超出了我们测试的范围。通常,我们只在迁移完成后运行测试套件,这意味着我们不评估它们花费了多长时间,是否触发了表重写,或是否造成了性能瓶颈。这些问题在测试期间往往被忽视,只有在部署到生产后才变得明显。
另一个挑战是我们测试的数据库过小,无法早期发现性能问题。这种对不充分测试的依赖可能导致负载测试浪费时间,并使得关键方面,如架构迁移,完全未经过测试。这种覆盖的缺失降低了我们的开发速度,导致应用程序出现崩溃问题,并妨碍了灵活性。
解决这些挑战的办法在于实施数据库护栏。数据库护栏在我们编写代码时评估查询、架构迁移、配置和数据库设计。与其依赖流水线运行或冗长的负载测试,这些检查可以直接在IDE或开发环境中进行。通过利用可观察性和生产数据库的预测,护栏评估执行计划、统计信息和配置,确保所有内容在部署后能够顺利运行。
围绕数据库构建可观察性
当我们部署到生产环境时,系统的动态可能会随时间变化。CPU负载可能会激增,内存使用量可能会增加,数据量可能会扩展,数据分布模式可能会改变。快速识别这些问题至关重要,但这还不够。当前的监控工具用原始信号淹没我们,留下我们自己去拼凑推理。例如,它们可能表明CPU负载增加,但无法解释为什么会发生这种情况。调查和识别根本原因的负担完全落在我们身上。这种方法过时且低效。
要真正加快速度,我们需要从传统的监控转向全面的可观测性。我们需要的不是被原始数据淹没,而是能帮助我们理解问题根本原因的可操作见解。数据库防护栏提供了这种转变。它们连接各种因素,展示这些因素如何相互关联,找出问题所在,并提出解决方案。与其仅仅观察 CPU 使用率的飙升,防护栏帮助我们理解最近的部署改变了查询,导致索引被绕过,从而导致 CPU 负载增加。有了这种清晰认识,我们可以果断行动,修复查询或索引以解决问题。从“看到”到“理解”的转变是保持速度和可靠性的关键。
数据库管理的下一个演进是从自动问题调查转向自动解决方案。许多问题可以通过良好集成的系统自动修复。可观测性工具可以分析性能和可靠性问题,并生成必要的代码或配置更改来解决它们。这些修复可以自动应用,也可以要求明确批准,确保问题立即得到解决,而您的付出最小。
除了快速解决问题之外,最终目标是防止问题在首次发生。频繁的回滚或失败会阻碍进展和敏捷性。真正的敏捷性不是通过快速解决问题获得,而是通过设计系统,使问题很少发生。虽然这一愿景可能需要分阶段实现,但它代表了创新的最终方向。
Metis 使您能够克服这些挑战。它在更改提交到代码库之前进行评估,分析查询、架构迁移、执行计划、性能和管道中的正确性。Metis 与 CI/CD 工作流无缝集成,防止有缺陷的更改进入生产环境。但它的功能更进一步——通过分析指标和跟踪部署、扩展和配置,提供对您生产数据库的深度可观察性。当可能时,它会自动修复问题,并在需要人工干预时提醒您。借助 Metis,您可以更快地推进,并自动化 CI/CD 管道的各个方面,确保更顺畅、更可靠的数据库管理。
每个人都需要参与
数据库可观察性旨在主动防止问题,推动自动理解和解决的进展,并在开发过程中融入数据库特定的检查。依赖过时的工具和工作流程已不再够用;我们需要适应当今复杂性的现代解决方案。数据库护栏提供了这种支持。它们帮助开发人员避免编写低效代码,分析架构和配置,并在我们的管道中验证软件开发生命周期的每一步。
护栏还将原始监控数据转化为可操作的洞察,不仅解释了什么出了问题,还说明了如何修复。这个能力在各行各业都是至关重要的,因为系统的复杂性只会持续增长。为了保持领先,我们必须接受能够让我们更快、更高效地行动的创新工具和流程。
Source:
https://dzone.com/articles/testing-is-a-cross-cutting-concern-so-are-databases