文章目录
一、节点说明
| IP | 主机名 |
|---|---|
| 192.168.10.102 | node02 |
| 192.168.10.103 | node03 |
二、软件下载
下载地址: PostgreSQL: File Browser
本文使用: postgresql-16.10.tar.gz

三、安装部署
1、前置准备(两台机器)
shell
# 安装基础依赖
yum install -y gcc gcc-c++ make libicu-devel readline-devel zlib-devel openssl-devel
# 关闭防火墙和SELinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
vim /etc/selinux/config
# 修改
SELINUX=disabled
# 创建postgres用户
useradd postgres
passwd postgres
# 配置postgres sudo权限
vim /etc/sudoers
# 在%wheel ALL=(ALL) ALL下面添加一行
postgres ALL=(ALL) NOPASSWD:ALL
# 创建安装目录和数据目录
mkdir -p /opt/module/pgsql16/pgsql
mkdir -p /opt/module/pgsql16/pgdata
# 修改安装包(上传的)目录权限,安装目录权限
chown -R postgres:postgres /opt/software/pgsql/
chown -R postgres:postgres /opt/module/pgsql16/
# 切换到postgres用户
su - postgres
2、解压并编译
shell
# 此项两台虚拟机均需操作
# 两台服务器上分别执行以下步骤进行编译安装。
tar -zxvf postgresql-16.10.tar.gz
cd postgresql-16.10
# 配置编译选项 --prefix 指定安装目录
./configure --prefix=/opt/module/pgsql16/pgsql
# 编译
make && make install
cd contrib
make && make install
# 安装成功后,主要文件会出现在 /opt/module/pgsql16/pgsql 目录下
# 编辑 postgres 用户环境变量
vi ~/.bash_profile
export PGHOME=/opt/module/pgsql16/pgsql
export PGDATA=/opt/module/pgsql16/pgdata
export PATH=$PATH:$PGHOME/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PGHOME/lib
# 重新加载环境变量
source ~/.bash_profile
# 配置系统环境变量
vim /etc/profile.d/my_env.sh
export PGHOME=/opt/module/pgsql16/pgsql
export PGDATA=/opt/module/pgsql16/pgdata
export PATH=$PATH:$PGHOME/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PGHOME/lib
# 重新加载环境变量
source /etc/profile.d/my_env.sh
3、初始化与配置主库(Master)
(1)初始化数据库
shell
# 初始化主库,仅主库
initdb -D $PGDATA -E UTF8 --locale=en_US.utf8
(2)conf配置
配置postgresql.conf
shell
# 配置postgresql.conf
cp postgresql.conf postgresql.conf.bak
vim postgresql.conf
# 修改以下内容
listen_addresses = '0.0.0.0'
port = 5432
max_connections = 2000
shared_buffers = 2048MB
dynamic_shared_memory_type = posix
wal_level = replica
full_page_writes = on
wal_log_hints = on
max_wal_size = 1GB
min_wal_size = 256MB
archive_mode = on
archive_command = 'test ! -f /opt/module/pgsql16/pgdata/pg_archive/%f && cp %p /opt/module/pgsql16/pgdata/pg_archive/%f'
restore_command = 'cp /opt/module/pgsql16/pgdata/pg_archive/%f %p'
archive_cleanup_command = 'pg_archive cleanup /opt/module/pgsql16/pgdata/pg_archive %r'
max_wal_senders = 10
wal_keep_size = 320
hot_standby = on
logging_collector = on
log_directory = '/opt/module/pgsql16/pgdata/logs'
log_filename = 'postgresql-%Y-%m-%d.log'
log_rotation_age = 30d
log_connections = on
log_disconnections = on
log_timezone = 'PRC'
datestyle = 'iso, mdy'
timezone = 'PRC'
lc_messages = 'en_US.utf8'
lc_monetary = 'en_US.utf8'
lc_numeric = 'en_US.utf8'
lc_time = 'en_US.utf8'
default_text_search_config = 'pg_catalog.english'
配置从库IP段
bash
# 配置IP段
vi $PGDATA/pg_hba.conf
# 添加从库IP段
# 这允许 replicator 用户进行流复制连接,并采用 scram-sha-256 加密认证。
host replication replicator 192.168.10.102/32 scram-sha-256
host replication replicator 192.168.10.103/32 scram-sha-256
# 用于远程连接
host all all 0.0.0.0/0 scram-sha-256
(3)启动主库并创建复制用户
SQL
# 启动数据库
pg_ctl -D $PGDATA -l $PGHOME/logfile start
# 登录数据库
psql
# 先修改postgres用户密码
ALTER USER postgres WITH PASSWORD 'postgres';
# 创建主从复制用户
CREATE USER replicator WITH REPLICATION LOGIN PASSWORD 'replicator';
4、配置从库(Slave)
shell
# 从库同步主库配置,在此之前从库除了编译安装,并没有其他操作,没有初始化,也没有启动
pg_basebackup -h 192.168.10.102 -p 5432 -U replicator -D $PGDATA -Fp -Xs -P -R
-h:主库IP地址。
-U:复制用户 replicator,执行时会提示输入密码。
-D:目标数据目录。
-Fp:以普通文件格式备份。
-Xs:在备份开始后启动流式传输WAL日志。
-P:显示进度。
-R:关键参数,自动在从库 $PGDATA 目录下生成 standby.signal 文件(声明此实例为备库),并更新 postgresql.auto.conf 文件,写入连接主库的信息。
# 通常 -R 参数已自动完成配置。可以检查并确认 $PGDATA/postgresql.auto.conf 文件内容类似如下(主从同步配置信息):
primary_conninfo = 'user=replicator password=replicator channel_binding=disable host=192.168.10.102 port=5432 sslmode=disable sslcompression=0 sslcertmode=disable sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=postgres gssdelegation=0 target_session_attrs=any load_balance_hosts=disable'
# 修改从库pgdata权限
chmod -R 750 /opt/module/pgsql16/pgdata/
# 启动从库
pg_ctl -D $PGDATA -l $PGHOME/logfile start
四、测试
1、在主库上查询复制状态
sql
SELECT application_name, client_addr, state, sync_state, sync_priority FROM pg_stat_replication;

2、在从库上验证数据同步
sql
# 主库操作
CREATE TABLE test_repl (id int, name text);
INSERT INTO test_repl VALUES (1, 'Hello from Master');
# 从库查询
SELECT * FROM test_repl;
# 此外,从库是只读状态,进行增删改会报错
INSERT INTO test_repl VALUES (2, 'Hello from Slave');
五、高可用集群安装
有需求的小伙伴可以参考本人下篇文章:
Linux软件安装 ------ PostgreSQL高可用集群安装(postgreSQL + repmgr主从复制 + keepalived故障转移)