首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >PostgreSQL-主从高可用(Patroni)

PostgreSQL-主从高可用(Patroni)

作者头像
运维小路
发布2026-01-26 12:33:32
发布2026-01-26 12:33:32
1590
举报
文章被收录于专栏:运维小路运维小路

作者介绍:简历上没有一个精通的运维工程师,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

数据库是一个系统(应用)最重要的资产之一,所以我们的数据库将从以下几个数据库来进行介绍。

MySQL

PostgreSQL(本章节)

MongoDB

Redis

Etcd

前面我们介绍了PostgreSQL里面的两种主从复制模式,逻辑复制由于只有部分数据,所以并不能作为主从的高可用,所以我们今天的高可用还是基于使用基于WAL的主从复制。

一.手工切换主从

手工切换很好理解,就是把从节点变成主节点,让从节点变成可写的模式下就行,如果不做任何操作的从节点是只读的。

代码语言:javascript
复制
postgres=# create database abcddee;
ERROR:  cannot execute CREATE DATABASE in a read-only transaction
postgres=# 
代码语言:javascript
复制
#默认未修改存储路基的情况下 
#核心就是后面哪个文件
touch /var/lib/pgsql/14/data/promote
代码语言:javascript
复制
#日志一般会记录下面这个
CST [869] LOG:  database system is ready to accept connections

注:这个操作是不可逆的,也就是成了主节点如果要变成从节点则需要从零开始的,删除文件无法修改状态。

二.自动切换主从

其实基于前面操作,我们也是可以通过脚本方式自动完成完成切换,但是今天我们还是介绍一种第三方软件来实现主从切换,类似MySQL的MHA,他就是Patroni。

Patroni 是一个用于自动化 PostgreSQL 高可用性的工具,它使用 Python 开发,能够管理 PostgreSQL 集群的故障转移、复制和配置。Patroni 通过与分布式配置存储(如 etcd、ZooKeeper、Consul 或 Kubernetes)集成,来维护集群的状态和领导者选举,我这里利用前期的ZooKeeper来作为分布式存储。

2.1 在主从节点安装 Patroni 及依赖

Patroni 需要依赖 ZK 客户端和 PostgreSQL 驱动,在 188 和 189 节点 执行:

代码语言:javascript
复制
# 安装 Python 及 pip
sudo yum install -y python3 python3-pip
# 安装 Patroni、ZK 客户端和 PostgreSQL 驱动
sudo CFLAGS="-std=c99" pip3 install patroni psycopg2-binary kazoo -i https://mirrors.aliyun.com/pypi/simple/

如果是和我一样使用centos7 还需要安装下面的软件才可以。

代码语言:javascript
复制
yum -y install gcc python3-devel postgresql-devel

2.2 配置 Patroni(主节点 188)

这里默认配置是没有超级密码,所以需要先在pg上配置超级管理员。

代码语言:javascript
复制
ALTER ROLE postgres WITH PASSWORD 'your_super_password';

在主节点(192.168.31.188)创建 Patroni 配置文件 /etc/patroni/postgres.yml

代码语言:javascript
复制
scope: pg_cluster  # 集群名称(主从必须一致)
namespace: /postgresql/  # ZK 中的命名空间
name: pg-master  # 本节点名称(唯一)
# ZooKeeper 配置(指向单机 ZK 地址)
zookeeper:
  hosts: 192.168.31.140:2181  # ZK 地址:端口
# PostgreSQL 核心配置
postgresql:
  name: postgres
  listen: 0.0.0.0:5432  # 监听所有地址
  connect_address: 192.168.31.188:5432  # 主节点 IP:端口
  data_dir: /var/lib/pgsql/14/data  # 数据目录(与原主从一致)
  bin_dir: /usr/pgsql-14/bin  # PostgreSQL 二进制文件路径
  pgpass: /tmp/pgpass  # 自动生成的密码文件
  authentication:
    replication:
      username: repluser  # 复制用户(与原主从配置一致)
      password: your_repl_password  # 复制用户密码
    superuser:
      username: postgres
      password: your_super_password  # postgres 密码
# 复制配置(物理复制)
replication:
  username: repluser
  password: your_repl_password
  primary_slot_name: patroni_repl_slot  # Patroni 管理的复制槽
# 健康检查与 API 配置
restapi:
  listen: 0.0.0.0:8008  # Patroni API 监听端口
  connect_address: 192.168.31.188:8008  # 主节点 API 地址
# 故障转移参数(可根据需求调整)
ttl: 30  # 租约超时时间(秒),超时未续约则认为节点故障
loop_wait: 10  # 状态检查间隔(秒)
retry_timeout: 10  # 重试超时时间(秒)
maximum_lag_on_failover: 1048576  # 故障转移时允许的最大延迟(字节)

2.3 配置 Patroni(从节点 189)

在从节点(192.168.31.189)创建 Patroni 配置文件 /etc/patroni/postgres.yml

代码语言:javascript
复制
scope: pg_cluster  # 集群名称(主从必须一致)
namespace: /postgresql/  # ZK 中的命名空间
name: pg-slave  # 本节点名称(唯一)
# ZooKeeper 配置(指向单机 ZK 地址)
zookeeper:
  hosts: 192.168.31.140:2181  # ZK 地址:端口
# PostgreSQL 核心配置
postgresql:
  name: postgres
  listen: 0.0.0.0:5432  # 监听所有地址
  connect_address: 192.168.31.189:5432  # 主节点 IP:端口
  data_dir: /var/lib/pgsql/14/data  # 数据目录(与原主从一致)
  bin_dir: /usr/pgsql-14/bin  # PostgreSQL 二进制文件路径
  pgpass: /tmp/pgpass  # 自动生成的密码文件
  authentication:
    replication:
      username: repluser  # 复制用户(与原主从配置一致)
      password: your_repl_password  # 复制用户密码
    superuser:
      username: postgres
      password: your_super_password  # postgres 密码
# 复制配置(物理复制)
replication:
  username: repluser
  password: your_repl_password
  primary_slot_name: patroni_repl_slot  # Patroni 管理的复制槽
# 健康检查与 API 配置
restapi:
  listen: 0.0.0.0:8008  # Patroni API 监听端口
  connect_address: 192.168.31.189:8008  # 主节点 API 地址
# 故障转移参数(可根据需求调整)
ttl: 30  # 租约超时时间(秒),超时未续约则认为节点故障
loop_wait: 10  # 状态检查间隔(秒)
retry_timeout: 10  # 重试超时时间(秒)
maximum_lag_on_failover: 1048576  # 故障转移时允许的最大延迟(字节)

2.4 启动Patroni(2台机器均需要执行)

我这里是前台启动,启动以后会打印很多日志,日志显示的就是谁是Leader,谁是following。

代码语言:javascript
复制
#切换到postgresql 用户执行
/usr/local/bin/patroni /etc/patroni/postgres.yml

注意:这里需要使用postgres用户来启动,因为他会接管PostgreSQL的账号配置文件,如果使用root启动则配置文件的权限会变成root。

通过Patroni查看当前主从节点的状态,可以看到当前主从的状态,这个还维持我们预设的主从状态。

2.5 验证高可用

我这里把188节点进行直接关机,从patronictl查看到189从从节点变成了主节点。

代码语言:javascript
复制
[root@localhost ~]# patronictl -c /etc/patroni/postgres.yml list
+ Cluster: pg_cluster (7566288737385616725) -----+----+-------------+-----+------------+-----+
| Member    | Host           | Role    | State   | TL | Receive LSN | Lag | Replay LSN | Lag |
+-----------+----------------+---------+---------+----+-------------+-----+------------+-----+
| pg-master | 192.168.31.188 | Replica | stopped |    |     unknown |     |    unknown |     |
| pg-slave  | 192.168.31.189 | Leader  | running |  3 |             |     |            |     |
+-----------+----------------+---------+---------+----+-------------+-----+------------+-----+
[root@localhost ~]# patronictl -c /etc/patroni/postgres.yml list
+ Cluster: pg_cluster (7566288737385616725) ---+----+-------------+-----+------------+-----+
| Member   | Host           | Role   | State   | TL | Receive LSN | Lag | Replay LSN | Lag |
+----------+----------------+--------+---------+----+-------------+-----+------------+-----+
| pg-slave | 192.168.31.189 | Leader | running |  3 |             |     |            |     |
+----------+----------------+--------+---------+----+-------------+-----+------------+-----+

通过这里我们就完成了主从切换,加上vip就可以实现高可用。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-11-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维小路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MongoDB
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档