postgreSQL二进制部署标准流程
二进制部署标准流程
目录
前言
postgreSQL的部署方式有多种:
- 二进制方式
- rpm包方式
- 源码编译方式
下面按使用场景由简单到复杂,把 PostgreSQL 常见的 7 种部署方式一次性梳理清楚,并给出典型适用场景、优缺点及一句话“速用指引”,便于按需取舍。
| 部署方式 | 速用指引 | 适用场景 & 优缺点 |
|---|---|---|
| 1. 单节点包管理器安装 | Ubuntu: apt install postgresql;CentOS: dnf install postgresql-server && postgresql-setup --initdb |
开发机、小规模生产;最简单,但无高可用。 |
| 2. Docker 单容器 | docker run -d --name pg -e POSTGRES_PASSWORD=pass -p 5432:5432 postgres:15 |
本地/测试环境快速拉起;易丢失数据,需外挂卷。 |
| 3. Docker Compose 多容器 | 预先写好 docker-compose.yml,一键 docker compose up -d;官方镜像自动初始化,可挂载数据卷、网络隔离。 |
中小团队正式环境;编排简单、可纳入 GitOps。 |
| 4. 云 RDS / 托管服务 | AWS RDS for PostgreSQL、阿里云 RDS、华为云 RDS 等 | 免去运维,内置备份、监控、只读实例;成本略高。 |
| 5. 主从异步流复制 | 主节点:wal_level = replica,从节点:pg_basebackup -R 拉起,只读查询可分流 |
读写分离、高可用基础版;主节点单点仍在。 |
| 6. 同步流复制 + 自动故障转移(Patroni/etcd 或 repmgr) | 多节点 + 选主组件,实现秒级切换;常见 3 节点奇数部署 | 生产高可用;需要额外组件与运维经验。 |
| 7. 分布式/分片集群(Citus/PostgreSQL-XL) | 在原生 PostgreSQL 之上加代理/协调节点,实现水平分片 | 超大规模数据量或高并发;架构复杂,门槛最高。 |
补充说明
- 1.配置要点:无论哪种方式,都要在 postgresql.conf 调整 listen_addresses、max_connections、shared_buffers,在 pg_hba.conf 设置网络与认证策略。
- 2.备份恢复:托管云已提供自动备份;自建方案推荐 pg_dump 逻辑备份 + pgBackRest/WAL-G 连续归档。
- 3.迁移/升级:小版本可直接 apt upgrade;大版本使用 pg_upgrade 或逻辑 dump/restore。
- 4.监控:自建可装 pg_exporter + Prometheus;云托管直接对接云监控。
一句话选型
- “只是想跑起来” → 1 或 2
- “小团队上线” → 3 或 4
- “生产不能停” → 5 + 自动化脚本 → 进阶 6
- “海量数据/超高并发” → 7
二进制部署实例
一、统参数配置
-- 禁用防火墙
systemctl status firewalld.service
systemctl stop firewalld.service
systemctl disable firewalld.service
-- 关闭SELINUX
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
-- 系统资源限制配置
cat > /etc/sysctl.conf <<"EOF"
vm.swappiness=10
vm.zone_reclaim_mode=0
fs.aio-max-nr = 1048576
fs.file-max = 6815744
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048586
kernel.shmmax = 1288490188
kernel.shmall = 314572
kernel.shmmni = 4096
kernel.sem = 50100 64128000 50100 20480
EOF
sysctl -p
说明:
** SHMMAX、SHMALL、SHMMNI参数**
• SHMMAX是一个内核参数,用于定义一个Linux进程可以分配的单个共享内存段的最大大小。SHMMAX的值以字节为单位,设置太小会导致实例启动失败。
• SHMALL是另一个用于定义系统范围的共享内存页总页数的内核参数。
• SHMMNI定义了系统级别的共享内存段的最大数量,采用默认值4096即可。
·shmall:表示整个系统内可以为共享内存配置的共享内存页面数。如果一台机器上运行有多个数据库实例,需要把此值设置成大于各个数据库实例所需要的共享内存之和。简单的做法是设置成机器总内存的页面数。
·shmmax:表示单个共享内存段(Shared Memory Segment)可以创建的共享内存的最大值。通常设置成机器的总内存数就可以了。
shmall的单位是页面,而shmmax的单位是字节。
一台256GB的机器的配置如下:
kernel.shmmax = 274877906944
kernel.shmall = 67108864
-- 软连接和文件数限制
cat >> /etc/security/limits.conf <<"EOF"
* soft nofile 131072
* hard nofile 131072
* soft nproc 131072
* hard nproc 131072
* soft core unlimited
* hard core unlimited
* soft memlock 50000000
* hard memlock 50000000
EOF
echo "* - nproc unlimited" > /etc/security/limits.d/90-nproc.conf
echo "session required pam_limits.so" >> /etc/pam.d/login
--关闭THP
root用户下
在vi /etc/rc.local最后添加如下代码
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
chmod +x /etc/rc.d/rc.local
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
cat /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/defrag
--配置大页hugepage
计算大页数
计划给 PG 用 48 GB 共享内存(≈64 GB 的 3/4)
hugepage_kb=2048 # 2 MB
shared_mb=((48∗1024))nr=
((shared_mb*1024/hugepage_kb + 200)) # 多留 200 个给波动
echo "vm.nr_hugepages = $nr" >> /etc/sysctl.conf
sysctl -p
计划给 PostgreSQL 共享内存:32 GB
2 MB = 2048 KB
32 GB = 32 × 1024 × 1024 KB = 33 554 432 KB
所需大页数 = 33 554 432 ÷ 2048 = 16 384
vm.nr_hugepages = 16900
立刻生效(无需重启 OS)
sysctl -w vm.nr_hugepages=$nr
查看是否成功
grep HugePages_Total /proc/meminfo
调整系统 limit(postgres 用户要能 lock 内存)
cat >>/etc/security/limits.conf <<EOF
postgres soft memlock unlimited
postgres hard memlock unlimited
EOF
如使用 systemd,同步到 service 层
mkdir -p /etc/systemd/system/postgresql.service.d/
cat >/etc/systemd/system/postgresql.service.d/hugepage.conf <<EOF
[Service]
LimitMEMLOCK=infinity
EOF
systemctl daemon-reload
配置 PostgreSQL
vim $PGDATA/postgresql.conf
shared_buffers = 48GB # ≤ 之前预留的大页内存
huge_pages = on # on=强制;try=失败则退回到普通页
重启数据库
systemctl restart postgresql # 或 pg_ctl restart -D $PGDATA
验证
psql -c "SHOW huge_pages;" -- 应返回 on
grep -i huge /proc/meminfo -- HugePages_Rsvd ≈ 之前计算值
dmesg | grep -i huge -- 确认无 "mmap failed" 报错
二、数据库配置
-- 下载源码包
wget https://ftp.postgresql.org/pub/source/v14.2/postgresql-14.2.tar.gz --no-check-certificate
wget https://ftp.postgresql.org/pub/source/v13.3/postgresql-13.3.tar.gz
wget https://ftp.postgresql.org/pub/source/v12.7/postgresql-12.7.tar.gz
wget https://ftp.postgresql.org/pub/source/v11.12/postgresql-11.12.tar.gz
wget https://ftp.postgresql.org/pub/source/v10.17/postgresql-10.17.tar.gz
wget https://ftp.postgresql.org/pub/source/v9.6.22/postgresql-9.6.22.tar.gz
wget https://ftp.postgresql.org/pub/source/v9.4.26/postgresql-9.4.26.tar.gz
-- 一些依赖包
yum install -y cmake make gcc zlib zlib-devel gcc-c++ perl readline readline-devel \
python36 tcl openssl ncurses-devel openldap pam flex libicu-devel glibc-static libcurl-devel json-c-devel
-- 创建用户
groupadd postgres
useradd postgres -g postgres
echo "postgres" | passwd --stdin postgres
-- 创建目录
mkdir -p /data/postgresql/{pgdata,archive,scripts,backup,pg16,soft}
chown -R postgres:postgres /data/postgresql
chmod -R 775 /data/postgresql
-- 编译
su - pgsql
cd /postgresql/soft
tar zxvf postgresql-16.19.tar.gz
cd postgresql-16.19
./configure --prefix=/data/postgresql/pg16
make -j 16 && make install
# 编译完成,最后一行显示:All of PostgreSQL successfully made. Ready to install.
-- 如果你希望编译所有能编译的东西,包括文档(HTML和手册页)以及附加模块(contrib),这样键入:
make world -j 16 && make install-world
#最后一行显示:PostgreSQL, contrib, and documentation successfully made. Ready to install.
-- 源码安装postgresql时,而make时又没有make world,就会导致的pg最终没有类似pg_stat_statements的扩展功能
-- 安装contrib目录下的工具
contrib目录下的工具比较实用,一般都会安装上
cd /opt/postgresql-16.6/contrib
make install
创建软链接
ln -s /data/postgresql/pg16 /usr/local/postgresql-16
chown -R postgres:postgres /usr/local/postgresql-16
-- 配置环境变量
su - postgres
cat >> ~/.bash_profile <<"EOF"
export PGPORT=5432
export PGDATA=/data/postgresql/pgdata
export PGHOME=/data/postgresql/pg16
export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH
export PATH=$PGHOME/bin:$PATH:.
export PGHOST=$pgdata
export PGUSER=postgres
export pgdataBASE=postgres
EOF
source ~/.bash_profile
-- 初始化
su - postgres
/data/postgresql/pg16/bin/initdb -D /data/postgresql/pgdata -E UTF8 --locale=en_US.utf8 -U postgres
echo "postgres" > /home/postgres/pwfile
su - postgres -c "/data/postgresql/pg16/bin/initdb --pgdata=/data/postgresql/pgdata --waldir=/data/postgresql/archive --encoding=UTF8 --lc-collate=C --lc-ctype=C --allow-group-access --data-checksums --username=postgres --pwfile=/home/postgres/pwfile --wal-segsize=32"
在执行 initdb 初始化数据目录时,添加 --data-checksums 选项开启校验和:
--data-checksums \ # 启用数据页校验和
-- 修改参数
cat >> /data/postgresql/pgdata/postgresql.conf <<"EOF"
listen_addresses = '*'
port=5432
unix_socket_directories='/data/postgresql/pgdata'
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%a.log'
log_truncate_on_rotation = on
EOF
cat > /postgresql/pgdata/pg_hba.conf << EOF
# TYPE DATABASE USER ADDRESS METHOD
host all all 0.0.0.0/0 md5
EOF
cat > /data/postgresql/pgdata/pg_hba.conf << EOF
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
host all all 0.0.0.0/0 md5
# IPv4 local connections:
host all all 127.0.0.1/32 scram-sha-256
# IPv6 local connections:
host all all ::1/128 scram-sha-256
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all peer
host replication all 127.0.0.1/32 scram-sha-256
host replication all ::1/128 scram-sha-256
EOF
-- 启动
su - postgres
pg_ctl start -D /data/postgresql/pgdata -l /tmp/pg_log
pg_ctl status -D /data/postgresql/pgdata
pg_ctl stop -D /data/postgresql/pgdata
或者:
/data/postgresql/pg16/bin/pg_ctl -D /data/pgdata16 -l logfile start 2>&1 &
-- 查看端口
netstat -nlap |grep 54
-- 配置系统服务
cat > /etc/systemd/system/postgresql16.service <<"EOF"
[Unit]
Description=PostgreSQL database server
Documentation=man:postgres(1)
After=network.target
[Service]
Type=forking
User=postgres
Group=postgres
Environment=PGPORT=5432
Environment=PGDATA=/data/postgresql/pgdata
OOMScoreAdjust=-1000
ExecStart=/data/postgresql/pg16/bin/pg_ctl start -D ${PGDATA} -s -o "-p ${PGPORT}" -w -t 300
ExecStop=/data/postgresql/pg16/bin/pg_ctl stop -D ${PGDATA} -s -m fast
ExecReload=/data/postgresql/pg16/bin/pg_ctl reload -D ${PGDATA} -s
KillMode=mixed
KillSignal=SIGINT
TimeoutSec=0
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable postgresql16.service
systemctl start postgresql16.service
systemctl status postgresql16.service
安装之后的基础配置
密码修改
su - postgres
psql
\password postgres
or:
alter user postgres with password 'postgres';
安装插件
create extension pageinspect;
create extension pg_stat_statements;
select * from pg_extension ;
select * from pg_available_extensions order by name;

浙公网安备 33010602011771号