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

image

# 编辑服务文件

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

image

启动服务并创建复制用户:

# 启动服务

systemctl start postgresql

systemctl status postgresql

# 创建复制用户

su - postgres

psql

CREATE ROLE replica WITH REPLICATION LOGIN ENCRYPTED PASSWORD 'Hybridcloud2025';

\q

exit

image

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}

image

修改完成再次启动并查看状态

systemctl start postgresql

systemctl status postgresql

2.5 验证主从复制

# 检查主库复制状态

su - postgres

psql -c "SELECT client_addr, application_name, state FROM pg_stat_replication;"

成功配置后,会显示两个从服务器的连接信息,状态为streaming

image

# 测试数据同步

# 在主服务器上创建测试数据

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

image

# 在从服务器上验证数据是否同步,如果能查询到测试数据,说明主从复制配置成功。

su - postgres

psql -c "\c testdb" -c "SELECT * FROM test_table;"

image

# 测试uuid-ossp扩展功能

# 在主服务器上

su - postgres

psql -d testdb

CREATE TABLE ceshi_uuid (id uuid PRIMARY KEY DEFAULT uuid_generate_v4(), info TEXT);

# 若遇到以下报错,是因为编译 PostgreSQL 时,没有将 uuid-ossp 扩展编译并安装到系统中

image

# 解决方案

仅安装 uuid-ossp 扩展

# 进入源码目录下的 uuid-ossp 扩展目录

cd /data/app/pg/postgresql-16.2/contrib/uuid-ossp

# 编译并安装

make

make install

image

# 安装完成后,重新连接数据库并执行:

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

image

# 在从服务器上验证

su - postgres

psql -d testdb -c "SELECT * FROM ceshi_uuid;"

image

# 删除测试库testdb

su - postgres

psql

DROP DATABASE IF EXISTS testdb;

 

posted @ 2026-03-24 11:05  sxFu9528  阅读(2)  评论(0)    收藏  举报