简介
本文介绍如何搭建 Postgres 主从集群,操作系统为 CentOS7,数据库版本是 postgresql-15
官网地址:https://www.postgresql.org/
安装
参考官方提供的下面这几条命令进行安装

命令如下
shell
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo yum install -y postgresql15-server
sudo /usr/pgsql-15/bin/postgresql-15-setup initdb
sudo systemctl enable postgresql-15
sudo systemctl start postgresql-15
为防止网络原因,rpm 文件最好是浏览器下载下来,传到服务器上离线安装

若执行第二步 sudo yum install -y postgresql15-server 出现下面这些报错

敲下面这两行命令解决
shell
yum-config-manager --disable pgdg12
yum-config-manager --disable pgdg13
安装过程如下

连接测试

连接相关参考下面这篇博客,需要进行一些设置,这里不再赘述
搭建
如下,在这两台服务器上各自搭建了 Postgres 数据库,账号均为:postgres/123456
关于如何设置账号,参考下面这篇博客

(1)主从库设置
postgres 数据库主要的配置文件是以下两个
-
postgresql.conf:配置文件;
-
pg_hba.conf:客户端访问权限控制文件;
搭建主从,postgresql.conf 需进行以下配置
java
listen_addresses = '*'
wal_level = replica
max_wal_senders = 10
wal_keep_size = 1GB
max_replication_slots = 10
hot_standby = on
这些配置在初始配置文件中都有,有的被注释了,打开即可

另外一个配置文件,pg_hba.conf 配置如下,末尾需开放主从复制的连接权限
(严格来的话,这里需指定对应网段,尽可能缩小连接访问范围)

设置完都需要重启 Postgres 数据库
(2)主库设置
以 192.168.101.16 为主库,在服务器上敲下面的命令进行配置
shell
su - postgres
psql
-- 创建复制用户,密码 Rep@123456
CREATE USER repuser WITH REPLICATION PASSWORD 'Rep@123456';
-- 创建物理复制槽,防止主库wal日志清理导致从库断连
SELECT pg_create_physical_replication_slot('slot_slave_18');
-- 查看确认创建成功
SELECT slot_name,active FROM pg_replication_slots;
\q
也可以直接在连接工具(Datagrip)中直接敲 SQL 语句

(3)从库配置
敲下面的命令
shell
systemctl stop postgresql-15
# 备份原有数据(防止出错回滚)
mv /var/lib/pgsql/15/data /var/lib/pgsql/15/data_bak
# 新建空目录
mkdir /var/lib/pgsql/15/data
chown postgres:postgres /var/lib/pgsql/15/data
chmod 700 /var/lib/pgsql/15/data
切换 Postgres 用户,敲下面的命令设置主库
shell
su - postgres
pg_basebackup -h 192.168.101.16 -p 5432 -U repuser -D /var/lib/pgsql/15/data -Fp -Xs -P -R
如下

切回 root 用户,重启 Postgres 数据库
shell
systemctl start postgresql-15
systemctl enable postgresql-15
验证
以上就搭建完成了,可敲下面的命令验证
(1)主库验证
shell
su - postgres
psql
SELECT pid,usename,application_name,state,write_lag FROM pg_stat_replication;
或在连接工具中敲 SQL 语句
sql
SELECT pid,usename,application_name,state,write_lag FROM pg_stat_replication;
如下,可见主从复制的进程记录,表示主从复制在进行中

(2)从库验证
敲下面的命令
shell
su - postgres
psql
-- 返回true代表是备库
SELECT pg_is_in_recovery();
-- 查看wal接收&回放进度
SELECT pg_last_wal_receive_lsn(),pg_last_wal_replay_lsn();
或者在连接工具中敲下面的 SQL
sql
-- 返回true代表是备库
SELECT pg_is_in_recovery();
-- 查看wal接收&回放进度
SELECT pg_last_wal_receive_lsn(),pg_last_wal_replay_lsn();
如下

使用
在主库中,创建一个数据库表,插入一条记录
sql
CREATE TABLE test_sync(id int);
INSERT INTO test_sync VALUES(1);
如下

通过工具,直接看从库,数据库表和记录都同步过来了

主库新增记录,从库实时同步,非常 Nice
