安装主数据库

dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
dnf install -y postgresql16-server

修改数据库数据目录

vim /usr/lib/systemd/system/postgresql-16.service 修改如下
Environment=PGDATA=/var/lib/pgsql/16/data/ 改为自己的数据目录Environment=PGDATA=/pgdata/16/data/

创建数据库数据目录

useradd postgres
passwd postgres
mkidr /pgdata/16/data/
chown -R postgres.postgres /pgdata/16/data/
chmod 700 /pgdata/16/data -R

初始化并启动

/usr/pgsql-16/bin/postgresql-16-setup initdb
systemctl enable postgresql-16
systemctl start postgresql-16

创建同步用户

su - postgresql
psql
CREATE USER replicator WITH REPLICATION LOGIN ENCRYPTED PASSWORD 'replicator';

修改数据库配置文件/pgdata/16/data/postgresql.conf

# 监听所有网络接口
listen_addresses = '*'
# 端口,保持默认
port = 5432
max_connections = 10000
shared_buffers = 256MB
# 设置WAL级别为replica,这是开启复制的前提
wal_level = replica
# 最大WAL发送进程数,至少大于从库数量
max_wal_senders = 10
# 为防止从库断开后主库WAL被清理,可设置保留WAL大小,例如1GB
wal_keep_size = 1GB

修改数据库安全配置文件/pgdata/16/data/pg_hba.conf

修改 host   all   all     0.0.0.0/0       scram-sha-256 为
host    all             all             0.0.0.0/0            scram-sha-256
增加以下配置其中10.0.0.1是从库的ip
host    replication     replicator      10.0.0.1/32       md5

重启主数据库

systemctl restart postgresql-16

安装从数据库

dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
dnf install -y postgresql16-server

修改数据库数据目录

vim /usr/lib/systemd/system/postgresql-16.service 修改如下
Environment=PGDATA=/var/lib/pgsql/16/data/ 改为自己的数据目录Environment=PGDATA=/pgdata/16/data/

创建数据库数据目录

useradd postgres
passwd postgres
mkidr /pgdata/16/data/
chown -R postgres.postgres /pgdata/16/data/
chmod 700 /pgdata/16/data -R

在从库服务器执行同步命令,输入同步用户密码

sudo -u postgres pg_basebackup -h 10.0.0.3 -p 5432 -U repl_user -D /pgdata/16/data -Fp -Xs -P -v -R

启动从库

systemctl enable postgresql-16
systemctl start postgresql-16

查看同步状态

在主库上执行

SELECT application_name, state, sync_state, replay_lag FROM pg_stat_replication;

在从库上执行

SELECT pg_is_in_recovery();