本页介绍了高可用性以及我们建议使用的工具。
数据弹性简介
您可以从可用性、服务恢复时间和数据丢失等方面来考虑数据弹性。可用性通常以正常运行时间衡量,并表示为数据库可用的时间所占的百分比。例如,若要实现 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 使用各种分布式共识系统(例如 etcd、Consul 或 Zookeeper)来协调和管理集群状态。Patroni 的一些主要功能和组件包括高可用性(包括自动故障切换)、主副本选举、复制和恢复。Patroni 与 PostgreSQL 服务一起在数据库服务器实例上运行,管理其运行状况、故障转移和复制,以确保高可用性和可靠性。
Patroni 使用分布式共识系统来存储元数据和管理集群。在本指南中,我们使用一个名为 etcd 的分布式配置存储 (DCS)。etcd 的一个用途是存储和检索分布式系统信息(例如配置、运行状况和当前状态),以确保所有节点的配置保持一致。
高可用性代理 (HAProxy) 是一款用于负载均衡和代理基于 TCP 和 HTTP 的应用的开源软件,可通过将传入请求分布到多个服务器来提高 Web 应用的性能和可靠性。HAProxy 通过在多个服务器之间分配网络流量来实现负载均衡。HAProxy 还会通过执行健康检查来维护其连接到的后端服务器的健康状态。如果服务器未通过健康检查,HAProxy 会停止向其发送流量,直到该服务器再次通过健康检查。
同步和异步复制注意事项
在 Patroni 管理的 PostgreSQL 集群中,可以同时以同步和异步模式配置复制。默认情况下,Patroni 使用异步流式复制。对于严格的 RPO 要求,我们建议使用同步复制。
PostgreSQL 中的同步复制会等待事务同时写入主数据库和至少一个同步备用数据库,然后再提交,以确保数据一致性。同步复制可确保在主实例发生故障时数据不会丢失,从而提供强大的数据持久性和一致性。主副本会等待同步待机副本的确认,这可能会导致延迟时间增加,并且由于增加了往返时间,吞吐量可能会降低。这可能会降低总体系统吞吐量,尤其是在高负载下。
借助异步复制,您可以在主集群上提交事务,而无需等待来自备用集群的确认。主服务器会将 WAL 记录发送到备用服务器,后者会异步应用这些记录。这种异步方法可缩短写入延迟时间并提高性能,但如果主副本在备用副本赶上之前发生故障,则可能会导致数据丢失。备用服务器可能会落后于主服务器,导致故障切换期间可能出现不一致的情况。
在 Patroni 集群中,选择同步复制还是异步复制取决于对数据持久性、一致性和性能的具体要求。在数据完整性和最大限度减少数据丢失至关重要的场景中,同步复制是首选;而异步复制则适用于将性能和更短的延迟时间作为优先事项的环境。您可以配置混合解决方案,其中包含一个三节点集群,其中一个同步备用节点位于同一区域但位于附近的其他可用区或数据中心,第二个异步备用节点位于其他区域或更远的数据中心,以防范可能发生的区域性服务中断。