基于Patroni+etcd的PostgreSQL高可用集群部署与配置详解

1. 为什么你需要Patroni+etcd的PostgreSQL高可用方案?

如果你负责的线上业务数据库还在用单点PostgreSQL,每次半夜收到告警短信都得心惊胆战地爬起来处理,那这套方案就是为你准备的。我经历过好几次因为服务器硬件故障或者网络抖动,导致数据库服务中断,业务直接停摆的“惊魂时刻”。后来痛定思痛,决定把核心业务的数据库都升级成高可用架构。在对比了多种方案之后,Patroni+etcd的组合以其自动化程度高、运维简单、社区活跃的特点,成为了我的首选。

简单来说,Patroni 是一个专门为PostgreSQL设计的“集群大脑”和“自动运维机器人”。它本身不存储数据,而是负责管理一个或多个PostgreSQL实例的生命周期:谁当主库(Leader),谁当从库(Replica),主库挂了怎么办,新节点如何加入等等。而 etcd 则是一个高可用的分布式键值存储,充当了Patroni集群的“共识中心”和“配置中心”。所有集群成员的状态、配置、领导权信息都安全地存放在etcd里。Patroni通过监听etcd中的这些信息来协同工作,实现自动故障转移(Failover)。

这套方案好在哪里?首先,真正的自动化。主库故障后,从库提升为新主库的过程完全无需人工干预,通常在30秒内完成,业务感知到的只是一次短暂的重连。其次,配置即代码。整个集群的拓扑、PostgreSQL参数、复制配置都通过YAML文件定义,清晰可管理,也方便纳入版本控制。最后,对应用透明。配合一个简单的VIP(虚拟IP)或者负载均衡器,应用程序的连接字符串几乎不用改变,它总是连接到当前的主库。

想象一下,你的数据库集群像一支训练有素的足球队。etcd是裁判和记分牌,实时记录着场上每个队员(PostgreSQL节点)的位置和状态。Patroni则是教练,根据记分牌的信息,指挥队员跑位、换人。当队长(主库)受伤下场,教练会立刻根据规则和队员状态,指定一名新队长,并调整阵型,确保比赛(业务)继续进行。接下来,我就带你从零开始,组建这支“冠军球队”。

2. 部署前的环境规划与准备

兵马未动,粮草先行。搭建一个稳定的生产集群,前期规划比后期折腾重要十倍。我们先来把基础环境打理好。

2.1 集群架构与资源规划

我建议至少使用三个节点来构建这个集群。为什么是三个?这是分布式系统的一个黄金数字。对于etcd集群,三个节点可以在容忍一个节点故障(即“一票否决”)的同时,依然通过多数派原则达成共识,保证集群自身的高可用。如果只有两个节点,一个挂了,剩下的一个无法形成多数派(2/2的多数是2),集群就会僵住。用三个节点,即使坏了一个,剩下两个(2/3)依然能正常工作。

在我们的场景里,每个节点既运行etcd,也运行PostgreSQL和Patroni。这是一种紧凑的部署方式,节省资源,也简化了网络配置。当然,如果资源非常充足,你也可以将etcd集群和PostgreSQL集群分开部署,这样隔离性更好。

这是我的测试环境规划,你可以根据实际情况调整IP和主机名:

IP地址 主机名 角色说明
10.0.0.131 vm131 etcd节点01, PostgreSQL节点01 (Patroni1)
10.0.0.132 vm132 etcd节点02, PostgreSQL节点02 (Patroni2)
10.0.0.133 vm133 etcd节点03, PostgreSQL节点03 (Patroni3)
10.0.0.134 - 虚拟IP (VIP),由主库节点持有,供应用连接

硬件建议:每个节点至少2核CPU,4GB内存,50GB磁盘。生产环境请务必使用SSD磁盘,I/O性能对数据库和etcd都至关重要。网络方面,确保节点间网络延迟低(1ms以内)且稳定,跨机房部署需要特别小心。

2.2 基础系统配置(所有节点)

这些操作需要在三台机器上逐一执行。别嫌麻烦,基础打牢了,后面才省心。

首先,设置正确的主机名并配置 hosts 文件,让机器之间能通过名字互相找到。很多莫名其妙的网络问题都源于此。

# 在 vm131 上执行
sudo hostnamectl set-hostname vm131
# 在 vm132 上执行
sudo hostnamectl set-hostname vm132
# 在 vm133 上执行
sudo hostnamectl set-hostname vm133

然后,编辑 /etc/hosts 文件,在三台机器上内容保持一致:

sudo tee -a /etc/hosts << EOF
10.0.0.131 vm131
10.0.0.132 vm132
10.0.0.133 vm133
EOF

时钟同步是集群的命脉! 如果节点间时间差太大,etcd的租约机制、Patroni的健康检查都会出问题。生产环境强烈建议配置NTP服务(如Chrony或NTPd)。这里我们先确保时区正确,并做一次时间同步:

sudo timedatectl set-timezone Asia/Shanghai
sudo yum install -y chrony
sudo systemctl start chronyd
sudo systemctl enable chronyd
sudo chronyc sources -v  # 查看同步状态

为了方便实验,我们暂时关闭防火墙和SELinux。生产环境请务必根据安全规范配置精确的防火墙规则,而不是直接关闭。

# 临时关闭防火墙
sudo systemctl stop firewalld
sudo systemctl disable firewalld
# 临时关闭SELinux
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config

最后,创建一个postgres用户组和用户(如果安装PostgreSQL的RPM包,通常会自动创建)。我们检查并确保其存在:

id postgres
# 如果不存在,则创建
su
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值