概述:
pg_auto_failover是PostgreSQL的一个扩展,用于监控和管理Postgres集群,自动触发故障转移。pg_auto_failover相比于Patroni、repmgr、Stolon和pgPool-II配置更简单,运维更方便。下面介绍下pg_auto_failover几种常用的架构。
单备库架构
pg_auto_failover一个主库,一个备库的体系架构图:
pg_auto_failover为您的PostgreSQL服务实现业务连续性。pg_auto_failover使用具有自动故障转移功能的多个节点来实现单个PostgreSQL服务,并以保证该服务对其用户和应用程序可用性的方式自动化PostgreSQL维护操作。
为此,pg_auto_failover每个PostgreSQL服务使用三个节点:
- PostgreSQL主节点;
- PostgreSQL第二节点,使用同步热备;
- 一个既充当监控者又充当协调者的pg_auto_failover Monitor节点。
pg_auto_failover监视器实现一个状态机,并依赖于PostgreSQL内核来管理HA。例如:当检测到备用节点不可用时,或者报告其滞后的WAL超过定义的阈值时(默认为1个WAL文件或16MB,可在pg_auto_failover监视器上查看 pgautofailover.promote_wal_log_threshold GUC),这是监视器会从主节点的synchronous_standby_names参数中移除备节点。在备节点恢复正常运行之前,不允许进行故障转移和切换操作,以防止数据丢失,当备节点已恢复或WAL赶上到定义的阈值内时,同步热备将自动恢复。
两备库架构
pg_auto_failover一个主库,两个备库的体系架构图:
在如图所示的体系结构中,pg_auto_failover通过使用具有自动故障转移和数据冗余多个PostgreSQL实例来实现单个PostgreSQL服务,从而实现业务连续性和数据可用性。即使在生产系统中丢失任何Postgres节点,该体系结构仍在两个不同的节点上维护数据的两个副本。
当使用多个备用数据库时,pg_auto_failover可以实现不同的架构,这取决于生产设置所需的目标和权衡。
多备库架构之三备库节点
pg_auto_failover一个主库,三个备库的体系架构图:
通过设置上述三个参数,来构建生产环境不同的Postgres架构。
上图架构下,系统设置有两个参与复制仲裁的备用节点(number_sync_standbys = 1)。系统始终至少维护两个数据集副本:一个在主数据库上,另一个在节点B或节点D上。每当丢失其中一个节点时,我们都可以保证该数据集的两个副本数据集。
除此之外,我们还有备用服务器C,它已设置为不参与复制仲裁。在节点synchronous_standby_names列表中找不到节点C。 而且,节点C的设置方式永远不会成为故障转移的候选者(candidate-priority = 0)。
此架构适合以下应用场景:节点A,B和D部署在同一数据中心或可用性区域中,而节点C部署在另一个数据中心或可用性区域中。设置这三个节点以支持主要的生产流量并实现Postgres服务和数据集的高可用性。可能会在第一个数据中心丢失的情况下为业务连续性设置节点C,或者可能是为了在另一个应用程序域上部署。
`pg_auto_failover` 是一个开源的高可用性解决方案,主要用于 PostgreSQL 数据库的自动故障转移。它基于 `repmgr` 和 `patroni` 的概念,但设计得更加轻量级和易于使用,尤其适用于中小规模的 PostgreSQL 部署。
### 功能特点
1. **自动故障转移**:
`pg_auto_failover` 可以检测到主数据库(leader)的故障,并自动将其中一个备用数据库(follower)提升为主数据库,从而确保应用程序的连续可用性。
2. **监控和报警**:
它可以监控数据库的健康状况,并在发生故障时发送报警通知,帮助管理员快速响应。
3. **简单的配置**:
相比于 `patroni` 或其他更复杂的解决方案,`pg_auto_failover` 提供了较为简单的配置方式,减少了部署和维护的复杂度。
4. **兼容性**:
它与 PostgreSQL 的流复制功能紧密集成,适用于 PostgreSQL 10 及以上版本。
5. **可扩展性**:
支持多节点集群,可以轻松扩展到多个备用数据库,提高系统的冗余和可靠性。
### 架构
`pg_auto_failover` 通常包括以下几个组件:
- **Watcher**:负责监控主数据库和备用数据库的状态,检测故障并触发故障转移。
- **Monitor**:可选组件,用于集中存储集群状态信息,提高故障检测的准确性。
- **Sentinel**:替代 Monitor 的轻量级解决方案,用于较小的部署。
### 部署与使用
部署 `pg_auto_failover` 通常涉及以下步骤:
1. **安装必要的软件包**:在所有数据库服务器上安装 PostgreSQL 和 `pg_auto_failover` 相关的软件包。
2. **配置数据库**:在主数据库和备用数据库上配置流复制,并设置 `recovery.conf`(PostgreSQL 12 之前)或 `postgresql.auto.conf`(PostgreSQL 12 及以后)文件。
3. **配置 `pg_auto_failover`**:在每个数据库服务器上配置 `pg_autoctl.conf` 文件,指定集群信息、监控间隔、报警设置等。
4. **启动 `pg_auto_failover`**:启动 `pg_auto_failover` 服务,并确保所有组件正常运行。
pg_auto_failover 搭建
环境准备
centos7.9 三台主机
192.168.131.31 failover01
192.168.131.32 failover02
192.168.131.33 failover03
创建用户
useradd postgres
echo "postgres"|passwd --stdin postgres
配置免密登录
su - postgres
ssh-keygen
ssh-copy-id failover02
安装postgres
tar -xf postgresql-14.16.tar.gz
cd postgresql-14.16/
./configure --prefix=/opt/pg14/ --with-openssl --with-gssapi
make && make install
获取源代码
获取源代码:https://github.com/hapostgres/pg_auto_failover/tags
解压到pg源码contrib目录下,执行安装
scp pg_auto_failover-2.1.tar.gz failover01:/soft
chmod 777 pg_auto_failover-2.1.tar.gz
解压到pg源码contrib目录下,执行安装(三台主机执行)
make clean && make -j 4
配置好环境变量
ln -s /opt/pg14/ /opt/pgsql
cat ~/.bash_profile
export PGPORT=5432
export PGUSER=postgres
export PGHOME=/opt/pg14
export PGDATA=/opt/pgdata
export PATH=$PGHOME/bin:$PATH
cd /soft/postgresql-14.6/contrib/pg_auto_failover-2.1/
make
make install
出现如下界面表示安装完成
查看版本
pg_autoctl --version
编译好btree_gist,因为pg_auto_failover会依赖这个插件
cd /soft/postgresql-14.6/contrib/btree_gist
make && make install
配置Monitor
pg_autoctl create monitor --pgdata /opt/pgdata --pgport 5432 --hostname failover01 --auth trust --ssl-self-signed
配置服务
pg_autoctl create monitor --pgdata /opt/pgdata --pgport 5432 --hostname failover01 --auth trust --ssl-self-signed --run &
验证Monitor节点
启动Monitor后,也会启动一个管理的数据库.自动创建了一个pg_auto_failover 数据库,
和2个角色,还有一个pgautofailover的扩展.btree_gist扩展。
使用pg_autoctl show uri命令可以看到monitor的连接字符串,
等下在创建Primary Node和Secondary Node的时候需要用到
pg_autoctl show uri
创建PrimaryNode节点
先编译安装pg_stat_stements插件,pg_auto_failover依赖
cd /soft/postgresql-14.6/contrib/pg_stat_statements/
make && make install
在pg02主机上运行pg_autoctl create postgres 命令创建PrimaryNode
pg_autoctl create postgres --hostname failover02 --auth trust --ssl-self-signed --monitor 'postgres://autoctl_node@failover01:5432/pg_auto_failover?sslmode=require' --run &
在pg03主机上运行
pg_autoctl create postgres --hostname failover02 --auth trust --ssl-self-signed --monitor 'postgres://autoctl_node@failover01:5432/pg_auto_failover?sslmode=require' --run &
查看运行状态
主备切换
pg_autoctl perform switchover
在主节点failover03执行pg_autoctl stop, 模拟主库宕机
等待一会出现
failover03执行pg_autoctl run &拉起备库 failover02的reported state 为primary
使用systemd来进行自启动
cat pgautofailover.service
[Unit]
Description = pg_auto_failover
[Service]
WorkingDirectory = /tmp/pg_autoctl/opt/pgdata
Environment = 'PGDATA=/opt/pgdata'
User = postgres
ExecStart = /opt/pg14/bin/pg_autoctl run
Restart = always
StartLimitBurst = 0
[Install]
WantedBy = multi-user.target
mv pgautofailover.service /usr/lib/systemd/system/
systemctl daemon-reload
systemctl enable pgautofailover.service
su - postgres
pg_autoctl stop monitor
su - root
systemctl start pgautofailover.service
scp pgautofailover.service failover02:/usr/lib/systemd/system/
scp pgautofailover.service failover03:/usr/lib/systemd/system/
在failover02,failover03上root用户执行:
systemctl daemon-reload
systemctl enable pgautofailover.service
所有的操作全部做完之后,全部停止。然后reboot服务器重新看一遍是否自动成功带起来集群。
删除monitor
pg_autoctl drop monitor --destroy
删除node节点
pg_autoctl drop node node_2 --destroy
参考链接:
https://www.modb.pro/db/645863
https://www.modb.pro/db/41228
https://pg-auto-failover.readthedocs.io/en/main/ref/pg_autoctl_watch.html




