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;

参数调整

posted @ 2026-05-18 13:55  数据库小白(专注)  阅读(129)  评论(0)    收藏  举报