zoukankan      html  css  js  c++  java
  • 使用 barman的备份和归档PostgreSQL

     

    1 前言

    1.1 Barman简介

    barman(备份和恢复管理器)是用于PostgreSQL服务器进行灾难恢复的开源管理工具,是以Python编写的。它支持对多台服务器执行远程备份,以降低风险并帮助DBA进行数据库恢复。

    1.2 Barman的备份方式

    本文假定读者熟悉理论上的灾难恢复概念,并且具有在PostgreSQL物理备份和灾难恢复方面的基础知识。

    我们知道 PostgreSQL 的连续备份包含一个或多个基础备份和连续归档的WAL日志。Barman 支持两种方法实现这样的备份。我们讨论的情况是数据库服务和备份文件在不同服务器上的情况。

    1.2.1 基于流协议的备份

    基于流协议的备份方法是barman 提供的独特的方法。它适用于PostgreSQL 9.4或更高版本。它使用pg_basebackup进行基础备份,使用pg_receivewal ( PostgreSQL 10 以下是 pg_receivexlog)归档WAL。其结构如下图所示:

    在这种情况下,您将需要配置:

    1. 与PostgreSQL的标准连接,用于管理,协调和监视
    2. 供pg_basebackup(用于基本备份操作)和pg_receivewal(用于WAL流归档)使用的流复制连接

     

     

    用Barman 的术语来说,此设置称为 streaming-only设置,因为它不需要任何SSH连接即可进行备份和归档操作。Barman 也支持基于基于流协议备份与基于SSH 的WAL 归档结合,下图描绘了这种实现:

     

    这种方案要求:

    1. 额外的SSH连接,以允许用户postgres 在PostgreSQL服务器以barman的用户身份连接到Barman服务器上。
    2. 在PostgreSQL的配置文件postgresql.conf 中配置archive_command,内容是将WAL文件归档到Barman的归档目录。具体格式可参考官方手册

    1.2.2 基于rsync/ SSH 的备份

    基于rsync/ SSH 的备份是一种传统的基于文件的备份方式。它一般适用于下面的情形。

    1. PostgreSQL服务器版本是8.3、8.4、9.0或9.1
    2. 使用表空间的PostgreSQL服务器版本是9.2或9.3
    3. 增量备份,并行备份和重复数据删除
    4. 备份期间的网络压缩
    5. 更好地控制带宽使用,包括在表空间的基础上

    它的体系结构如下图所示:

     

    在这种情况下,您将需要配置:

    1. 与PostgreSQL的标准连接,用于管理,协调和监视
    2. 用于基础备份操作的SSH连接,rsync会使用它,以允许barman用户在Barman服务器上以用户postgres的身份连接到PostgreSQL服务器
    3. 用于WAL归档的SSH连接,archive_command会使用它,以允许用户postgres 在PostgreSQL服务器以用户barman的身份连接到Barman服务器。

    从PostgreSQL 9.2开始,您可以添加用于WAL流式传输的流复制连接。下图描绘了这种实现:

     

    1.3 实验环境

    实验需要两台服务器,下面是它们的一些基本信息。

    操作系统: CentOS 7.5

    内存: 32G

    CPU: 8个逻辑核

    软件:

    PostgreSQL 11.4

    yum

    python 3.6

    barman 2.11

    需要的python 模块:

    argcomplete-1.12.0

    argh-0.26.2

    psycopg2-2.8.5

    python-dateutil-2.8.1

    setuptools-49.6.0

          

    数据库服务器的IP地址:10.40.239.228

    备份服务器的IP地址:10.40.239.229

    ssh 端口:22,默认值

    postgresql 的运行端口:5432

    postgresql 的bin目录 /opt/postgresql/bin/

    postgresql 的data 目录 /opt/postgresql/data

        注意,barman 要求特定版本操作系统和所依赖的软件。具体要求如附录1所示。

    2    Barman备份环境的搭建

    2.1 安装软件

    2.1.1 数据库服务器上的操作

       1. 安装 rsync

    yum install rsync

    2.1.2 备份服务器上的操作

    下面的操作都使用用户 root 完成。

    1.    安装 epel源  (Extra Packages for Enterprise Linux)
    yum -y install epel-release 
     
    1. 安装 Python 3.6

    yum -y install python3-3.6.8-13.el7.x86_64

    注意,如果你不想指定Python 3的版本,可以换成执行:

    yum -y install python3

    在Python 3安装过程中,setuptools 和 pip 也会被安装。

    1. 安装rsync

    yum -y install rsync

    1. 安装 pgdg 源

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

    1. 安装Barman

    方法1:使用yum 安装barman

    yum –y install barman-2.11-1.rhel7.noarch

    使用yum安装的过程中,会自动安装下面的模块

    python36-argcomplete.x86_64

    python36-argh

    python36-psycopg2

    python36-dateutil

    用 yum 安装完barman后,程序会创建一个操作系统用户 barman,并创建一个文件 /etc/barman.conf,内容是barman的一些全局配置项,一个目录 /etc/barman.d,存放与数据库服务器有关的配置信息。

    方法2:使用源码安装。

    1. SourceForge 上下载barman源码,这里我们下载 barman-2.11.tar.gz。
    2. 解压文件后,进入解压后的目录,使用python3安装它:

    tar -zxvf barman-2.11.tar.gz

    cd ./barman-2.11

    python3 ./setup.py build

    python3 ./setup.py install

    1. 使用pip安装需要的python模块。进入 python3 的安装目录,执行命令如下:

    ./pip install argcomplete -i https://pypi.tuna.tsinghua.edu.cn/simple/

    ./pip install argh -i https://pypi.tuna.tsinghua.edu.cn/simple/

    ./pip install psycopg2 -i https://pypi.tuna.tsinghua.edu.cn/simple/

    ./pip install python-dateutil -i https://pypi.tuna.tsinghua.edu.cn/simple/

       

    1. 在操作系统中创建用户barman

    useradd -m barman -d /var/lib/barman

    1. 将barman 安装包解压后的barman-2.11/barman, 将 文件barman.conf  和 目录barman.d 拷贝到 /etc/ 中。

    cd barman-2.11/barman

    cp barman.conf  /etc/

    cp -R barman.d  /etc/

    2.2 配置

    2.2.1  数据库服务器上的操作

    下面的操作都使用用户 root 完成。

    1.  为用户postgres创建ssh密钥以及授权文件,如果它们不存在。

    su postgres

    cd ~

    ssh-keygen -t rsa

    echo “”>> ./ssh/authorized_key

    随后在barman用户的主目录 /var/lib/pgsql/ 下的目录 .ssh中,会生成私钥文件 id_rsa和 公钥文件 id_rsa.pub。

    1. 把PostgreSQL 的 bin 目录复制到备份服务器的目录 /etc/barman.d/中。可以使用scp。例如,PostgreSQL的bin 的位置是 /opt/postgresql/bin,则可以执行如下命令:

    scp -r /opt/postgresql/bin root@10.40.239.229:/etc/barman.d/

    1. 在数据库中创建用户 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;

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

    listen_addresses = '*'

    wal_level = replica

    max_wal_senders = 10

    archive_mode = off

    小贴士:你可能注意到,这里的配置和开启PostgreSQL原生的连续归档时的配置不同。他们的区别是,对于基于流协议的归档,我们需要保证 archive_mode = off,且不必配置archive_command;而对于PostgreSQL原生的连续归档,我们需要设置archive_mode = on,并配置archive_command。

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

    host      all           barman                   127.0.0.1/32            md5

    host      all           barman                   10.40.239.228/32        md5

    host      all           barman                   10.40.239.229/32        md5

    host      replication    streaming_barman         127.0.0.1/32            md5

    host      replication    streaming_barman         10.40.239.228/32        md5

    host      replication    streaming_barman         10.40.239.229/32        md5

    2.2.2  备份服务器上的操作

    下面的操作都使用用户 barman完成。

    1. 为用户barman创建ssh密钥。

    ssh-keygen -t rsa

    随后在barman用户的主目录 /var/lib/pgsql/ 下的目录 .ssh中,会生成私钥文件 id_rsa和 公钥文件 id_rsa.pub。

    1. 复制用户barman 的公钥文件 id_rsa.pub 中的内容,并将它追加到数据库服务器上

    的用户 postgres 的主目录中的文件 .ssh/authorized_keys 中。这样做的目的是允许barman以用户postgres的身份免密访问数据库服务器

    你可以手动复制此内容,并将它粘贴到数据库服务器上的用户 postgres 的主目录中的文件 .ssh/authorized_keys 末尾。

    你也可以通过下面的命令完成复制。如果使用下面的命令,你需要保证数据库服务器上 postgres用户已经设置了密码。

    ssh-copy-id postgres@10.40.239.228

      

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

    mkdir /var/log/barman

    1. 编辑  /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 https://docs.python.org/3/library/logging.html#levels)

    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 所需的最小备份数量

    1. 配置要备份的数据库的信息。

    5.1  进入 /etc/barman.d, 将 streaming-server.conf-template 复制为 pg.conf,文件名中的“pg”也是此备份任务的名称。

    cd /etc/barman.d

    cp streaming-server.conf-template pg.conf

    5.2 编辑 pg.conf,将 [streaming] 修改为 [pg],这是备份任务的名称,并配置如下参数:

    conninfo =  host=10.40.239.228 port=5432 user=barman dbname=postgres password=barman123

    streaming_conninfo = host=10.40.239.228 port=5432 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 的路径。

    3    使用barman备份和恢复

    3.1 备份

    下面的操作都在备份服务器上进行。

    1.执行barman的命令,创建名为 pg的复制槽

    barman receive-wal --create-slot pg

    2. 在后台不间断地从数据库服务端接收wal日志:

    barman receive-wal pg &

        注意,& 表示在后台执行前面的命令。

    3.检查备份任务pg 的运行状态

    barman check pg

     

    如果各项结果均为 OK,则表示状态正常。

    4. 做一次基础备份

            barman backup pg

    基础备份文件位于 /var/lib/barman/pg/base 中。

    5. 设置常规的定时备份方案

    设置每5分钟检查一次barman 服务的状态,进行一次维护操作:

    echo "*/5 * * * * barman barman cron" >> /etc/crontab

    其中,barman cron这条命令还可以维护barman后台的“稳态”。例如,它可以检查备份文件是否缺失,清理过期的备份文件。

    设置 7天做一次基础备份:

    echo "* * */7 * * barman barman backup pg" /etc/crontab

    3.2 恢复

    1. 在数据库服务器上停止数据库。
    1. 在数据库服务器,将数据库的data目录的属主修改为barman

    chown -R barman.barman ./data

    1. 在barman 服务器上,执行命令恢复数据库。

    3.1 首先查看有哪些基础备份:

        barman list-backup pg

    结果示例如下:

    pg 20200817T120000 - Mon Aug 17 12:00:00 2020 - Size: 515.6 MiB - WAL Size: 64.0 MiB - WAITING_FOR_WALS

    pg 20200810T120000 - Mon Aug 10 12:00:00 2020 - Size: 412.5 MiB - WAL Size: 128.0 MiB

    可以看到,pg有2个备份,分别是20200824T120000和20200817T120000。

    3.2 恢复数据库,我们选择用20200810T120000恢复,恢复到 2020年8月23日 12时。

    barman recover --target-time '2020-08-23 12:00:00' pg 20200810T120000 /opt/postgresql/data/

    可以使用四个互斥选项之一指定恢复目标:

    --target-time TARGET_TIME:指定时间戳

    --target-xid TARGET_XID:指定交易ID

    --target-name TARGET_NAME:指定先前使用pg_create_restore_point(name)函数创建的命名还原点

    --target-immediate:达到一致状态(即基本备份过程的结束)时,恢复将结束

    恢复成功后,会收到提示:

    Your PostgreSQL server has been successfully prepared for recovery!

    1. 在PostgreSQL服务器上,将data的属主改回原来的用户。如果以前的用户是 postgres,那么命令就是:

    chown -R postgres.postgres ./data

    1. 重新启动 PostgreSQL,检查服务是否正常。
    1. 数据库服务器上的postgresql正常后,在备份服务器上

    barman receive-wal --create-slot pg

    1. 在备份服务器上,在从数据库服务端接收wal日志

    barman receive-wal pg &

    附录

    1 不同版本barman 对系统和软件的要求

    Barman 2.4 ~ 2.7

    • Linux/Unix
    • Python 2.6 or 2.7
    • Python modules:
      • argcomplete
      • argh >= 0.21.2 <= 0.26.2
      • argparse (Python 2.6 only)
      • psycopg2 >= 2.4.2
      • python-dateutil <> 2.0
      • setuptools
      • PostgreSQL >= 8.3
      • rsync >= 3.0.4 (对 PostgreSQL >= 9.2 是可选的)

    Barman 2.8 ~ 2.11

    • Linux/Unix
    • Python >= 3.4
    • Python modules:
      • argcomplete
      • argh >= 0.21.2
      • psycopg2 >= 2.4.2
      • python-dateutil
      • setuptools
      • PostgreSQL >= 8.3
      • rsync >= 3.0.4 (对于 PostgreSQL >= 9.2 是可选的)

    2 barman 用户手册

    http://docs.pgbarman.org/release/2.11/

  • 相关阅读:
    Account group in ERP and its mapping relationship with CRM partner group
    错误消息Number not in interval XXX when downloading
    错误消息Form of address 0001 not designated for organization
    Algorithm类介绍(core)
    梯度下降与随机梯度下降
    反思
    绘图: matplotlib核心剖析
    ORB
    SIFT
    Harris角点
  • 原文地址:https://www.cnblogs.com/xianghuaqiang/p/13717013.html
Copyright © 2011-2022 走看看