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

数据库是一个系统(应用)最重要的资产之一,所以我们的数据库将从以下几个数据库来进行介绍。
MySQL
PostgreSQL(本章节)
Redis
Etcd
前面我们介绍了PostgreSQL里面的两种主从复制模式,逻辑复制由于只有部分数据,所以并不能作为主从的高可用,所以我们今天的高可用还是基于使用基于WAL的主从复制。
一.手工切换主从
手工切换很好理解,就是把从节点变成主节点,让从节点变成可写的模式下就行,如果不做任何操作的从节点是只读的。
postgres=# create database abcddee;
ERROR: cannot execute CREATE DATABASE in a read-only transaction
postgres=# #默认未修改存储路基的情况下
#核心就是后面哪个文件
touch /var/lib/pgsql/14/data/promote#日志一般会记录下面这个
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 节点 执行:
# 安装 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 还需要安装下面的软件才可以。
yum -y install gcc python3-devel postgresql-devel2.2 配置 Patroni(主节点 188)
这里默认配置是没有超级密码,所以需要先在pg上配置超级管理员。
ALTER ROLE postgres WITH PASSWORD 'your_super_password';在主节点(192.168.31.188)创建 Patroni 配置文件 /etc/patroni/postgres.yml
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
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。
#切换到postgresql 用户执行
/usr/local/bin/patroni /etc/patroni/postgres.yml注意:这里需要使用postgres用户来启动,因为他会接管PostgreSQL的账号配置文件,如果使用root启动则配置文件的权限会变成root。
通过Patroni查看当前主从节点的状态,可以看到当前主从的状态,这个还维持我们预设的主从状态。

2.5 验证高可用
我这里把188节点进行直接关机,从patronictl查看到189从从节点变成了主节点。
[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就可以实现高可用。