# 高可用性

> 具有自动故障转移和自愈能力的企业级高可用性
---

Pigsty 使用 [Patroni](https://patroni.readthedocs.io/en/latest/) 为 PostgreSQL 实现高可用性，确保自动故障转移。

![pigsty-ha](/img/pigsty/ha.png)

**说明**

**主节点故障 RTO ≈ 30s，RPO &amp;lt; 1MB，副本故障 RTO≈0**（重置当前连接）

--------

## 概述 {#overview}

Pigsty 的 PostgreSQL 集群具有由 [Patroni](https://patroni.readthedocs.io/en/latest/)、[Etcd](https://etcd.io/) 和 [HAProxy](http://www.haproxy.org/) 支持的内置高可用性。

当您在 PostgreSQL 集群中有两个或更多实例时，您就能够从硬件故障中自愈，无需任何进一步配置——只要集群中的任何实例存活，集群就能提供服务。客户端只需连接到集群中的任何节点即可获得完整服务，无需担心复制拓扑变化。

默认情况下，主节点故障的恢复时间目标（RTO）约为 30s ~ 60s，数据恢复点目标（RPO）< 1MB；对于备用节点故障，RPO = 0，RTO ≈ 0（瞬时）。在一致性优先模式下，保证故障转移期间零数据丢失：RPO = 0。这些指标可以根据您的实际硬件条件和可靠性要求 [**按需配置**](#trade-offs)。

Pigsty 集成了 HAProxy 负载均衡器进行自动流量切换，为客户端提供多种访问方法，如 DNS/VIP/LVS。除了偶发的中断外，故障转移和切换对业务端几乎不可感知，这意味着应用程序不需要修改连接字符串或重启。

### 关键指标 {#key-metrics}

<div class="grid grid-cols-2 md:grid-cols-4 gap-4 my-6">
  <div class="text-center p-4 border rounded-lg">
    <div class="text-2xl font-bold text-emerald-600">RTO ~ 30s</div>
    <div class="text-sm text-gray-600">主节点故障</div>
  </div>
  <div class="text-center p-4 border rounded-lg">
    <div class="text-2xl font-bold text-emerald-600">RPO &lt; 1MB</div>
    <div class="text-sm text-gray-600">异步模式 RPO</div>
  </div>
  <div class="text-center p-4 border rounded-lg">
    <div class="text-2xl font-bold text-emerald-600">RTO ~ 0s</div>
    <div class="text-sm text-gray-600">副本故障</div>
  </div>
  <div class="text-center p-4 border rounded-lg">
    <div class="text-2xl font-bold text-emerald-600">RPO = 0</div>
    <div class="text-sm text-gray-600">同步模式</div>
  </div>
</div>

--------

## 高可用性解决的问题 {#what-high-availability-solves}

高可用性解决关键的运营挑战：


**数据安全**


**提升可用性**：RPO ≈ 0，RTO < 30s，增强数据保护



**滚动维护**


**无缝维护**：最小化维护窗口，运营便利



**硬件故障**


**自愈能力**：无需人工干预即可从硬件故障中自动恢复



**负载分布**


**读扩展**：在备用实例间分布只读查询





### 具体优势 {#specific-benefits}

- **增强数据安全性**：将数据安全 CIA 的可用性方面提升到新高度
- **滚动维护能力**：实现最小停机时间的无缝维护
- **硬件故障恢复**：无需人工干预即可从硬件故障中自愈
- **负载共享**：只读请求可以分布在备用实例间

--------

## 高可用性的成本 {#costs-of-high-availability}

实施 HA 会引入某些权衡和要求：

**说明**

**基础设施要求**：HA 需要至少 **3 个节点** 和额外的基础设施依赖。

### 资源要求 {#resource-requirements}

- **最小集群规模**：至少 3 个节点以实现适当的共识
- **额外基础设施**：需要共识存储（Etcd）和负载均衡器
- **资源开销**：额外的 CPU、内存和网络资源
- **运营复杂性**：增加的监控和管理要求

### 限制 {#limitations}

**说明**

高可用性 **无法防止**：
- 人为错误和操作失误
- 导致数据损坏的软件缺陷
- 逻辑数据删除或损坏

对于这些场景，需要额外的恢复策略：
- [**延迟集群**](#delayed-replica) 防护逻辑损坏
- **时间点恢复** 进行细粒度数据恢复
- **定期备份** 用于灾难恢复场景

--------

## 架构 {#architecture}

Pigsty 的 HA 架构利用多组件设计消除单点故障：


**Patroni**


**集群管理**：编排 PostgreSQL 进程并处理自动故障转移



**Etcd**


**共识存储**：提供分布式配置和领导者选举



**HAProxy**


**负载均衡器**：路由流量并提供服务发现



**VIP Manager**


**虚拟 IP**：用于无缝连接的可选第二层 VIP 绑定





### 组件角色 {#component-roles}

**Patroni**

**集群编排器**

- 管理 PostgreSQL 服务器进程
- 处理自动故障转移和切换
- 监控集群健康和拓扑
- 配置流复制
- 提供集群管理 REST API

```yaml
# Patroni 配置示例
patron:
  name: pg-test-1
  scope: pg-test
  bootstrap:
    dcs:
      ttl: 30
      loop_wait: 10
      retry_timeout: 30
```

**Etcd**

**分布式配置存储**

- 存储集群配置和状态
- 提供领导者选举机制
- 确保所有节点的一致视图
- 优雅处理网络分区
- 维护集群成员信息

```yaml
# Etcd 集群配置
etcd_cluster: etcd
etcd_safeguard: false
```

**HAProxy**

**流量路由器和负载均衡器**

- 将读/写流量路由到适当的节点
- 为数据库实例提供健康检查
- 提供多个服务端点
- 处理连接池和负载分布
- 支持 SSL 终止和连接限制

```bash
# HAProxy 服务端点
primary:5433    # 主节点读写流量
replica:5434    # 副本只读流量
default:5436    # 故障转移感知连接
offline:5438    # 专用离线查询
```

**VIP Manager**

**虚拟 IP 管理**

- 管理第二层虚拟 IP 地址
- 提供无缝客户端连接
- 在故障转移期间处理 VIP 迁移
- 支持多个 VIP 接口
- 用于简化客户端访问的可选组件

```yaml
# VIP 配置
vip_enabled: true
vip_address: 10.10.10.99/24
vip_interface: eth0
```

--------

## 实现 {#implementation}

Pigsty 的 HA 实现遵循 PostgreSQL 集群的成熟模式：

### 复制架构 {#replication-architecture}


### 步骤 1
### 流复制 {#streaming-replication}
PostgreSQL 使用内置流复制在主节点和备用节点之间进行数据同步。

### 步骤 2
### 基于共识的领导 {#consensus-based-leadership}
Patroni 使用 Etcd 进行分布式共识来选举集群领导者并管理拓扑变化。

### 步骤 3
### 自动故障转移 {#automatic-failover}
当主节点失败时，Patroni 自动提升最新的备用节点成为新的主节点。

### 步骤 4
### 流量重路由 {#traffic-rerouting}
HAProxy 检测拓扑变化并自动将流量路由到新的主实例。


### 故障场景 {#failure-scenarios}

**Primary Failure**

**主节点故障处理过程**

1. **检测**：Patroni 检测主节点故障（15-30 秒）
2. **领导者选举**：Etcd 协调新领导者选择
3. **提升**：最新的备用节点被提升为主节点
4. **重新配置**：剩余的备用节点重新配置到新主节点
5. **流量切换**：HAProxy 将流量重定向到新主节点

**说明**

&lt;p&gt;&lt;strong&gt;写服务中断&lt;/strong&gt;：故障转移过程中 15-30 秒&lt;/p&gt;

**Standby Failure**

**备用节点故障处理过程**

1. **检测**：立即检测到备用节点故障
2. **流量重路由**：HAProxy 从池中移除故障节点
3. **服务连续性**：只读查询在剩余备用节点上继续
4. **自动恢复**：节点恢复时自动重新加入集群

**说明**

&lt;p&gt;&lt;strong&gt;最小影响&lt;/strong&gt;：只读查询仅经历短暂中断&lt;/p&gt;

**Network Partition**

**网络分区处理**

1. **防止脑裂**：Etcd 共识防止多个主节点
2. **仲裁要求**：需要大多数节点进行操作
3. **优雅降级**：少数分区中的只读模式
4. **自动恢复**：分区愈合时恢复正常操作

**说明**

&lt;p&gt;&lt;strong&gt;仲裁依赖&lt;/strong&gt;：需要大多数共识节点保持运行&lt;/p&gt;

--------

## 权衡 {#trade-offs}

Pigsty 提供可配置参数来平衡恢复速度和数据一致性：

### 恢复时间目标（RTO） {#recovery-time-objective-rto}

`pg_rto` 参数控制故障转移时间和敏感性：

```yaml
# RTO 配置
pg_rto: 30  # 默认：30 秒
```

**较低的 RTO 值：**
- ✅ 更快的故障转移响应
- ✅ 减少服务中断
- ❌ 更高的误报风险
- ❌ 可能导致不必要的故障转移

**较高的 RTO 值：**
- ✅ 更稳定，较少误报
- ✅ 对网络故障有更好的容忍度
- ❌ 更长的服务中断
- ❌ 对真实故障的延迟响应

### 恢复点目标（RPO） {#recovery-point-objective-rpo}

`pg_rpo` 参数限制故障转移期间的潜在数据丢失：

```yaml
# RPO 配置
pg_rpo: 1048576  # 默认：1MB
```

**较低的 RPO 值：**
- ✅ 更好的数据一致性
- ✅ 最小的数据丢失风险
- ❌ 可能延迟故障转移
- ❌ 可能影响可用性

**较高的 RPO 值：**
- ✅ 更快的故障转移过程
- ✅ 更好的可用性
- ❌ 更多数据丢失的可能性
- ❌ 一致性权衡

### 配置示例 {#configuration-examples}

**Consistency First**

```yaml
# 零数据丢失配置
synchronous_mode: true
synchronous_mode_strict: true
pg_rpo: 0
pg_rto: 60
synchronous_standby_names: 'ANY 1 (*)'
```
**使用场景**：金融系统、关键交易数据

**Availability First**

```yaml
# 快速故障转移配置
synchronous_mode: false
pg_rpo: 16777216  # 16MB
pg_rto: 15
max_replication_slots: 16
```
**使用场景**：高流量应用、读重型工作负载

**Balanced**

```yaml
# 默认平衡配置
synchronous_mode: false
pg_rpo: 1048576   # 1MB
pg_rto: 30
max_replication_slots: 8
```
**使用场景**：大多数生产环境

### 网络质量影响 {#network-quality-impact}

网络条件显著影响 HA 行为：

- **高质量网络**：可以安全使用较低的 RTO 值
- **不稳定网络**：需要较高的 RTO 以防止误报
- **WAN 部署**：需要仔细调整超时参数
- **本地网络**：可以优化更快的故障转移

--------

## 监控和可观测性 {#monitoring-and-observability}

Pigsty 为 HA 集群健康提供全面监控：

### 关键指标 {#key-metrics2}


**集群状态**


监控集群拓扑、领导者状态和成员健康



**复制延迟**


跟踪所有副本的复制延迟和同步状态



**故障转移事件**


记录并分析故障转移事件及其影响



**性能**


监控查询性能和连接健康





### 仪表板集成 {#dashboard-integration}

Pigsty 包含用于 HA 监控的预构建 Grafana 仪表板：

- **集群概览**：实时集群拓扑和健康
- **复制监控**：延迟指标和同步状态
- **故障转移分析**：历史故障转移事件和时间
- **性能指标**：正常和故障转移场景下的查询性能

--------

## 最佳实践 {#best-practices}

### 部署建议 {#deployment-recommendations}

**说明**

**反亲和性**：在不同的物理主机、机架或可用区部署集群节点。

- **硬件多样性**：使用不同的硬件配置以避免常见故障模式
- **网络冗余**：确保集群节点间有多条网络路径
- **存储考虑**：使用本地存储获得最佳性能，特定用例使用共享存储
- **监控设置**：在投产前实施全面监控

### 运营指南 {#operational-guidelines}

- **定期测试**：在非生产环境中执行受控的故障转移测试
- **容量规划**：为故障转移场景适当调整集群节点大小
- **备份策略**：维护独立于 HA 设置的定期备份
- **文档**：保持紧急程序运行手册的更新

### 常见陷阱 {#common-pitfalls}

**说明**

**避免这些常见错误：**
- 节点间网络带宽不足
- 复制延迟监控不充分
- 不定期测试故障转移程序
- 防火墙配置不正确

--------

## 总结 {#summary}

Pigsty 的高可用性解决方案提供：

- **自动故障转移**，RTO 不到一分钟
- **可配置一致性**，具有 RPO 控制
- **自愈能力**，用于硬件故障
- **负载均衡**，用于读扩展
- **最小运营开销**，具有自动化管理

Patroni、Etcd 和 HAProxy 的组合创建了一个强大的、生产就绪的 HA 解决方案，自动处理大多数故障场景，同时提供基于特定要求调整行为的灵活性。

---

**高可用性不仅仅是技术——它是构建您的业务可以依赖的弹性系统。**
