高可用性和数据弹性

本页面介绍了高可用性以及我们建议使用的工具。

数据弹性简介

您可以从可用性、服务恢复时间和数据丢失方面考虑数据弹性。可用性通常以正常运行时间来衡量,并以数据库可用时间所占的百分比来表示。例如,如需实现 99.99% 的可用性,您的数据库每年的停机时间不能超过 52.6 分钟,即每月不能超过 4.38 分钟。服务中断后恢复服务所需的时间称为恢复时间目标 (RTO)。由于中断而可以接受的数据丢失量称为恢复点目标 (RPO),以事务丢失的时长来表示。例如,RPO 为 10 分钟意味着,在发生故障时,您最多可能会丢失 10 分钟的数据。

常见的做法是设置可用性目标或服务等级目标 (SLO),以及 RTO 和 RPO 的目标。例如,对于给定的工作负载,您可以将 SLO 设置为 99.99%,同时要求 RPO 为 0,在任何故障发生时不丢失数据,且 RTO 为 30 秒。对于其他工作负载,您可以将 SLO 设置为 99.9%、RPO 设置为 5 分钟,且 RTO 设置为 10 分钟。

您可以使用数据库备份实现基本的数据库弹性。AlloyDB Omni 支持使用 pgBackRest 进行备份,还会归档数据库预写式日志 (WAL) 文件,以最大限度地减少数据丢失。使用这种方法时,如果主数据库发生故障,则可以从备份恢复数据库,RPO 为几分钟,RTO 为几分钟到几小时,具体取决于数据库的大小。

对于更严格的 RPO 和 RTO 要求,您可以使用 Patroni 在高可用性配置中设置 AlloyDB Omni。在此架构中,有一个主数据库和两个备用数据库(也称为副本数据库)。您可以将 AlloyDB Omni 配置为使用标准 PostgreSQL 流式复制,以确保在主数据库中提交的每个事务都会同步复制到两个备用数据库。这样,在大多数发生故障的情况下,RPO 为零,RTO 不到 60 秒。

根据您的集群配置,同步复制可能会影响事务的响应时间,您可以选择遇到丢失少量数据的风险。例如,您可以通过使用异步复制(而非同步复制)来实现高可用性,从而获得非零 RPO 来换取更短的事务延迟时间。由于同步复制可能会对事务延迟时间产生影响,因此高可用性架构几乎总是在单个数据中心内或相距较近(相距数十公里/延迟时间相差不到 10 毫秒)的数据中心之间实现。不过,请注意,本文档使用同步复制作为默认设置。

对于灾难恢复(用于防止数据中心或在多个数据中心彼此靠近的区域发生数据丢失),AlloyDB Omni 可配置为从主要区域异步流式复制到次要区域,通常相距数百或数千公里,或相差数十毫秒到数百毫秒。在此配置中,主要区域配置为在该区域内的主要数据和备用数据库之间进行同步流式复制,并配置了从主要区域到一个或多个次要区域的异步流式复制。可以在具有多个数据库实例的次要区域中配置 AlloyDB Omni,以确保在从主要区域故障切换后立即受到保护。

高可用性的工作原理

用于实现数据库高可用性的具体技术和工具可能因数据库管理系统而异。以下是通常用于实现数据库高可用性的部分技术和工具,具体取决于数据库管理系统:

  • 冗余:在多个服务器或地理区域之间复制数据库,可在主实例发生故障时提供故障切换选项。

  • 自动故障切换:用于检测故障并无缝切换到健康状况良好的副本的机制,可最大限度地缩短停机时间。系统会路由查询,以便应用请求到达新的主节点。

  • 数据连续性:实施了保护措施,以便在发生故障时保护数据完整性。这包括复制技术和数据一致性检查。

  • 集群:集群涉及将多个数据库服务器分组,使其作为单个系统协同工作。这样,集群中的所有节点都是活跃节点,并处理请求,从而提供负载均衡和冗余。

  • 回退:使用故障切换之前具有原始容量的主节点和副本节点回退到原始架构的方法。

  • 负载均衡:将数据库请求分发到多个实例,可提高性能并处理增加的流量。

  • 监控和提醒:监控工具可检测服务器故障、延迟时间过长、资源耗尽等问题,并触发提醒或自动故障切换过程。

  • 备份和恢复:在发生数据损坏或灾难性故障时,可以使用备份将数据库恢复到先前状态。

  • 连接池(可选):优化与数据库交互的应用的性能和可伸缩性。

高可用性工具

Patroni 是一个适用于 PostgreSQL 数据库的开源集群管理工具,旨在管理和自动实现 PostgreSQL 集群的高可用性。Patroni 使用各种分布式共识系统(例如 etcdConsulZookeeper)来协调和管理集群状态。Patroni 的一些主要功能和组件包括:通过自动故障切换实现高可用性、主节点选举、复制和恢复。Patroni 与数据库服务器实例上的 PostgreSQL 服务一起运行,管理其健康状况、故障切换和复制,以确保高可用性和可靠性。

Patroni 使用分布式共识系统来存储元数据并管理集群。在本指南中,我们使用名为 etcd 的分布式配置存储区 (DCS)。etcd 的用途之一是存储和检索分布式系统信息(例如配置、健康状况和当前状态),以确保在所有节点上提供一致的配置。

高可用性代理 (HAProxy) 是一种开源软件,用于对基于 TCP 和 HTTP 的应用进行负载均衡和代理,并通过在多个服务器之间分发传入请求来提高 Web 应用的性能和可靠性。HAProxy 通过在多个服务器之间分配网络流量来提供负载均衡。HAProxy 还通过执行健康检查来维护其连接到的后端服务器的健康状况。如果服务器未通过健康检查,HAProxy 会停止向其发送流量,直到服务器再次通过健康检查。

同步和异步复制注意事项

在 Patroni 管理的 PostgreSQL 集群中,可以同时以同步和异步模式配置复制。默认情况下,Pastore 使用异步流式复制。如果有严格的 RPO 要求,我们建议您使用同步复制。

PostgreSQL 中的同步复制会先等待事务同时写入主集群和至少一个同步备用集群,再提交事务,从而确保数据一致性。同步复制可确保在发生主集群故障时数据不会丢失,从而提供强大的数据耐用性和一致性。主集群等待同步备用集群的确认,这可能会导致延迟时间更长,并且由于往返时间增加,吞吐量可能会更低。这可能会降低系统的整体吞吐量,尤其是在高负载下。

借助异步复制,您可以在主集群上提交事务,而无需等待备用集群的确认。主集群会将 WAL 记录发送到备用集群,后者会异步应用这些记录。这种异步方法可缩短写入延迟时间并提高性能,但如果主集群在备用集群同步之前发生故障,则存在数据丢失的风险。备用集群可能滞后于主集群,导致故障切换期间可能出现不一致的情况。

在 Patroni 集群中,选择同步复制还是异步复制取决于对数据耐用性、一致性和性能的具体要求。在数据完整性和最大限度减少数据丢失至关重要的场景中,同步复制是首选;而异步复制则适合将性能和更短的延迟时间作为优先考虑的环境。您可以配置混合解决方案,其中包含一个三节点集群,该集群在同一区域但在不同的附近可用区或数据中心中有一个同步备用集群,并在其他区域或距离更远的数据中心中有另一个异步备用集群,以防范潜在的区域级服务中断。

后续步骤