postgres使用barman实现增量备份和任意时间点恢复

实验要求-两台服务器-centos7

数据库服务器

-hostname: node133
-ip:192.168.232.133

备份服务器

-hostname: node134
-ip:192.168.232.134

实验步骤

数据库服务器

docker安装(离线)

下载安装包

https://download.docker.com/linux/static/stable/x86_64/
下载版本docker20.10.6

#解压
tar -zxvf docker-20.10.6.tgz
#cp
cp docker/* /usr/bin
#创建文件夹
mkdir /docker
#编辑
vim /etc/systemd/system/docker.service
#复制以下内容到文件docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
 
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd --graph=/docker
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
 
[Install]
WantedBy=multi-user.target

#启动
systemctl start docker
#查看
docker info

使用docker-compose配置文件在docker部署odoo13和postgres12
并挂载postgres的data目录和bin目录

version: '2'
services:
  web:
    image: odoo:13
    depends_on:
      - db
    ports:
      - "8132:8069"
      - "8139:8072"
    volumes:
      - odoo-web-data:/var/lib/odoo
      - ./config:/etc/odoo
      - ./base_addons:/mnt/base_addons
      - ./back-end:/mnt/extra-addons
  db:
    image: postgres:12
    ports:
     - "15432:5432"
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_PASSWORD=odoo
      - POSTGRES_USER=odoo
      - PGDATA=/var/lib/postgresql/data
    volumes:
      - odoo-db-data:/var/lib/postgresql/data
      - ./usr/lib/postgresql/12/bin
volumes:
  odoo-web-data:
  odoo-db-data:
#创建目录(自定义)
mkdir /home/test
#编辑文件 将上面内容复制进来并保存
vim /home/test/docker-compose.yml
#安装docker-compose
参考:https://cloud.tencent.com/developer/article/1924733
#在/home/test/目录下启动docker-compose
cd /home/test
docker-compose up
#查看
docker ps -a
#如果odoo容器或者postgres容器为exited
docker-compose restart
#再次查看  如果容器状态都为up  则成功
docker ps -a
#进入docker
docker exec -it test_db_1 /bin/bash

在docker里面安装rsync

#安装rsync  如果E: Unable to locate package rsync  则先更新  apt-get upate
apt-get install rsync

备份服务器

安装 epel 源 (Extra Packages for Enterprise Linux)

yum -y install epel-release 

安装python3.7

#安装python3.7所需依赖
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make
#创建目录
mkdir /python
cd /python
#下载python源码包  如果没有wget 就先安装  yum install wget
wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz
#解压
tar -zxvf Python-3.7.0.tgz
#进入解压后目录
cd Python-3.7.0
./configure
make&&make install
#如果出现了报错“ModuleNotFound:No module named '_ctypes'”
yum install libffi-devel -y
#然后
make&&make install
#设置软连接
mv /usr/bin/python /usr/bin/python.bak
ln -s /usr/local/bin/python3 /usr/bin/python
#查看
python
#yum 依赖python2.7  安装完python3.7以后  需要在yum相关配置中特别指出使用python2.7
#在第一行后面加上2.7   例如:#! /usr/bin/python2.7
vi /usr/libexec/urlgrabber-ext-down
#同上 追加2.7
vi /usr/bin/yum

安装rsync

yum -y install rsync

安装 pgdg 源

rpm -ivh https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

安装barman

#安装
yum install barman
#使用上面命令安装barman的时候会自动安装下面的模块
python36-argcomplete.x86_64
python36-argh
python36-psycopg2
python36-dateutil
#使用 pip 安装需要的 python 模块。进入 python3 的安装目录,执行命令如下
pip3 install argcomplete -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip3 install argh -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip3 install psycopg2 -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip3 install python-dateutil -i https://pypi.tuna.tsinghua.edu.cn/simple/
#如果安装第三个模块报错Error: pg_config executable not found. 使用下面这条命令后再次尝试安装
yum install postgresql-devel*
#如果上面这条命令又报错 Error Summary 将提示的冲突软件包的低版本卸载掉
yum remove ***
python -m pip install -U pip
pip3 install psycopg2-binary -i https://pypi.tuna.tsinghua.edu.cn/simple/

在两台服务器之间配置免密登录

参考:https://blog.csdn.net/LSW_JAVADP/article/details/121757927

继续配置数据库服务器

找到postgres的bin目录并远程复制到备份服务器的指定目录

#使用find命令找到postgres的bin目录
find / -name 'bin'
#把PostgreSQL的bin目录复制到备份服务器的目录 /etc/barman.d/中
scp -r /docker/overlay2/02b3c71f22b767fde9b9f199fe0483590a9fbb42fa049061ff84dc1974556ef2/merged/usr/lib/postgresql/12/bin root@192.168.232.134:/etc/barman.d/

使用Navicat连接上postgres数据库

#以下信息在docker-compose.yml文件中都配置过
主机:192.168.232.133
端口:15432
初始数据库:postgres
用户名:odoo
密码:odoo

在数据库中创建用户barman和streaming_barman,其中barman要是superuser,streaming_barman有复制权限。具体的sql如下

CREATE ROLE barman with LOGIN PASSWORD 'barman123' SUPERUSER;
CREATE ROLE streaming_barman with LOGIN PASSWORD 'streaming_barman123' REPLICATION

数据库的配置文件postgresql.conf应该做如下配置:

listen_addresses = '*'
wal_level = replica
max_wal_senders = 20
archive_mode = off

在 pg_hba.conf 中,添加如下内容,允许用户barman和streaming_barman访问

host      all           barman                   127.0.0.1/32            md5
host      all           barman                   192.168.232.133/32        md5
host      all           barman                   192.168.232.134/32        md5
host      replication    streaming_barman         127.0.0.1/32            md5
host      replication    streaming_barman         192.168.232.133/32        md5
host      replication    streaming_barman         192.168.232.134/32        md5

配置备份服务器

创建barman的日志目录 /var/log/barman

mkdir /var/log/barman

编辑 /etc/barman.conf ,在 “[barman]” 之下修改这些配置项,以设置全局的备份参数

System user
barman_user = barman
Directory of configuration files. Place your sections in separate files with .conf extension
For example place the 'main' server section in /etc/barman.d/main.conf
configuration_files_directory = /etc/barman.d
 
; Main directory
barman_home = /var/lib/barman
 Log location
log_file = /var/log/barman/barman.log 
 Log level (see logging - Logging facility for Python - Python 3.9.4 documentation)
log_level = INFO
Global retention policy (REDUNDANCY or RECOVERY WINDOW) - default empty
retention_policy = RECOVERY WINDOW OF 4 WEEKS
Number of parallel jobs for backup and recovery via rsync (default 1)
parallel_jobs = 3
Immediate checkpoint for backup command - default false
immediate_checkpoint = true
Enable network compression for data transfers - default false
network_compression = false
 Number of retries of data copy during base backup after an error - default 0
basebackup_retry_times = 3
 Number of seconds of wait after a failed copy, before retrying - default 30
basebackup_retry_sleep = 30
Minimum number of required backups (redundancy)
minimum_redundancy = 2

参数的含义:

barman_user 运行barman的用户

configuration_files_directory 配置文件所在目录。将您的备份放在扩展名为 .conf 的单独文件中

barman_home barmn 的主目录

log_file barman 日志文件的位置

log_level 日志级别

retention_policy 备份的保留策略。空表示禁用;REDUNDANCY 2 表示保留两份基础备份;RECOVERY WINDOW OF 4 WEEKS 表示保留4星期之内的备份

parallel_jobs 通过 rsync 备份和恢复的并行作业数

immediate_checkpoint 备份命令是否执行立即检查点

network_compression 启用网络压缩以进行数据传输。对于流备份,这个参数设置为false

basebackup_retry_times 在基础备份期间发生错误后重新尝试的次数

basebackup_retry_sleep 复制失败后,重试之前等待的秒数

minimum_redundancy 所需的最小备份数量

配置要备份的数据库的信息,进入 /etc/barman.d ,将 streaming-server.conf-template 复制为 pg.conf ,文件名中的“pg”也是此备份任务的名称

conninfo = host=192.168.232.133 port=15432 user=barman dbname=postgres password=barman123
 
streaming_conninfo = host=192.168.232.133 port=15432 dbname=postgres user=streaming_barman password=streaming_barman123
backup_method = postgres
streaming_archiver = on
slot_name = barman
path_prefix = "/etc/barman.d/bin"

些参数的含义:

conninfo 基础备份的连接信息。

streaming_conninfo 流归档的连接信息。

backup_method 基础备份的方式。“postgres”表示使用 pg_basebackup 进行备份;rsync 表示使用 rsync 备份。

streaming_archiver 是否启用流归档。on 表示是。

slot_name 复制槽的名称

path_prefix 客户端的postgresql的bin的路径。

使用barman在备份服务器进行备份并恢复

备份

#执行barman的命令,创建名为pg的复制槽
barman receive-wal --create-slot pg
#在后台不间断地从数据库服务端接收wal日志
barman receive-wal pg &
#如果报错ERROR: ArchiverFailure:pg_receivewal not present in $PATH
export PATH=$PATH:/etc/barman.d/bin
#检查备份任务pg的运行状态,如果各项结果均为OK,则表示状态正常
barman check pg
#如果检查结果报错  WAL archive: FAILED (please make sure WAL shipping is setup)
barman switch-xlog --force pg
#基础备份 基础备份文件位于 /var/lib/barman/pg/base 中
barman backup pg
#设置常规的定时备份方案
#设置每10分钟检查一次barman服务的状态,进行一次维护操作
echo "*/10 * * * * barman barman cron" >> /etc/crontab
#设置10天做一次基础备份
echo "* * */10 * * barman barman backup pg" /etc/crontab

恢复

#在数据库服务器上停止数据库
docker-compose stop
#在barman服务器上,执行命令恢复数据库
#首先查看有哪些基础备份
barman list-backup pg

备份列表如下:

[root@node133 ~]# barman list-backup pg
pg 20220228T085824 - Mon Feb 28 00:58:26 2022 - Size: 39.6 MiB - WAL Size: 0 B

加8小时是28号8点58分的备份,恢复到九点

su - barman
#/opt/pg_root如果不存在 可能会执行失败  可以事先创建好 并授权chown -R barman.root /opt/pg_root
barman recover --target-time '2022-02-28 09:00:00' pg 20220228T085824 /opt/pg_root

重新启动PostgreSQL,检查服务是否正常

docker-compose start

在备份服务器上继续接收日志

barman receive-wal pg &
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • | | 备份速度|备份范围|恢复范围|操作影响|备份原理|恢复成本|| ------- |:---...
    顶儿响叮当阅读 8,806评论 0 4
  • PostgreSQL备份和恢复 原创没刮胡子 最后发布于2019-07-18 14:05:10 阅读数 190 收...
    不玩了啊阅读 5,918评论 0 0
  • 一个应用数据的备份会产生一个归档文件,它包含database,所有的repositories ,以及所有的附件。 ...
    记忆挽留阅读 5,411评论 0 1
  • Standby数据库原理 简单介绍一些基础概念与原理,首先我们做主从同步的目的就是实现db服务的高可用性,通常是一...
    椟夜阅读 8,495评论 0 5
  • 1.概念 数据库热备:数据库热备是指为主数据库的创建、维护和监控一个或多个备用数据库,它们时刻处于开机状态,同主机...
    selerisjava阅读 7,180评论 0 0