更新时间:2025 年 6 月
版本:pgbackrest 2.55.1
参考 - 1:pgBackRest User Guide - RHEL
参考 - 2:pgBackRest User Guide - RHEL
准备
主机准备
主机名 | 操作系统 | 架构 | IP | 安装软件 |
---|---|---|---|---|
pgbackrest-01.db.local | AlmaLinux 9.6 | x86_64 | 192.168.111.195 | pgbackrest 2.55.x |
时间设置
设置时区
timedatectl set-timezone Asia/Shanghai
设置主机名
hostnamectl set-hostname pgbackrest-01.db.local
防火墙及 SELinux
# 关闭 SELinux
setenforce 0 && sed -i 's/=enforcing/=disabled/g' /etc/sysconfig/selinux && sed -i 's/=enforcing/=disabled/g' /etc/selinux/config
# 此处直接关闭防火墙
systemctl disable --now firewalld
系统参数
资源限制
PAM 模块
PAM 模块 pam_limits 对用户会话中可以获得的系统资源设置了限制,可以使用 ulimit 命令进行修改,或者直接将修改的值写入配置文件 /etc/security/limits.conf
和 /etc/security/limits.d/*.conf
# 备份原有的设置
find /etc/security/limits.d -type f -name *.conf -exec mv {} {}.bak.`date +"%Y%m%d"` \;
# 设置限制
cat > /etc/security/limits.d/sys.conf <<EOF
* - core unlimited
* - nproc unlimited
* - nofile 1048576
* - memlock unlimited
* - msgqueue unlimited
* - stack unlimited
EOF
systemd
systemd 有独立于 PAM 的资源限制(setrlimit
),若服务通过 systemd 启动也需要设置
###### 修改用户级默认配置 ######
# 备份原有的文件或创建目录
[ -f /etc/systemd/user.conf.d/ ] && find /etc/systemd/user.conf.d/ -type f -name *.conf -exec mv {} {}.bak.`date +"%Y%m%d"` \; || mkdir -p /etc/systemd/user.conf.d
# 修改配置
cat > /etc/systemd/user.conf.d/sys.conf << EOF
[Manager]
DefaultLimitCORE=infinity
DefaultLimitNPROC=infinity
DefaultLimitNOFILE=1048576
DefaultLimitMEMLOCK=infinity
DefaultLimitMSGQUEUE=infinity
EOF
###### 修改系统级默认配置 ######
# 备份原有的配置
cp /etc/systemd/system.conf /etc/systemd/system.conf.bak`date +"%Y%m%d"`
# 修改配置
grep -q '^#* *DefaultLimitCORE.*' /etc/systemd/system.conf && sed -ri 's@^#* *(DefaultLimitCORE).*@\1=infinity@' /etc/systemd/system.conf || echo "DefaultLimitCORE=infinity" >> /etc/systemd/system.conf
grep -q '^#* *DefaultLimitNPROC.*' /etc/systemd/system.conf && sed -ri 's@^#* *(DefaultLimitNPROC).*@\1=infinity@' /etc/systemd/system.conf || echo "DefaultLimitNPROC=infinity" >> /etc/systemd/system.conf
grep -q '^#* *DefaultLimitNOFILE.*' /etc/systemd/system.conf && sed -ri 's@^#* *(DefaultLimitNOFILE).*@\1=1048576@' /etc/systemd/system.conf || echo "DefaultLimitNOFILE=1048576" >> /etc/systemd/system.conf
grep -q '^#* *DefaultLimitMEMLOCK.*' /etc/systemd/system.conf && sed -ri 's@^#* *(DefaultLimitMEMLOCK).*@\1=infinity@' /etc/systemd/system.conf || echo "DefaultLimitMEMLOCK=infinity" >> /etc/systemd/system.conf
grep -q '^#* *DefaultLimitMSGQUEUE.*' /etc/systemd/system.conf && sed -ri 's@^#* *(DefaultLimitMSGQUEUE).*@\1=infinity@' /etc/systemd/system.conf || echo "DefaultLimitMSGQUEUE=infinity" >> /etc/systemd/system.conf
# 重启 systemd 生效
systemctl daemon-reexec
内核参数
cat > /etc/sysctl.d/99-sysctl.conf <<EOF
###### MTU 相关设置 ######
# 仅在路径 MTU 不可达时启用 TCP 层 MTU 探测
net.ipv4.tcp_mtu_probing = 1
# 启用 IP 层 MTU 探测 Path MTU Discovery (PMTUD)
net.ipv4.ip_no_pmtu_disc = 0
###### TCP 连接快速释放设置 ######
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
###### TIME_WAIT 过多时设置 ######
net.ipv4.tcp_tw_reuse = 1
#net.ipv4.tcp_tw_recycle = 0
# 限制 TIME_WAIT 最大值,默认 8192
net.ipv4.tcp_max_tw_buckets=5000
###### 端口相关设置 ######
# 设定允许系统主动打开的端口范围,根据需要设置,默认 32768 60999
net.ipv4.ip_local_port_range = 32768 65530
###### 防 SYNC 攻击设置 ######
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_syn_retries=3
net.ipv4.tcp_synack_retries=2
net.ipv4.tcp_max_syn_backlog=8192
# 配置 TCP 重传的最大次数减少到 5 次,超时时间约为 6 秒,方便及时发现节点故障
# net.ipv4.tcp_retries2=5
###### 其他 TCP 设置 ######
# 系统当前因后台进程无法处理的新连接而溢出,则允许系统重置新连接
net.ipv4.tcp_abort_on_overflow=1
####### nf_conntrack 相关设置(k8s、docker 防火墙的 nat) #######
net.netfilter.nf_conntrack_max = 262144
net.nf_conntrack_max = 262144
net.netfilter.nf_conntrack_tcp_timeout_established = 86400
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 3600
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
####### socket 相关设置 ######
net.core.somaxconn = 32768
net.core.netdev_max_backlog = 32768
###### 其他设置 #######
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.accept_source_route=0
net.ipv4.ip_forward = 1
net.ipv4.ip_nonlocal_bind = 1
#
net.ipv4.conf.all.forwarding=1
net.ipv6.conf.all.forwarding=1
###### 内存相关设置 #######
vm.swappiness = 0
vm.max_map_count = 655360
vm.overcommit_memory = 0
# vm.min_free_kbytes = 1048576
###### 文件相关 #######
fs.file-max = 6573688
fs.nr_open = 1048576
fs.aio-max-nr = 1048576
####### K8S 相关设置 ######
# 必须先加载 br_netfilter 模块
# 二层的网桥在转发包时也会被 arptables/ip6tables/iptables 的 FORWARD 规则所过滤
#net.bridge.bridge-nf-call-arptables = 1
#net.bridge.bridge-nf-call-ip6tables = 1
#net.bridge.bridge-nf-call-iptables = 1
###### 进程相关 #######
# 最大进程 id,默认值为 32768,最大值根据发行版有所不同
kernel.pid_max = 132768
kernel.threads-max = 123342
EOF
sysctl --system
方式一:源码构建
从源码编译时,最好使用专门的构建主机而非生产环境进行编译。构建所需的许多工具通常不应安装在生产环境中。pgBackRest 构建完成后仅包含单个可执行文件,因此可以轻松复制到新主机
基础设置
安装构建依赖
启用 EPEL 和 CRB 仓库
meson
、libyaml-devel
在 CRB 仓库,libssh2-devel
在 EPEL 仓库
dnf -y install epel-release
dnf config-manager --set-enabled crb
dnf update -y
启用 postgresql 仓库
postgresql< PG 版本>-devel
在 postgresql 仓库
dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
安装构建依赖
dnf -y install meson gcc openssl-devel \
libxml2-devel lz4-devel libzstd-devel bzip2-devel libyaml-devel libssh2-devel
dnf -y install postgresql17-devel
基础变量设置
版本情况:pgBackRest Releases
PGBACKREST_VERSION=2.55.1
PGBACKREST_HOME=/opt/pgbackrest
mkdir -p ${PGBACKREST_HOME}/bin
下载
下载
mkdir -p /usr/local/src/pgbackrest/build
# 注:http://192.168.111.1:10811 为网络代理地址,没有网络代理可以不配置
curl -x http://192.168.111.1:10811 \
-o /usr/local/src/pgbackrest/${PGBACKREST_VERSION}.tar.gz \
-L https://github.com/pgbackrest/pgbackrest/archive/release/${PGBACKREST_VERSION}.tar.gz
解压
tar -zxvf /usr/local/src/pgbackrest/${PGBACKREST_VERSION}.tar.gz \
-C /usr/local/src/pgbackrest/
构建
构建配置并编译
export PKG_CONFIG_PATH=/usr/pgsql-17/lib/pkgconfig:$PKG_CONFIG_PATH
meson setup /usr/local/src/pgbackrest/build/pgbackrest /usr/local/src/pgbackrest/pgbackrest-release-${PGBACKREST_VERSION}
ninja -C /usr/local/src/pgbackrest/build/pgbackrest
构建完成的二进制文件在 src
路径下
ls -lh /usr/local/src/pgbackrest/build/pgbackrest/src/pgbackrest
# 输出信息
-rwxr-xr-x. 1 root root 1.2M Jun 14 10:42
/usr/local/src/pgbackrest/build/pgbackrest/src/pgbackrest
复制到指定路径
cp /usr/local/src/pgbackrest/build/pgbackrest/src/pgbackrest ${PGBACKREST_HOME}/bin/
配置
配置目录
pgBackRest 需要日志目录、配置目录以及配置文件
groupadd -r postgres
useradd -r \
-g postgres \
-s "/bin/bash" \
-m \
postgres
# 日志目录
mkdir -p -m 770 /var/log/pgbackrest
chown postgres:postgres /var/log/pgbackrest
# 配置目录
mkdir -p /etc/pgbackrest
mkdir -p /etc/pgbackrest/conf.d
touch /etc/pgbackrest/pgbackrest.conf
chmod 640 /etc/pgbackrest/pgbackrest.conf
chown -R postgres:postgres /etc/pgbackrest/
路径
cat > /etc/profile.d/pgbackrest.sh << EOF
export PGBACKREST_VERSION=${PGBACKREST_VERSION}
export PGBACKREST_HOME=${PGBACKREST_HOME}
export PATH=\${PATH}:\${PGBACKREST_HOME}/bin
EOF
source /etc/profile
验证
sudo -iu postgres pgbackrest
方式二:软件包(推荐)
pgBackRest 的 RHEL 安装包可从 Crunchy Data: Postgres for Cloud, Kubernetes, or Enterprise 或 PostgreSQL YUM Repository 获取
部署
启用 postgresql 仓库
postgresql-libs
、pgbackrest
在 postgresql 仓库中
dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
启用 EPEL 仓库
libssh2
在 EPEL 仓库
dnf -y install epel-release
安装依赖
dnf -y install postgresql-libs libssh2
部署
dnf -y install pgbackrest
配置
配置目录
pgBackRest 需要日志目录、配置目录以及配置文件
# 日志目录
mkdir -p -m 770 /var/log/pgbackrest
chown postgres:postgres /var/log/pgbackrest
# 配置目录
mkdir -p /etc/pgbackrest
mkdir -p /etc/pgbackrest/conf.d
mv /etc/pgbackrest.conf /etc/pgbackrest/pgbackrest.conf
chmod 640 /etc/pgbackrest/pgbackrest.conf
chown -R postgres:postgres /etc/pgbackrest/
验证
sudo -iu postgres pgbackrest