PostgreSQL 一主两从部署
一、准备工作
因是在内网环境部署,提前找有网的机器下载部署所需依赖包,将下载的源码包复制到所有服务器的/tmp/pg_offline目录
yumdownloader --resolve \ gcc \ gcc-c++ \ make \ glibc-devel \ glibc-headers \ kernel-headers \ binutils \ cpp \ readline-devel \ zlib-devel \ openssl-devel \ libicu-devel \ libxml2-devel \ libxslt-devel \ perl-ExtUtils-Embed \ python3-devel \ systemd-devel \ libselinux-devel \ policycoreutils-devel \ ossp-uuid-devel \ ossp-uuid
# 所有节点关闭SELinux,防火墙 setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config systemctl stop firewalld.service # 安装依赖包 rpm -ivh *.rpm --nodeps --force
二、PostgreSQL部署
2.1 环境配置
# 创建postgres用户和组
groupadd postgres
useradd -g postgres postgres
# 设置密码
passwd postgres
# 创建数据目录和日志目录
mkdir -p /data/app/pg/{data,logs,archive}
chmod 0700 /data/app/pg/{data,logs,archive}
2.2 安装
# 解压源码包
tar -xf postgresql-16.2.tar.gz
cd postgresql-16.2
# 配置编译选项
./configure \
--prefix=/usr/local/pgsql \
--with-pgport=5432 \
--with-perl \
--with-python \
--with-openssl \
--with-libxml \
--with-libxslt \
--with-icu \
--with-systemd \
--with-uuid=ossp # 包含uuid-ossp支持
# 编译并安装(-j参数根据CPU核心数调整)
make -j 4
make install
# 设置权限
chown -R postgres:postgres /usr/local/pgsql
chown -R postgres:postgres /data/app/pg
2.3 服务配置
# 添加环境变量
echo 'export PATH=$PATH:/usr/local/pgsql/bin' >> /etc/profile
echo 'export PGDATA=/data/app/pg/data' >> /etc/profile
source /etc/profile
# 切换到postgres用户初始化数据库
su - postgres
initdb -D /data/app/pg/data -E UTF8 --locale=en_US.UTF-8
exit

# 编辑服务文件
vi /usr/lib/systemd/system/postgresql.service
[Unit] Description=PostgreSQL 16 database server Documentation=https://www.postgresql.org/docs/16/static/ After=network.target [Service] Type=notify User=postgres Group=postgres Environment=PGDATA=/data/app/pg/data Environment=PGLOG=/data/app/pg/logs/postgresql.log ExecStart=/usr/local/pgsql/bin/postgres -D ${PGDATA} ExecReload=/bin/kill -HUP $MAINPID KillMode=mixed KillSignal=SIGINT TimeoutSec=0 [Install] WantedBy=multi-user.target
# 设置开机自启
systemctl daemon-reload
systemctl enable postgresql
# 编辑主配置文件
vi /data/app/pg/data/postgresql.conf
修改以下关键参数:
listen_addresses = '*'
port = 5432
max_connections = 100
wal_level = replica
max_wal_senders = 10
wal_keep_size = 16384
archive_mode = on
archive_command = 'cp %p /data/app/pg/archive/%f'
hot_standby = on
配置访问控制:
vim /data/app/pg/data/pg_hba.conf
添加以下内容:
# 允许从服务器复制
host replication replica 192.168.193.21/32 md5 # 从服务器1
host replication replica 192.168.193.27/32 md5 # 从服务器2
# 允许密码认证
host all all 0.0.0.0/0 md5

启动服务并创建复制用户:
# 启动服务
systemctl start postgresql
systemctl status postgresql
# 创建复制用户
su - postgres
psql
CREATE ROLE replica WITH REPLICATION LOGIN ENCRYPTED PASSWORD 'Hybridcloud2025';
\q
exit

2.4 从服务器部署
在两台从服务器上执行与主服务器相同的环境配置和安装步骤(2.1-2.3),但不需要初始化数据库,只需执行2.3步骤中:”添加环境变量,编辑服务文件,设置开机自启” 三个步骤即可
# 从主服务器同步数据
# 确保服务未启动
systemctl stop postgresql
# 切换到postgres用户
su - postgres
# 使用pg_basebackup同步主库数据
pg_basebackup -h 192.168.193.18 -U replica -D /data/app/pg/data -P -Xs
# 输入之前设置的replica用户密码
# 创建 standby.signal 文件
touch /data/app/pg/data/standby.signal
# 配置从库连接主库信息
vi /data/app/pg/data/postgresql.conf
# 添加以下配置,第二台从服务器使用 application_name=slave2
primary_conninfo = 'host=192.168.193.18 port=5432 user=replica password=Hybridcloud2025 application_name=slave1'
recovery_target_timeline = 'latest'
hot_standby = on
# 退出postgres用户
exit
# 启动服务
systemctl start postgresql
# 若启动失败报如下错误,PostgreSQL 要求数据目录权限必须是 0700(仅所有者可读写执行) 或 0750(所有者 + 组可读执行),当前目录权限不符合要求。
# 1. 确保目录归属 postgres 用户
chown -R postgres:postgres /data/app/pg/data
# 2. 严格设置为 PostgreSQL 要求的 0700 权限
chmod 0700 /data/app/pg/{data,logs,archive}

修改完成再次启动并查看状态
systemctl start postgresql
systemctl status postgresql
2.5 验证主从复制
# 检查主库复制状态
su - postgres
psql -c "SELECT client_addr, application_name, state FROM pg_stat_replication;"
成功配置后,会显示两个从服务器的连接信息,状态为streaming。

# 测试数据同步
# 在主服务器上创建测试数据
su - postgres
psql
CREATE DATABASE testdb;
\c testdb
CREATE TABLE test_table (id SERIAL PRIMARY KEY, info TEXT);
INSERT INTO test_table (info) VALUES ('Test replication from master');
\q

# 在从服务器上验证数据是否同步,如果能查询到测试数据,说明主从复制配置成功。
su - postgres
psql -c "\c testdb" -c "SELECT * FROM test_table;"

# 测试uuid-ossp扩展功能
# 在主服务器上
su - postgres
psql -d testdb
CREATE TABLE ceshi_uuid (id uuid PRIMARY KEY DEFAULT uuid_generate_v4(), info TEXT);
# 若遇到以下报错,是因为编译 PostgreSQL 时,没有将 uuid-ossp 扩展编译并安装到系统中

# 解决方案
仅安装 uuid-ossp 扩展
# 进入源码目录下的 uuid-ossp 扩展目录
cd /data/app/pg/postgresql-16.2/contrib/uuid-ossp
# 编译并安装
make
make install

# 安装完成后,重新连接数据库并执行:
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TABLE ceshi_uuid (id uuid PRIMARY KEY DEFAULT uuid_generate_v4(), info TEXT);
INSERT INTO ceshi_uuid (info) VALUES ('Test UUID extension');
\q

# 在从服务器上验证
su - postgres
psql -d testdb -c "SELECT * FROM ceshi_uuid;"

# 删除测试库testdb
su - postgres
psql
DROP DATABASE IF EXISTS testdb;

浙公网安备 33010602011771号