首页 TG账号购买平台内容详情

技术分享 | 使用pg_auto_failover部署PostgreSQL高可用环境

2026-04-03 3 纸飞机账号购买

一、PostgreSQL高可用基础1.1.流复制的简介

流复制的原理是,备库会持续地从主库把相应的数据给同步过来,并且在备库那儿去apply每一个WAL record,而这里面的流复制,其所作的每次传输的单位是WAL日志的record。

物理流复制的特点:

1.2.流复制的模式

1.2.1.异步流

性能比较良好的异步流,Standby之上的数据相较于主库数据处于落后状态。要是运用Hot Standby来进行读写分离,那么就会出现数据一致性方面的问题。在极端情形下,主库一旦发生宕机,备库会被激活成为主库,部分WAL未发送至备库,这有可能导致数据丢失。

1.2.2.同步流

同步流,其目标乃是确保数据全然一致,然而可用性偏向较差,在数据写入Standby数据之后,事务的commit方才返回,故而当Standby库出现问题之际,会致使主库被Hang住,且常常会受到网络波动的影响。

1.2.3.quorum

quorum:一种基于规定数量的同步模式,在此模式下,事务提交时,将会等待后备节点中的任意规定数量的节点返回回复信息,之后还会认为同步已经完成。

二、高可用架构-pg_auto_failover

pg_auto_failover属于PostgreSQL的一个扩展,它还是一项服务,其作用在于监控Postgres集群,并且对该集群进行自动故障转移的管理。

针对简单性以及正确性它予以了优化,并且支持Postgres 10以及更高版本,pg_auto_failover对多种Postgres架构都予以支持,为您的Postgres服务达成安全的自动故障转移。

架构类型主要存在三种情况,一种是单备节点架构,一种是双备节点架构,还有一种是具备三个备节点以及一个异步节点所构成的多备架构。

基础组成部分包含主节点,备节点,状态节点(状态机)。状态机是pg_auto_failover的核心机制,它知晓各个节点当下的状态。首先各个节点的守护进程会向状态机发送事件,状态机依据发送过来的事件信息,给每个节点分配当前状态以及目标状态。节点的当前状态是其功能的有力保障,而目标状态用以告知我们将要尝试的转换状态。

2.1.单备节点架构

pg_auto_failover针对每个PostgreSOL服务,运用的是三个节点。

处于standby状态的节点,一旦被检测出不可用,或者其lag延迟高于所规定的阈值,也就是promote\_wal log\_threshold时,Monitor会于主节点的synchronous\_standby\_names设置里,将这个不可用的节点移除;在standby节点恢复至正常监控状态前,failover以及switchover操作是不被允许执行的,以此来避免数据丢失;当standby节点已经恢复,或者WAL赶上且达到定义的阈值范围内时,同步热备会自动恢复。这种经过特别优化的两节点是可以满足业务连续性的。

2.2.双备节点架构

这是pg_auto_failover具体的体系架构相关图示,其中存在一个主库,还有两个备库。

于如图所示的体系架构当中,pg_auto_failover是运用包含自动故障转移以及数据冗余的多个PostgreSQL实例,以此达成单个PostgreSQL服务,进而实现业务连续性与数据可用性的。哪怕是在生产系统里丢失了任何一个Postgres节点,此体系架构依旧会在两个不一样的节点上对数据的两个副本进行维护。

当运用多个备用数据库之际,pg\_auto\_failover能够达成各异的架构,这是依据生产设置所需要的目标以及权衡来决定的。

2.3.三备节点架构

反映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,又或者,是为了在另一个应用程序域上去展开部署。

三、3.1版本用于pg_auto_failover的下载地址,是下载地址。

软件下载地址: https://github.com/citusdata/pg\_auto\_failover/releases

3.2.帮助文档下载地址

帮助文档下载地址:

https://pg-auto-failover.readthedocs.io/en/master/intro.html

四、双备节点架构部署

下面将部署双备节点架构。

4.1.架构介绍

本章节会进行双备节点架构的部署,其中,db1、db2、db3这三个节点呈现一主两从的状态,db4则是作为monitor监控节点存在。

软件的版本是,PostgreSQL13.4,以及pg_auto_failover - 1.6.2。

操作系统版本为:centos 7.6 64bit

4.2.关闭防火墙

在4个节点都执行,su – root

systemctl status firewalld.service
systemctl stop firewalld.service
systemctl disable firewalld.service

4.3.关闭selinux

在4个节点都执行,su – root

sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

4.4.安装需要的rpm包

在4个节点都执行,su – root

yum install -y readline readline-devel zlib zlib-devel gettext gettext-devel openssl openssl-devel pam pam-devel libxml2 libxml2-devel libxslt libxslt-devel perl perl-devel tcl-devel uuid-devel gcc gcc-c++ make flex bison perl-ExtUtils

4.5.配置/etc/hosts

在4个节点都执行,su – root

vi /etc/hosts,添加:

192.168.0.31 db1
192.168.0.32 db2
192.168.0.33 db3
192.168.0.34 db4

4.6.配置ssh

在4个节点都执行,su - postgres

$,使用ssh - keygen,以rsa ,在每个节点上执行,不输入任何信息,持续一直敲击回车键。

$,使用ssh-copy-id,以-i参数指定.ssh的id_rsa.pub,连接postgres用户到db1,此项操作需在每个节点执行 ,先敲yes,接着输入密码,密码是********。

以安全外壳协议复制认证身分识别资讯,将指定的身分识别档案中的内容,传送到指定的使用者帐户在主机位于资料库二号的位址上,在每一个节点都要执行此操作,首先要敲入同意确认,接着要输入密码,该密码为一连串星号所代表的字符。

在每个节点上,执行这样的操作,即使用“ssh - copy - id”工具,把带有“ - i”参数指定的“ .ssh/id_rsa.pub”文件内容,通过该工具复制到“postgres@db3”这个目标地址,操作时要先敲“yes”,之后输入密码,而密码是“********”。

执行“$ ssh-copy-id -i .ssh/id\_rsa.pub postgres@db4”,需在每个节点进行操作,操作时要先敲“yes”,再输入密码,密码是“********”。

验证:

通过ssh连接db1执行date命令,通过ssh连接db2执行date命令,通过ssh连接db3执行date命令,通过ssh连接db4执行date命令。

不输人密码是正常的,要输入密码配置异常,要重新配置。

4.7.设置.bash\_profile

在4个节点都执行,su - postgres

vi ~/.bash\_profile,添加:

export PGPORT=1304
export PG_HOME=/opt/pg1304
export PATH=$PG_HOME/bin:$PATH
export PGDATA=/opt/pgdata1304
export LD_LIBRARY_PATH=$PG_HOME/lib
export LANG=en_US.utf8

执行如下命令,使得环境变量生效

source ~/.bash_profile

4.8.安装数据库软件

在4个节点都执行,su – root

groupadd dba -g 1000
useradd postgres -g 1000 -u 1000
passwd postgres 输入密码 ********
cd /opt/soft/pg13
tar -xzf postgresql-13.4.tar.gz
chown -R postgres:dba postgresql-13.4
mkdir /opt/pg1304 /opt/pgdata1304 /opt/backup
chown -R postgres:dba /opt/pg1304 /opt/pgdata1304 /opt/backup
chmod 755 /opt/pg1304
chmod 700 /opt/pgdata1304
chmod 777 /opt

在4个节点都执行,su - postgres

cd /opt/soft/pg13/postgresql-13.4
./configure --prefix=/opt/pg1304 --with-openssl --with-includes=/usr/include/openssl
gmake world && gmake install-world

4.9.初始化数据库

4.9.1.初始化数据库

于db1、db4实施数据库初始化操作,db1充当主库角色,db2与db3无需进行初始化动作,靠pg_autoctl create postgres来实现此创建效果。

db4是monitor节点。

在db1、db4节点执行,su - postgres

mkdir -p /home/postgres/pgwal
echo "********" > /home/postgres/pwfile
initdb --pgdata=/opt/pgdata1304 --waldir=/home/postgres/pgwal --encoding=UTF8 --lc-collate=C --lc-ctype=C --allow-group-access --data-checksums --username=postgres --pwfile=/home/postgres/pwfile --wal-segsize=32

4.9.2.编辑postgresql.conf

在db1、db4节点执行,su - postgres

echo "listen_addresses = '*'" >> $PGDATA/postgresql.conf
echo "password_encryption = 'scram-sha-256'" >> $PGDATA/postgresql.conf
echo "port = 1304" >> $PGDATA/postgresql.conf

4.9.3.编辑pg\_hba.conf

在db1、db4节点执行,su - postgres

编辑 $PGDATA/pg\_hba.conf,添加

echo "host all all 192.168.0.0/24 trust" >>$PGDATA/pg_hba.conf

4.9.4.启动实例

在db1、db4节点执行,su - postgres

启动实例

nohup pg_ctl -D /opt/pgdata1304 -l /opt/pgdata1304/pg.log start &

4.10.pg\_auto\_failover插件安装

在4个节点都执行,su - postgres

cd /opt/soft/pg13
tar -zxvf pg_auto_failover-1.6.2.tar.gz
cd pg_auto_failover-1.6.2
make
make install

4.11. db4安装pg\_monitor

su - postgres

启动Monitor

pg_autoctl create monitor --pgdata=/opt/pgdata1304 --pgport 1304 --hostname db4 --auth trust --ssl-self-signed

配置Monitor

pg_autoctl create monitor --pgdata=/opt/pgdata1304 --pgport 1304 --hostname db4 --auth trust --ssl-self-signed --run &

验证Monitor节点

在启动Monitor然后也会启动一个处于被管理状态的数据库之后,自动创建了一个名为pg_auto_failover的数据库,以及两个存在相应设定拥有一定权限的角色,除此之外还有一个名为pgautofailover的扩展,并且还存在一个btree_gist扩展。

要知道,运用pg_autoctl show uri命令之时,能够见到一个monitor的连接字符串,而此连接字符串,在紧接着创建Primary Node以及Secondary Node之际,是会用到的,这一点务必清晰把握,标点符号。

4.12. db1安装primary

su - postgres
pg_autoctl create postgres --hostname db1 --auth trust --ssl-self-signed --monitor 'postgres://autoctl_node@db4:1304/pg_auto_failover?sslmode=require' --run &

4.13. db2安装secondary

su - postgres
pg_autoctl create postgres --hostname db1 --auth trust --ssl-self-signed --monitor 'postgres://autoctl_node@db4:1304/pg_auto_failover?sslmode=require' --run &

4.14. db3安装secondary

su - postgres
pg_autoctl create postgres --hostname db3 --auth trust --ssl-self-signed --monitor 'postgres://autoctl_node@db4:1304/pg_auto_failover?sslmode=require' --run &

4.15. 查看状态

墨天轮,于乐知乐享的数据库技术社区开启蓄势启程之旅,向着全面升级迈进,进而提供多类型数据库管理服务。其数据库管理服务,意在为用户搭建起可信赖且能托付的数据库环境,同时为数据库厂商给予中立的生态支撑。

用于提供墨天轮数据库服务的官方网站地址是,https://www.modb.pro/service。

相关标签: # 技术分享 # PostgreSQL高可用 # pg_auto_failover # 流复制 # 双备节点架构