PostgreSQL etcd 集群介绍

PostgreSQL 使用 etcd 集群主要是为了实现高可用性(HA)和自动故障转移,通常与 Patroni 这样的工具配合使用。

架构概述

复制代码
+------------+    +------------+    +------------+
| PostgreSQL |    | PostgreSQL |    | PostgreSQL |
|   Node 1   |    |   Node 2   |   |   Node 3   |
+------------+    +------------+    +------------+
       |                 |                 |
       +-----------------+-----------------+
                         |
              +---------------------+
              |     etcd Cluster    |
              |  (3 or 5 nodes)     |
              +---------------------+

核心组件作用

1. etcd 的角色

  • 分布式配置存储:存储集群状态、成员信息
  • 领导者选举:协调哪个 PostgreSQL 节点是主节点
  • 分布式锁:确保同一时间只有一个主节点
  • 服务发现:客户端可以查询当前的主节点信息

2. PostgreSQL 集群

  • 一主多从:一个主节点(可读写),多个备节点(只读)
  • 流复制:数据从主节点实时同步到备节点
  • 自动故障转移:主节点故障时自动提升备节点为主节点

部署配置示例

1. etcd 集群配置

yaml 复制代码
# etcd 1 配置
name: etcd1
listen-client-urls: http://192.168.1.10:2379
advertise-client-urls: http://192.168.1.10:2379
initial-cluster: etcd1=http://192.168.1.10:2380,etcd2=http://192.168.1.11:2380,etcd3=http://192.168.1.12:2380
initial-cluster-token: pg-cluster
initial-cluster-state: new

2. Patroni 配置

yaml 复制代码
# postgresql1.yml
scope: my-pg-cluster
name: postgresql1

restapi:
  listen: 192.168.1.20:8008
  connect_address: 192.168.1.20:8008

etcd:
  hosts: ["192.168.1.10:2379", "192.168.1.11:2379", "192.168.1.12:2379"]

bootstrap:
  dcs:
    ttl: 30
    loop_wait: 10
    retry_timeout: 10
    maximum_lag_on_failover: 1048576
    postgresql:
      use_pg_rewind: true
      use_slots: true
      parameters:
        wal_level: replica
        hot_standby: "on"
        max_wal_senders: 10
        wal_keep_size: 1GB

postgresql:
  listen: 192.168.1.20:5432
  connect_address: 192.168.1.20:5432
  data_dir: /var/lib/postgresql/15/main
  bin_dir: /usr/lib/postgresql/15/bin
  pgpass: /tmp/pgpass

操作命令

1. 检查 etcd 集群状态

bash 复制代码
# 检查集群成员
etcdctl --endpoints=192.168.1.10:2379 member list

# 检查集群健康状态
etcdctl --endpoints=192.168.1.10:2379,192.168.1.11:2379,192.168.1.12:2379 endpoint health

2. 检查 PostgreSQL 集群状态

bash 复制代码
# 通过 Patroni API 检查
curl http://192.168.1.20:8008
curl http://192.168.1.21:8008
curl http://192.168.1.22:8008

# 或使用 patronictl
patronictl -c /etc/patroni.yml list

3. 手动故障转移

bash 复制代码
# 安全地切换主节点
patronictl -c /etc/patroni.yml switchover

# 重新加载配置
patronictl -c /etc/patroni.yml reload my-pg-cluster

优势特点

优点

  • 高可用性:自动故障转移,服务中断时间短
  • 数据一致性:基于流复制,数据同步可靠
  • 易于管理:Patroni 自动化运维操作
  • 可扩展性:轻松添加新的 PostgreSQL 节点

注意事项

  • etcd 集群规模:建议 3 或 5 个节点(奇数个)
  • 网络要求:节点间低延迟网络通信
  • 资源规划:etcd 需要足够的磁盘 I/O 和内存
  • 监控告警:需要监控两个集群的状态

故障排查

bash 复制代码
# 查看 Patroni 日志
journalctl -u patroni -f

# 检查 etcd 领导状态
etcdctl --endpoints=192.168.1.10:2379 endpoint status

# 验证 PostgreSQL 复制状态
psql -h 192.168.1.20 -c "SELECT * FROM pg_stat_replication;"

这种架构非常适合生产环境,能够提供企业级的高可用 PostgreSQL 服务。

相关推荐
Physicist in Geophy.17 小时前
新版ubuntu中sac安装问题(缺少libncurses5)
linux·运维·ubuntu
可乐大数据17 小时前
Docker安装(基于云服务器ECS实例 CentOS 7.9系统)
服务器·docker·centos
喝杯牛奶丶17 小时前
MySQL隔离级别:大厂为何偏爱RC?
java·数据库·mysql·面试
一 乐18 小时前
二手车销售|汽车销售|基于SprinBoot+vue的二手车交易系统(源码+数据库+文档)
java·前端·数据库·vue.js·后端·汽车
Databend18 小时前
BendSQL v0.30.3 Web UI 功能介绍
数据库
gAlAxy...18 小时前
Spring 从 0 → 1 保姆级笔记:IOC、DI、多配置、Bean 生命周期一次讲透
数据库·sqlserver
苦学编程的谢18 小时前
Redis_5_单线程模型
数据库·redis·缓存
Ryan ZX18 小时前
Ubuntu 升级OpenSSH10.2p1与OpenSSL3.5.4版本避坑实践
linux·运维·服务器·ubuntu
xuejianxinokok19 小时前
可能被忽略的 pgvector 各种坑
数据库·后端
qq_54702617919 小时前
微服务 - 网关统一鉴权
运维·网络·微服务