PostgreSQL 单节点部署 + 原生流复制(Streaming Replication)完全指南
备注:这边的0.0.0.0/0 配置后是所有的终端都可以连接数据库,如果安全有要求的话,这里可以不配置0.0.0.0/0,可以配成内部指定网段,例如:172.16.0.0/16 .当程序对主库有操作时会产生wal日志,当主库第一次将wal 同步给备库后,需要等到备库回复主库已经收到第一次的wal后,主库才会发后面的wal日志。我这里是主备库都在同一台服务器上,所以我这边要把备库的配置文件的端口号改
PostgreSQL 单节点部署
Postgresql 安装其实在"Nacos + Postgresql 生产环境部署"这篇文章中有做过详解介绍,这里我把安装步骤也汇总到这篇文章中
Postgresql 安装包下载:
postgresql 版本:15.2
postgrsql 官方下载地址:https://ftp.postgresql.org/pub/source/
我这边用到的是版本15.2,使用版本根据自己的需要下载对应的版本即可
安装Postgresql 系统依赖包
yum install gcc -y readline readline-dev readline-devel zlib-devel bzip2
将postgresql-15.2.tar.bz2 上传至服务器/data /app/pats_opts 目录下并解压并编译安装
mkdir -p /data/app/pats_opts
cd /data/app/pats_opts
tar xjvf postgresql-15.2.tar.bz2
cd postgresql-15.2
./configure --prefix=/data/app/pats_opts/postgres
make world
make install-world
新增postgres 用户 ,并设置密码,此处密码也是postgres,此处密码根据实际情况而定
adduser postgres
passed posrgres #此处命令为给新增的postgres 用户配置密码
创建postgres 数据库数据目录
cd /data/app/pats_opts/postgres
mkdir data && chown -R postgers:postgres data
初始化postgres 数据库
su – postgres
/data/app/pats_opts/postgres/bin/initdb -D /data/app/pats_opts/postgres/data/

初始化成功后,截图最下面一行是给出提示使用最下面一行命令来启动postgres。
修改postgres 配置文件
#在postgres 用户下配置
cd /data/app/pats_opts/postgres/data
vi pg_hba.conf
新增一条 host all all 0.0.0.0/0 trust

备注:这边的0.0.0.0/0 配置后是所有的终端都可以连接数据库,如果安全有要求的话,这里可以不配置0.0.0.0/0,可以配成内部指定网段,例如:172.16.0.0/16 .
截图中的METHOD 配置的参数很多,我这里介绍下最常用的两个参数:trust、md5
trust:无条件允许连接,只要满足ip 数据库名、用户名匹配即可登录,不需要密码校验,常用户开发、测试环境
md5:MD5哈希秘钥认证。常用于生产环境
编辑postgreql.conf配置文件
vi postgresql.conf
listen_addresses = '0.0.0.0'
max_connections = 200 #这里配置的是最大连接数,根据实际情况配置即可
启停postgres
#启动psql
/data/app/pats_opts/postgres/bin/pg_ctl -D /data/app/pats_opts/postgres/data/ -l logfile start
#停止psql
/data/app/pats_opts/postgres/bin/pg_ctl -D /data/app/pats_opts/postgres/data/ -l logfile stop
到这里Postgresql 服务就已经安装好了
PostgreSQL原生流复制(Streaming Replication)完全指南
原生流复制原理
WAL:
write ahead log 即预写日志。
WAL 核心思想:Postgresql 所有修改(insert、update、delete、DDL)都会先写WAL日志,然后才写真正的数据文件。
WAL 核心功能:
数据库崩溃后如何恢复数据
主从复制时如何同步数据
基础架构图:
此图有AI提供

流复制类型:
同步复制:
当程序对主库有操作时会产生wal日志,当主库第一次将wal 同步给备库后,需要等到备库回复主库已经收到第一次的wal后,主库才会发后面的wal日志。主库需要等待备库确认已经接受wal日志后才会继续
异步复制:
当程序对主库有操作时会产生wal日志,主库会不停的将wal日志发送给备库。主库无需等待备库确认接受wal日志。
原生流详细配置
我这边的环境是在同一台服务器上按照前面的步骤安装了两台Postgres库
实例1:主库 postgres1 port:5432
实例2:备库 postgres2 port:5433

主库配置:
修改postgreql.conf
#上面安装postgres修改的配置不变,在增加配置wal相关的配置
wal_level = replica
#开启wal归档
archive_mode = on
#archive 文件夹需要再指定目录下新增
archive_command = 'test ! -f /data/app/pats_opts/postgres_cluster/postgres1/date/archive/%f && cp %p /data/app/pats_opts/postgres_cluster/postgres1/date/archive/%f '
max_wal_senders = 10
wal_keep_size = 1GB
hot_standby = on
修改pg_hba.conf
#在此配置文件的最下面增加一行
host replication replica 192.168.1.170/32 md5
#replication 为虚拟的数据库名,专门用户复制连接
#replica 为复制的用户名
#192.168.1.170 填写备库的ip
主备配置好了后,启动数据库 ,在库启动后,新增专门的复制用户
-bash-4.2$ ./psql -U postgres -p5432
psql (15.2)
Type "help" for help.
postgres=# CREATE USER replica WITH REPLICATION LOGIN ENCRYPTED PASSWORD '123456';
CREATE ROLE
postgres=#
备库配置:
先手动将备库停止掉
/data/app/pats_opts/postgres_cluster/postgres2/bin/pg_ctl -D /data/app/pats_opts/postgres_cluster/postgres2/date/ -l /data/app/pats_opts/postgres_cluster/postgres2/logfile stop
清空备库数据目录(此步骤很关键,及时是两个新搭建的空的主备库,也需要把备库的data下的文件都删了,重新从主库备份一份过来)
cd /data/app/pats_opts/postgres_cluster/postgres2/
rm -rf data/*
在备库上使用pg_baseback 命令执行基础备份
./pg_basebackup -h 192.168.1.170 -p 5432 -U replica -D /data/app/pats_opts/postgres_cluster/postgres2/date -P -R
#-h 主库ip地址
#-p 端口号
#-U 用户名
#-D 备库date路径
#-P 显示进度
#-R 自动生成standby 配置,这个参数加上后,会自动把主库的配置文件同步到备库上

我这里是主备库都在同一台服务器上,所以我这边要把备库的配置文件的端口号改成跟主备不一样,不然备库启动不成功。
到这里就全部配置好了,启动从库
验证主从状态
主库登录:
-bash-4.2$ cd /data/app/pats_opts/postgres_cluster/postgres1/bin/
-bash-4.2$ ./psql
psql (15.2)
Type "help" for help.
postgres=# SELECT * FROM pg_stat_replication;
pid | usesysid | usename | application_name | client_addr | client_hos
tname | client_port | backend_start | backend_xmin | state
| sent_lsn | write_lsn | flush_lsn | replay_lsn | write_lag | flush_lag
| replay_lag | sync_priority | sync_state | reply_time
--------+----------+---------+------------------+---------------+-----------
------+-------------+-------------------------------+--------------+--------
---+-----------+-----------+-----------+------------+-----------+-----------
+------------+---------------+------------+-------------------------------
129663 | 16387 | replica | walreceiver | 192.168.1.170 |
| 48690 | 2026-05-12 15:55:44.640924+08 | | streami
ng | 0/5000060 | 0/5000060 | 0/5000060 | 0/5000060 | |
| | 0 | async | 2026-05-12 15:56:44.800797+08
(1 row)
postgres=# SELECT state FROM pg_stat_replication ;
state
-----------
streaming
(1 row)
备库登录:
-bash-4.2$ cd /data/app/pats_opts/postgres_cluster/postgres2/date/bin
-bash-4.2$ ./psql -p 5433
psql (15.2)
Type "help" for help.
postgres=# SELECT pg_is_in_recovery();
pg_is_in_recovery
-------------------
t
(1 row)
主库state = streaming &从库SELECT pg_is_in_recovery 状态是t ,表示成功
同步测试:
在主库创建测试表,在测试库查看,看看表是否正常生成
#主库
./psql
postgres=# CREATE TABLE test001(id int);
CREATE TABLE
postgres=# INSERT INTO test001 VALUES (1);
INSERT 0 1
postgres=# INSERT INTO test001 VALUES (2);
INSERT 0 1
postgres=# INSERT INTO test001 VALUES (3);
#备库:
select * from test001 ;

到这里psotgresql 主备模式已经搭建完成了。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)