searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Postgresql备份恢复支持对象存储方法介绍

2024-10-24 09:13:12
23
0

pgbackrest简介

pgBackRest是一个PostgreSQL数据库备份和恢复的管理插件,有以下特性:

● 支持并行备份与恢复

● 支持本地或远程操作,需配置TLS

● 支持全量、增量和差异备份,支持基于备份恢复、时间点恢复及数据库恢复

● 支持断点备份

● S3、Azure和GCS兼容的对象存储支持

部署架构

跨域备份和恢复-第 4 页.drawio.png

pgbackrest使用说明

可信环境的建立

pgbackrest支持tls和ssh两种传输方式,由于ssh的配置方式需要免密,这在生产环境存在安全风险,故选择使用tls的方式。

  1. 创建.pgpaas文件
touch ~/.pgpaas
  1. 写入验证信息
# hostname:port:database:username:password
localhost:9501:postgres:backup:<yourpassword>
  1. 修改权限,~/.pgpass 上的权限必须不允许所有人或组内访问
chmod 0600 ~/.pgpass

tls加密传输

早期版本pgBackRest需要通过设置数据库与目标库免密登录来实现文件复制;2.37版本之后pgBackRest添加TLS/SSL方式,免去了互相ssh登录的需求。TLS是一种提供通信安全的协议,它可以在不安全的网络上保护数据的机密性和完整性。鉴于安全要求,使用TLS方式进行文件传输。作者通过Openssl生成证书,以下为生成步骤

  1. 生成一个新的证书,并将时间设为365天
openssl req -new -x509 -days 365 -nodes -out ca.crt -keyout ca.key -subj "/CN=root-ca"
  1. 生成调度服务机器的证书签名请求及私钥
openssl req -new -nodes -out backup-srv.csr -keyout backup-srv.key -subj "/CN=调度服务机器的host"
  1. 使用CA来签署CSR(证书签名请求),并生成一个新的证书
openssl x509 -req -in backup-srv.csr -days 365 -CA ca.crt -CAkey ca.key -CAcreateserial -out backup-srv.crt
  1. 将ca.crt、backup-srv.crt、backup-srv.key复制到调度服务的机器上的/app/pg/pg/pgbackrest/certs/目录下
  2. 在调度服务的机器上为openssl生成的文件赋权
chmod 0600 /app/pg/pg/pgbackrest/certs/*
  1. 使用CA来签署CSR(证书签名请求),并生成一个新的证书
openssl req -new -nodes -out pg-srv.csr -keyout pg-srv.key -subj "/CN=实例机器的host"
  1. 使用CA来签署CSR(证书签名请求)
openssl x509 -req -in pg-srv.csr -days 365 -CA ca.crt -CAkey ca.key -CAcreateserial -out pg-srv.crt
  1. 将ca.crt、pg-srv.crt、pg-srv.key复制到执行备份指令的机器上的/app/pg/pg/pgbackrest/certs/目录下
  2. 在部署实例机器上为openssl生成的文件赋权
chmod 0600 /app/pg/pg/pgbackrest/certs/*

pgbackrest配置

  1. 在调度服务机器上的pgbackrest安装目录下的conf目录,创建pgbackrest.conf配置文件,配置内容如下
[global]
# 备份数据位置
repo1-path=/data
# 压缩方式:none/gz/lz4/zst
compress-type=zst
compress-level=1
# 完整备份保留的类型:count:计数,time:时间
repo1-retention-full-type=time
# 完整备份保留的份数/天数
repo1-retention-full=9999
# 备份/恢复时的进程数
process-max=2
# pgbackrest的日志输出级别
log-level-console=detail
log-level-file=info
# 强制检查点快速启动备份
start-fast=y
# 使用检验和,在备份过程中,此选项将使用校验和而不是时间戳来确定是否要复制文件
delta=y
# 允许恢复失败的备份
resume=y
# 启动wal日志检查
archive-check=y
# 日志地址
log-path=/app/pg/pgbackrest/logs
# 等待wal推送完成超时时间,单位:s
archive-timeout=300
# 文件锁的路径
lock-path=/app/pg/pgbackrest/lock

# s3桶名称
repo1-s3-bucket=demo-bucket
# s3地址
repo1-s3-endpoint=s3地址
# s3 ak
repo1-s3-key=ak
# s3 sk
repo1-s3-key-secret=sk
# s3区域
repo1-s3-region=cn-guangdong-1
# 启用/禁用存储(s3)服务器TLS证书验证的功能
repo1-storage-verify-tls=n
# uri样式,支持host,path
repo1-s3-uri-style=path
# 启用s3存储
repo1-type=s3
# 块增量备份,可以节省存储空间以及提高增量恢复效率,repo1-bundle必须开启才生效
repo1-block=y
# 捆绑存储库中的文件,减少存储的文件总数,节省时间和空间
repo1-bundle=y
# 从备库进行备份
backup-standby=y

# 备份机作为服务端时,使用的tls加密配置,包括公钥私钥与证书
tls-server-address=*
# 备份机pgbackrest服务端口
tls-server-port=6582
tls-server-cert-file=/app/pg/pgbackrest/certs/backup-srv.crt
tls-server-key-file=/app/pg/pgbackrest/certs/backup-srv.key
tls-server-ca-file=/app/pg/pgbackrest/certs/ca.crt

# 将调度服务所在机器和实例节点所在机器的ip加入可信
tls-server-auth=实例节点ip=*
tls-server-auth=调度服务所在机器ip=*
  1. 在conf目录下创建目录conf.d,同时生成配置文件demo-stanza.conf,配置内容如下
[demo-stanza]
pg1-path=/app/pg/data
pg1-port=6543
pg1-user=ctgbackup
pg1-socket-path=/tmp
repo1-s3-bucket=demo-bucket
repo1-s3-endpoint=s3地址
repo1-s3-key=ak
repo1-s3-key-secret=sk
  1. 实例节点的配置
    同理,在实例节点的pgbackrest安装目录下创建目录conf,并创建pgbackrest.conf配置文件,配置内容如下
[global]
# 调度服务所在机器ip
repo1-host=host
# pgbackrest服务端口
repo1-host-port=6582
# 调度服务pgbackrest配置文件路径
repo1-host-config-path=/app/pg/pgbackrest/conf
# pg数据库用户
repo1-host-user=ctgbackup
repo1-host-type=tls
repo1-host-cert-file=/app/pg/pgbackrest/certs/pg-srv.crt
repo1-host-key-file=/app/pg/pgbackrest/certs/pg-srv.key
repo1-host-ca-file=/app/pg/pgbackrest/certs/ca.crt

# general options
process-max=2
log-level-console=detail
log-level-file=info
# 日志地址
log-path=/app/pg/pgbackrest/logs
# 存储瞬态数据的路径
spool-path=/app/pg/pgbackrest/spool
# I/O操作的缓冲区大小
buffer-size=16MiB
# 异步推送wal日志
archive-async=y
# 推送wal日志队列大小
archive-push-queue-max=100GiB
# 文件锁的路径
lock-path=/app/pg/pgbackrest/lock

# s3桶名称
repo1-s3-bucket=demo-bucket
# s3地址
repo1-s3-endpoint=s3地址
# s3 ak
repo1-s3-key=ak
# s3 sk
repo1-s3-key-secret=sk
# s3区域
repo1-s3-region=cn-guangdong-1
# 启用/禁用存储(s3)服务器TLS证书验证的功能
repo1-storage-verify-tls=n
# uri样式,支持host,path
repo1-s3-uri-style=path
# 启用s3存储
repo1-type=s3
# 块增量备份,可以节省存储空间以及提高增量恢复效率,repo1-bundle必须开启才生效
repo1-block=y
# 捆绑存储库中的文件,减少存储的文件总数,节省时间和空间
repo1-bundle=y
# 从备库进行备份
backup-standby=y
# 检查WAL标头中的PostgreSQL版本/id
archive-header-check=y

# tls 配置
tls-server-address=*
# 实例机上pgbackrest服务端口
tls-server-port=6581
tls-server-cert-file=/app/pg/pgbackrest/certs/pg-srv.crt
tls-server-key-file=/app/pg/pgbackrest/certs/pg-srv.key
tls-server-ca-file=/app/pg/pgbackrest/certs/ca.crt
tls-server-auth=调度服务所在机器ip=*

[demo-stanza]
pg1-path=/data/pg_6543/data
pg1-port=6543
pg1-user=ctgbackup
pg1-socket-path=/tmp

postgresql的配置文件修改

在postgresql的配置文件postgresql.auto.conf增加以下配置

archive_command = '/app/pg/postgresql/bin/pgbackrest --stanza=demo-stanza archive-push %p --config-path=/app/pg/pgbackrest/conf'
archive_mode = on
wal_level = replica
# wal日志推送进程根据实际需要配置
max_wal_senders = 10
listen_addresses = '*'

启动pgbackrest服务

在调度服务机器上启动pgbackrest服务端,实例节点机器上启动pgbackrest客户端,指令如下

/app/pg/pgbackrest/bin/pgbackrest server --config-path=/app/pg/pgbackrest/conf >> /app/pg/pgbackrest/logs/console.log

pgbackrest相关指令

  1. 创建仓库(在服务端执行,也就是本文中部署调度服务的机器上)
/app/pg/postgresql/bin/pgbackrest --stanza=demo-stanza stanza-create --config-path=/app/pg/pgbackrest/conf --config-include-path=/app/pg/pgbackrest/conf/conf.d
  1. 全量备份(在服务端执行,也就是本文中部署调度服务的机器上)
/app/pg/postgresql/bin/pgbackrest --stanza=demo-stanza --type=full backup --config-path=/app/pg/pgbackrest/conf --config-include-path=/app/pg/pgbackrest/conf/conf.d
  1. 增量备份(在服务端执行,也就是本文中部署调度服务的机器上)
/app/pg/postgresql/bin/pgbackrest --stanza=demo-stanza --type=incr backup --config-path=/app/pg/pgbackrest/conf --config-include-path=/app/pg/pgbackrest/conf/conf.d
  1. 查询备份信息(在服务端执行,也就是本文中部署调度服务的机器上)
/app/pg/postgresql/bin/pgbackrest --stanza=demo-stanza info --config-path=/app/pg/pgbackrest/conf --config-include-path=/app/pg/pgbackrest/conf/conf.d
  1. 基于备份集恢复(在客户端执行,本文中的实例节点所在机器)
    以下--set的值可从第4步中获得
/app/pg/postgresql/bin/pgbackrest --stanza=demo-stanza --type=immediate --set=20240102-145227F --target-action=promote restore --config-path=/app/pg/pgbackrest/conf --config-include-path=/app/pg/pgbackrest/conf/conf.d
  1. 基于时间点恢复
    --target-timeline可以不配置,在实践中有概率恢复失败,因为无法确认应该从哪个时间线进行回放wal日志,因此可以指定从哪个时间线进行回放wal日志
/app/pg/postgresql/bin/pgbackrest --stanza=demo-stanza --type=time "--target=2024-03-18 10:38:46+08" --target-timeline=25  --target-action=promote restore --config-path=/app/pg/pgbackrest/conf --config-include-path=/app/pg/pgbackrest/conf/conf.d
0条评论
0 / 1000
陈****宾
1文章数
0粉丝数
陈****宾
1 文章 | 0 粉丝
陈****宾
1文章数
0粉丝数
陈****宾
1 文章 | 0 粉丝
原创

Postgresql备份恢复支持对象存储方法介绍

2024-10-24 09:13:12
23
0

pgbackrest简介

pgBackRest是一个PostgreSQL数据库备份和恢复的管理插件,有以下特性:

● 支持并行备份与恢复

● 支持本地或远程操作,需配置TLS

● 支持全量、增量和差异备份,支持基于备份恢复、时间点恢复及数据库恢复

● 支持断点备份

● S3、Azure和GCS兼容的对象存储支持

部署架构

跨域备份和恢复-第 4 页.drawio.png

pgbackrest使用说明

可信环境的建立

pgbackrest支持tls和ssh两种传输方式,由于ssh的配置方式需要免密,这在生产环境存在安全风险,故选择使用tls的方式。

  1. 创建.pgpaas文件
touch ~/.pgpaas
  1. 写入验证信息
# hostname:port:database:username:password
localhost:9501:postgres:backup:<yourpassword>
  1. 修改权限,~/.pgpass 上的权限必须不允许所有人或组内访问
chmod 0600 ~/.pgpass

tls加密传输

早期版本pgBackRest需要通过设置数据库与目标库免密登录来实现文件复制;2.37版本之后pgBackRest添加TLS/SSL方式,免去了互相ssh登录的需求。TLS是一种提供通信安全的协议,它可以在不安全的网络上保护数据的机密性和完整性。鉴于安全要求,使用TLS方式进行文件传输。作者通过Openssl生成证书,以下为生成步骤

  1. 生成一个新的证书,并将时间设为365天
openssl req -new -x509 -days 365 -nodes -out ca.crt -keyout ca.key -subj "/CN=root-ca"
  1. 生成调度服务机器的证书签名请求及私钥
openssl req -new -nodes -out backup-srv.csr -keyout backup-srv.key -subj "/CN=调度服务机器的host"
  1. 使用CA来签署CSR(证书签名请求),并生成一个新的证书
openssl x509 -req -in backup-srv.csr -days 365 -CA ca.crt -CAkey ca.key -CAcreateserial -out backup-srv.crt
  1. 将ca.crt、backup-srv.crt、backup-srv.key复制到调度服务的机器上的/app/pg/pg/pgbackrest/certs/目录下
  2. 在调度服务的机器上为openssl生成的文件赋权
chmod 0600 /app/pg/pg/pgbackrest/certs/*
  1. 使用CA来签署CSR(证书签名请求),并生成一个新的证书
openssl req -new -nodes -out pg-srv.csr -keyout pg-srv.key -subj "/CN=实例机器的host"
  1. 使用CA来签署CSR(证书签名请求)
openssl x509 -req -in pg-srv.csr -days 365 -CA ca.crt -CAkey ca.key -CAcreateserial -out pg-srv.crt
  1. 将ca.crt、pg-srv.crt、pg-srv.key复制到执行备份指令的机器上的/app/pg/pg/pgbackrest/certs/目录下
  2. 在部署实例机器上为openssl生成的文件赋权
chmod 0600 /app/pg/pg/pgbackrest/certs/*

pgbackrest配置

  1. 在调度服务机器上的pgbackrest安装目录下的conf目录,创建pgbackrest.conf配置文件,配置内容如下
[global]
# 备份数据位置
repo1-path=/data
# 压缩方式:none/gz/lz4/zst
compress-type=zst
compress-level=1
# 完整备份保留的类型:count:计数,time:时间
repo1-retention-full-type=time
# 完整备份保留的份数/天数
repo1-retention-full=9999
# 备份/恢复时的进程数
process-max=2
# pgbackrest的日志输出级别
log-level-console=detail
log-level-file=info
# 强制检查点快速启动备份
start-fast=y
# 使用检验和,在备份过程中,此选项将使用校验和而不是时间戳来确定是否要复制文件
delta=y
# 允许恢复失败的备份
resume=y
# 启动wal日志检查
archive-check=y
# 日志地址
log-path=/app/pg/pgbackrest/logs
# 等待wal推送完成超时时间,单位:s
archive-timeout=300
# 文件锁的路径
lock-path=/app/pg/pgbackrest/lock

# s3桶名称
repo1-s3-bucket=demo-bucket
# s3地址
repo1-s3-endpoint=s3地址
# s3 ak
repo1-s3-key=ak
# s3 sk
repo1-s3-key-secret=sk
# s3区域
repo1-s3-region=cn-guangdong-1
# 启用/禁用存储(s3)服务器TLS证书验证的功能
repo1-storage-verify-tls=n
# uri样式,支持host,path
repo1-s3-uri-style=path
# 启用s3存储
repo1-type=s3
# 块增量备份,可以节省存储空间以及提高增量恢复效率,repo1-bundle必须开启才生效
repo1-block=y
# 捆绑存储库中的文件,减少存储的文件总数,节省时间和空间
repo1-bundle=y
# 从备库进行备份
backup-standby=y

# 备份机作为服务端时,使用的tls加密配置,包括公钥私钥与证书
tls-server-address=*
# 备份机pgbackrest服务端口
tls-server-port=6582
tls-server-cert-file=/app/pg/pgbackrest/certs/backup-srv.crt
tls-server-key-file=/app/pg/pgbackrest/certs/backup-srv.key
tls-server-ca-file=/app/pg/pgbackrest/certs/ca.crt

# 将调度服务所在机器和实例节点所在机器的ip加入可信
tls-server-auth=实例节点ip=*
tls-server-auth=调度服务所在机器ip=*
  1. 在conf目录下创建目录conf.d,同时生成配置文件demo-stanza.conf,配置内容如下
[demo-stanza]
pg1-path=/app/pg/data
pg1-port=6543
pg1-user=ctgbackup
pg1-socket-path=/tmp
repo1-s3-bucket=demo-bucket
repo1-s3-endpoint=s3地址
repo1-s3-key=ak
repo1-s3-key-secret=sk
  1. 实例节点的配置
    同理,在实例节点的pgbackrest安装目录下创建目录conf,并创建pgbackrest.conf配置文件,配置内容如下
[global]
# 调度服务所在机器ip
repo1-host=host
# pgbackrest服务端口
repo1-host-port=6582
# 调度服务pgbackrest配置文件路径
repo1-host-config-path=/app/pg/pgbackrest/conf
# pg数据库用户
repo1-host-user=ctgbackup
repo1-host-type=tls
repo1-host-cert-file=/app/pg/pgbackrest/certs/pg-srv.crt
repo1-host-key-file=/app/pg/pgbackrest/certs/pg-srv.key
repo1-host-ca-file=/app/pg/pgbackrest/certs/ca.crt

# general options
process-max=2
log-level-console=detail
log-level-file=info
# 日志地址
log-path=/app/pg/pgbackrest/logs
# 存储瞬态数据的路径
spool-path=/app/pg/pgbackrest/spool
# I/O操作的缓冲区大小
buffer-size=16MiB
# 异步推送wal日志
archive-async=y
# 推送wal日志队列大小
archive-push-queue-max=100GiB
# 文件锁的路径
lock-path=/app/pg/pgbackrest/lock

# s3桶名称
repo1-s3-bucket=demo-bucket
# s3地址
repo1-s3-endpoint=s3地址
# s3 ak
repo1-s3-key=ak
# s3 sk
repo1-s3-key-secret=sk
# s3区域
repo1-s3-region=cn-guangdong-1
# 启用/禁用存储(s3)服务器TLS证书验证的功能
repo1-storage-verify-tls=n
# uri样式,支持host,path
repo1-s3-uri-style=path
# 启用s3存储
repo1-type=s3
# 块增量备份,可以节省存储空间以及提高增量恢复效率,repo1-bundle必须开启才生效
repo1-block=y
# 捆绑存储库中的文件,减少存储的文件总数,节省时间和空间
repo1-bundle=y
# 从备库进行备份
backup-standby=y
# 检查WAL标头中的PostgreSQL版本/id
archive-header-check=y

# tls 配置
tls-server-address=*
# 实例机上pgbackrest服务端口
tls-server-port=6581
tls-server-cert-file=/app/pg/pgbackrest/certs/pg-srv.crt
tls-server-key-file=/app/pg/pgbackrest/certs/pg-srv.key
tls-server-ca-file=/app/pg/pgbackrest/certs/ca.crt
tls-server-auth=调度服务所在机器ip=*

[demo-stanza]
pg1-path=/data/pg_6543/data
pg1-port=6543
pg1-user=ctgbackup
pg1-socket-path=/tmp

postgresql的配置文件修改

在postgresql的配置文件postgresql.auto.conf增加以下配置

archive_command = '/app/pg/postgresql/bin/pgbackrest --stanza=demo-stanza archive-push %p --config-path=/app/pg/pgbackrest/conf'
archive_mode = on
wal_level = replica
# wal日志推送进程根据实际需要配置
max_wal_senders = 10
listen_addresses = '*'

启动pgbackrest服务

在调度服务机器上启动pgbackrest服务端,实例节点机器上启动pgbackrest客户端,指令如下

/app/pg/pgbackrest/bin/pgbackrest server --config-path=/app/pg/pgbackrest/conf >> /app/pg/pgbackrest/logs/console.log

pgbackrest相关指令

  1. 创建仓库(在服务端执行,也就是本文中部署调度服务的机器上)
/app/pg/postgresql/bin/pgbackrest --stanza=demo-stanza stanza-create --config-path=/app/pg/pgbackrest/conf --config-include-path=/app/pg/pgbackrest/conf/conf.d
  1. 全量备份(在服务端执行,也就是本文中部署调度服务的机器上)
/app/pg/postgresql/bin/pgbackrest --stanza=demo-stanza --type=full backup --config-path=/app/pg/pgbackrest/conf --config-include-path=/app/pg/pgbackrest/conf/conf.d
  1. 增量备份(在服务端执行,也就是本文中部署调度服务的机器上)
/app/pg/postgresql/bin/pgbackrest --stanza=demo-stanza --type=incr backup --config-path=/app/pg/pgbackrest/conf --config-include-path=/app/pg/pgbackrest/conf/conf.d
  1. 查询备份信息(在服务端执行,也就是本文中部署调度服务的机器上)
/app/pg/postgresql/bin/pgbackrest --stanza=demo-stanza info --config-path=/app/pg/pgbackrest/conf --config-include-path=/app/pg/pgbackrest/conf/conf.d
  1. 基于备份集恢复(在客户端执行,本文中的实例节点所在机器)
    以下--set的值可从第4步中获得
/app/pg/postgresql/bin/pgbackrest --stanza=demo-stanza --type=immediate --set=20240102-145227F --target-action=promote restore --config-path=/app/pg/pgbackrest/conf --config-include-path=/app/pg/pgbackrest/conf/conf.d
  1. 基于时间点恢复
    --target-timeline可以不配置,在实践中有概率恢复失败,因为无法确认应该从哪个时间线进行回放wal日志,因此可以指定从哪个时间线进行回放wal日志
/app/pg/postgresql/bin/pgbackrest --stanza=demo-stanza --type=time "--target=2024-03-18 10:38:46+08" --target-timeline=25  --target-action=promote restore --config-path=/app/pg/pgbackrest/conf --config-include-path=/app/pg/pgbackrest/conf/conf.d
文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0