pghoard, PostgreSQL备份和恢复服务

分享于 

29分钟阅读

GitHub

  繁體 雙語
PostgreSQL backup and restore service
  • 源代码名称:pghoard
  • 源代码网址:http://www.github.com/ohmu/pghoard
  • pghoard源代码文档
  • pghoard源代码下载
  • Git URL:
    git://www.github.com/ohmu/pghoard.git
    Git Clone代码到本地:
    git clone http://www.github.com/ohmu/pghoard
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/ohmu/pghoard
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    

    PGHoard BuildStatus

    pghoard 是用于云对象存储的PostgreSQL备份守护进程和恢复工具。

    功能:

    • 自动周期 basebackups
    • 自动事务日志( mre/xlog ) 备份( 使用 pg_receivexlogarchive_command 或者实验PG本机复制协议支持 walreceiver )
    • 云对象存储支持( AWS,谷歌云,OpenStack,Azure,Ceph )
    • 从对象存储,压缩和加密直接备份恢复
    • Point-in-time-recovery ( PITR )
    • 从对象存储备份初始化新的备用备份,自动配置为复制热备份

    故障恢复和监视:

    • 在临时对象存储连接问题上重新尝试传输
    • 在上传( 备份) 之前和下载( 还原) 之前验证WAL文件头,这样,PostgreSQL回收的比如 文件就会被忽略
    • 自动历史记录清理( 备份和相关的文件早于N 天)
    • "同步同步"工具,用于检测WAL备份流中的孔并修复它们
    • "清除cleanup工具从归档文件中删除过时的ont文件
    • 保存在磁盘上文件中更新的统计信息( 用于监视工具)
    • 在磁盘上创建警报文件( 用于监视工具)

    性能:

    • 并行压缩和加密
    • 恢复时恢复

    概述

    在每次复制( PITR ) 时,它包含一个数据库和更改,然后进入可以重播到WAL日志文件get到所需复制点。

    PGHoard支持多种操作模式。 基本模式有一个单独的备份计算机,pghoard 可以简单地与 pg_receivexlog 连接到数据库中。 另一个模型是使用 pghoard_postgres_command 作为 PostgreSQL archive_command。 还有实验支持PGHoard使用实验的walreceiver 模式使用sql的本机复制协议。

    使用这两种操作模式,PGHoard使用针对数据库运行的pg_basebackup 创建周期性 basebackups。

    为了确保好的压缩速度和相对较小的备份大小,前提日志( 宋体) 和basebackups是用快速( 默认值) 或者 LZMA (。可以配置,默认级别为 0 ) 压缩的。 对于性能关键应用程序,建议测试这两种压缩算法,以找到特定用例的最适合的交易: snappy要快得多,但压缩文件。

    可以选择PGHoard在rest中加密备份的数据。 每个单独的文件都经过加密并用特定的。 文件特定密钥包含在备份中,并使用主 RSA private/public 密钥对对它的进行加密。

    PGHoard支持从本地 文件系统 或者从各种对象存储( AWS。Azure。Ceph。谷歌云和 OpenStack Swift ) 备份和恢复。

    如果只有一个数据库计算机,则强烈建议使用一个对象存储服务,即使主机运行 PGHoard。

    要求

    PGHoard可以备份和恢复 9.2版上的版本。 守护进程在 python 中实现,适用于CPython版本 3.3或者更高版本。 需要以下 python 模块:

    可选要求包括:

    • 用于微软Azure对象存储的 Azure
    • AWS botocore ( 或者 Ceph-S3 ) 对象存储的
    • Google云对象存储的 google-api-client插件
    • 用于备份加密和解密( 版本 0.8或者更高要求的版本)的加密
    • 快速压缩和解压缩的
    • 用于systemd集成的systemd
    • 用于 OpenStack Swift 对象存储的swiftclient

    开发和测试PGHoard还需要以下实用程序: flake8pylint和pytest。

    PGHoard已经在现代 Linux x86-64系统上开发和测试,但是应该在其他提供所需模块的平台上进行。

    建筑

    要为你的发行版构建安装包,请转到 PGHoard git checkout的root 目录并运行:

    Debian:

    make deb

    这将在 git checkout的父目录中生成一个 .deb 包。

    Fedora:

    make rpm

    这将产生一个通常为 rpm/RPMS/noarch/.rpm 包。

    python/其他:

    python setup.py bdist_egg

    这将在同一文件夹中的dist目录中生成一个egg文件。

    安装

    要安装它,运行为 root:

    Debian:

    dpkg -i.. /pghoard*.deb

    Fedora:

    dnf install rpm/RPMS/noarch/*

    在Linux系统上,建议只在 systemd 下运行 pghoard:

    systemctl enable pghoard.service

    最后,在设置部分之后,你可以运行:

    systemctl start pghoard.service

    python/其他:

    easy_install dist/pghoard-1.7.0-py3.6.egg

    在没有 systemd的系统上,建议在主管或者其他类似的过程控制系统下运行 pghoard

    设置

    之后,你需要为安装创建一个合适的JSON配置文件。

    确保PostgreSQL被配置为允许WAL存档和检索。 postgresql.conf 应该将 wal_level 设置为 archive 或者更高,并且 max_wal_senders 设置为至少 1 ( archive_command 模式) 或者至少 2 (。pg_receivexlogwalreceiver 模式),例如:

    wal_level = archive
    max_wal_senders = 4

    请注意,更改 wal_level 或者 max_wal_senders 设置需要重新启动 PostgreSQL。

    pghoard 创建一个合适的PostgreSQL用户帐户:

    CREATE USER pghoard PASSWORD 'putyourpasswordhere' REPLICATION;

    编辑本地 pg_hba.conf,允许从主节点和备用节点访问新创建的帐户到 replication 数据库。 例如:

    # TYPE DATABASE USER ADDRESS METHOD
    host replication pghoard 127.0.0.1/32 md5

    编辑后,请用以下两种方法重新加载配置:

    SELECT pg_reload_conf();

    或者直接将 SIGHUP 发送到 PostgreSQL postmaster 进程。

    将创建的用户帐户和主/备用地址填入配置文件 pghoard.jsonbackup_sites

    如果希望备份到云中,请将可能的对象存储用户凭证填入配置文件 pghoard.json 中的配置文件。

    现在将相同的pghoard.json 配置复制到备用 node,如果有。

    其他可能的配置设置在本文的配置键部分中更详细地介绍。

    • 如果现在已经正确设置了一切,pghoard 现在应该已经准备好开始了。

    备份你的数据库

    PostgreSQL备份包括完整的数据库备份。basebackups 以及前向日志和相关元数据,WAL。 basebackups和WAL都需要创建和还原一致的数据库。

    若要使用PGHoard启用备份,pghoard 守护进程必须在本地运行。 守护进程将定期将数据库文件的完整basebackups带到对象存储区。 此外,必须正确设置PGHoard和PostgreSQL以归档数据库。 有两种方法可以实现这里目的:

    默认选项是使用 pghoard 在本地运行 pghoard 守护进程,并在 postgresql.conf 中输入以下配置键:

    archive_mode = on
    archive_command = pghoard_postgres_command --mode archive --site default --xlog %f

    这指示PostgreSQL在新的WAL段就绪时调用 pghoard_postgres_command。 命令指示PGHoard将段存储在它的对象存储区。

    另一种选择是设置 PGHoard,直接从PostgreSQL读取WAL流。 要执行这里操作,必须在 postgresql.conf 中禁用 archive_mode,并且 pghoard.json 必须在相关站点中将 active_backup_mode 设置为 pg_receivexlog,例如:

    {
    "backup_sites": {
    "default": {
    "active_backup_mode":"pg_receivexlog",
    . . .
     },
     },
    . . .
     }

    要注意设置,必须始终设置 postgresql.conf 设置 wal_levelarchivehot_standby 或者 logical,必须将 2连接设置为 2,如果有任何流副本,则必须设置。

    pghoard 运行时,读取 json_state_file_path的JSON状态文件 pghoard_state.json 可能很有用。 JSON状态文件是人类可读的,它用来描述活动的pghoard 备份的当前状态。

    还原数据库

    你可以通过运行以下命令列出数据库 basebackups:

    pghoard_restore list-basebackups --config/var/lib/pghoard/pghoard.json
    Basebackup Size Start time Metadata
    ------------------------------- ---- -------------------- ------------
    default/basebackup/2016-04-12_0 8 MB 2016-04-12T07:31:27Z {'original-file-size': '48060928',
     'start-wal-segment': '000000010000000000000012',
     'compression-algorithm': 'snappy'}

    如果希望还原到最新的点,可以运行以下命令获取所需的basebackup:

    pghoard_restore get-basebackup --config/var/lib/pghoard/pghoard.json 
     --target-dir/var/lib/pgsql/9.5/data --restore-to-master
    Basebackup complete.
    You can start PostgreSQL by running pg_ctl -D foo start
    On systemd based systems you can run systemctl start postgresql
    On SYSV Init based systems you can run/etc/init.d/postgresql start

    注意,target-dir 需要是空的或者非存在的目录,PGHoard将自动创建它。

    之后,我们继续运行PGHoard服务器进程和PostgreSQL服务器正常运行(。在基于systemd的系统上,假设使用 9.5 ):

    systemctl start pghoard
    systemctl start postgresql-9.5

    这将使PostgreSQL开始恢复到最新的时间点。 必须在启动PostgreSQL服务器之前运行 PGHoard。 要查看其他可能的恢复选项,请运行:

    pghoard_restore --help

    命令

    正确安装后,有六个命令可用:

    pghoard 是应该在服务管理器( 如 systemd 或者 supervisord ) 下运行的主守护进程。 它处理已经配置站点的备份。

    pghoard_restore 是 命令行 工具,可以用于从 pghoard 本身或者受支持的对象存储库中恢复以前的数据库备份。 pghoard_restore 还可以配置 recovery.conf 以将 pghoard_postgres_command 用作 recovery.confrestore_command

    pghoard_archive_cleanup 可以用于清除对象存储区中任何孤立的ont文件。 配置的basebackups数量超过( 配置密钥 basebackup_count ) 之后,pghoard 删除最旧的basebackup和与它的关联的所有 url。 暂时对象存储失败和它的他中断可以能导致,删除孤立的,文件,可以在这里工具中删除。

    pghoard_archive_sync 可以用于查看是否应该存档任何本地文件,但尚未。 另一种usecase是确定WAL归档文件中所需文件是否存在间隙,到最新的basebackup文件的最新文件。

    pghoard_create_keys 可以用于在 pghoard 配置格式中生成和输出加密密钥。

    pghoard_postgres_command 是一个 命令行 工具,可以用作PostgreSQL或者 recovery_commandarchive_command。 它与运行 web server的pghoard 通信,让它知道需要压缩。加密和存储在对象存储( 在归档模式中) 中( 在还原模式下)。

    配置键

    active ( 默认 true )

    可以在每个 backup_site 级别上设置为 false 以禁用新备份并停止删除旧的备份。

    active_backup_mode ( 默认 pg_receivexlog )

    可以是 pg_receivexlog 或者 archive_command。 如果设置为 pg_receivexlogpghoard 将启动一个 pg_receivexlog 进程,以针对数据库服务器运行。 如果设置了 archive_command,我们依赖于用户在 postgresql.conf 中设置正确的archive_command。 你还可以将它的设置为实验 walreceiver 模式,这样pghoard就会通过复制协议与PostgreSQL直接通信。 ( 请注意需要未发行版本的psycopg2库)

    alert_file_dir ( 如果设置为 os.getcwd(),则为默认 backup_location )

    创建复制警告和故障转移警报文件的目录。

    backup_location ( 无默认值)

    pghoard 将为本地状态数据和实际备份创建它的内部数据结构的地方。 ( 如果未使用对象存储)

    backup_sites ( 默认 {} )

    这个对象包含不同的PostgreSQL集群( 这里叫 sites )的名称和配置,从这里获取备份。 以下列出了站点的配置键。

    • compression wal/basebackup压缩参数
    • 如果可用,algorithm 默认 "snappy",否则为 "lzma"
    • "lzma" 压缩的level 默认 "0" 压缩级别
    • thread_count ( 默认最大( cpu_count,5 ) ) 并行压缩线程数

    http_address ( 默认 "127.0.0.1" )

    将 PGHoard HTTP服务器绑定到的地址。 设置为空字符串以侦听所有可用的地址。

    http_port ( 默认 16000 )

    HTTP web server端口用于存档命令,如果不使用对象存储,则用于获取 basebackups/of还原时间。

    json_state_file_path ( 默认值 "/var/lib/pghoard/pghoard_state.json" )

    描述 pghoard 进程状态的JSON状态文件的位置。

    log_level ( 默认 "INFO" )

    确定 pghoard的日志级别。

    maintenance_mode_file ( 默认值 "/var/lib/pghoard/maintenance_mode_file" )

    如果这里位置存在文件,则不会启动新的备份操作。

    restore_prefetch ( 默认 transfer.thread_count )

    执行归档恢复时要预取的文件数。 默认的是传输代理线程的数量,尝试利用它们。

    statsd ( 默认值:已经禁用)

    支持向支持Telegraf或者DataDog语法的statsd守护进程发送标记。

    值是一个JSON对象:

    {
    "host":"<statsd address>",
    "port": <statsd port>,
    "format":"<statsd message format>",
    "tags": {
    "<tag>":"<value>"
     }
    }

    format ( 默认值:"telegraf" )

    确定statsd消息格式。支持以下格式:

    可以使用 tags 设置为度量输入可选的标记值。

    syslog ( 默认 false )

    确定是否应打开系统日志日志记录。

    syslog_address ( 默认 "/dev/log" )

    确定日志记录中使用的syslog地址( 要求syslog也是 true )

    syslog_facility ( 默认 "local2" )

    确定系统日志日志设备( 要求syslog也是 true )

    • transfer wal/basebackup传输参数
    • thread_count ( 默认最大( cpu_count,5 ) ) 并行上传/下载的数量

    upload_retries_warning_limit ( 默认 3 )

    在多次上传单个文件失败后,创建警报文件。

    备份站点配置

    下列选项控制每个备份站点的行为。 备份站点指的是单独的PostgreSQL安装("集群"在PostgreSQL术语中),从这里获取备份。

    basebackup_chunks_in_progress ( 默认 5 )

    在磁盘上同时有多少个basebackup块可以同时使用。 有关块大小配置,请参见 basebackup_chunk_size

    basebackup_chunk_size ( 默认 2147483648 )

    在多大的备份块中使用 local-tar basebackup。 成功备份所需的磁盘空间是这个变量乘以 basebackup_chunks_in_progress

    basebackup_count ( 默认 2 )

    为了恢复目的,应该保留多少 basebackups。 越多的磁盘空间将被使用。

    basebackup_interval_hours ( 默认 24 )

    群集的新basebackup的频率。 间隔越短,恢复的速度越快,但需要从basebackup接收的服务器的cpu/io使用率越大。 如果设置为空值 basebackups,则不会自动执行任何操作。

    basebackup_mode ( 默认 "basic" )

    创建basebackups的方式。 默认模式,basic 运行 pg_basebackup 并等待它在压缩之前在磁盘上写入未压缩的tar文件,然后选择加密。 备用模式 pipe 直接从 pg_basebackup 传输数据到pghoard和加密处理,减少所需的临时磁盘空间量。

    basic 模式和 pipe 模式都不支持多个表空间。

    如果在与数据库相同的主机上运行 pghoard,将 basebackup_mode 设置为 local-tar 将避免完全使用 pg_basebackup。 PGHoard直接从 $PGDATA 读取文件,并压缩并选择加密它们。 这里模式允许备份用户表空间。

    注意,local-tar 备份模式不能在 9.6之前的副本服务器上使用,除非安装了pgespresso扩展。

    encryption_key_id ( 无默认值)

    指定存储加密备份时使用的加密密钥。 如果指定了这个配置指令,还必须定义用于存储的public 密钥以及用于检索存储备份的private 键。 这些键是用 encryption_keys 字典指定的。

    encryption_keys ( 无默认值)

    此键是密钥标识到密钥的映射。 依次从 publicprivate 映射到编码的RSA public 和 private 密钥。 需要为存储备份指定 public 密钥。 private 密钥需要在还原加密备份时就绪。

    你可以使用 pghoard_create_keyspghoard 配置格式中生成和输出加密密钥。

    object_storage ( 无默认值)

    在特定站点下的backup_sites 中配置。 如果设置,它必须是描述远程对象存储的对象。 对象必须包含描述存储类型的键 storage_type,其他键和值是特定于存储类型的。

    支持以下对象存储类型:

    • local 对本地目录进行备份,参见 pghoard-local-minimal.json。 需要的密钥:
    • 备份目标( 本地) 存储目录路径的directory
    • 用于Google云存储的google,需要的配置密钥:
    • 包含Google存储项目标识符的project_id
    • 要存储文件的bucket_name 存储桶
    • Google JSON凭证文件路径的credential_file
    • s3 Amazon Web Services,必需的配置键:
    • AWS访问密钥id的aws_access_key_id
    • AWS密钥访问密钥的aws_secret_access_key
    • bucket的region S3区域
    • S3 bucket的bucket_name NAME

    Amazon Web Services S3的可选密钥:

    • encrypted 如果是 true,则使用服务器端加密。 默认值为 false。
    • 对于其他S3兼容服务( 如 Ceph ),s3 需要配置密钥:
    • AWS访问密钥id的aws_access_key_id
    • AWS密钥访问密钥的aws_secret_access_key
    • S3 bucket的bucket_name NAME
    • host 用于替代非AWS-S3实现的主机
    • 用于替代非AWS-S3实现端口的port
    • 用于覆盖非AWS-S3实现的https需求的is_secure
    • 用于 Microsoft Azure存储的azure,需要的配置密钥:
    • Azure存储帐户的NAME的account_name
    • Azure存储帐户的秘密密钥的account_key
    • 用于存储对象的Azure存储容器的NAME的bucket_name
    • azure_cloud Azure云选择器,"public" ( 默认值) 或者 "germany"
    • 用于 OpenStack Swift的swift,需要的配置密钥:
    • Swift 用户('subuser ( 在 Ceph RadosGW中)的user
    • Swift secret_key的key
    • 用于 Swift 身份验证URL的auth_url
    • 数据容器的container_name NAME
    • Swift的可选配置密钥:
    • auth_version2.0 ( 默认值) 或者 3.0,使用 Rados GW的1.0
    • segment_size - 默认为 1024**3 ( 1千兆字节)。 大于这里对象的对象将被分割为上载的多个段。 许多 Swift 安装需要一个大文件( 通常 5 gb ) 来进行分割。
    • tenant_name
    • region_name
    • user_id - 用于 auth_version 3.0
    • user_domain_id - 用于 auth_version 3.0
    • user_domain_name - 用于 auth_version 3.0
    • tenant_id - 用于 auth_version 3.0
    • project_id - 用于 auth_version 3.0
    • project_name - 用于 auth_version 3.0
    • project_domain_id - 用于 auth_version 3.0
    • project_domain_name - 用于 auth_version 3.0
    • service_type - 用于 auth_version 3.0
    • endpoint_type - 用于 auth_version 3.0

    nodes ( 无默认值)

    从其中获取备份的一个或者多个节点的array。 一个 node 可以被描述为一个libpq键的对象: 值连接信息对或者libpq连接字符串或者 postgres:// 连接 uri。

    pg_bin_directory ( 缺省:查找来自已知目录的二进制文件)

    查找 pg_basebackuppg_receivexlog 命令的站点特定选项,与站点版本中的给定备份。 如果未提供值,PGHoard将attepmt查找来自各种已知位置的匹配二进制文件。 如果 pg_data_directory 设置并指向有效的数据目录,查找将限制在给定数据目录中包含的版本。

    pg_data_directory ( 无默认值)

    使用 local-tarbasebackup_mode 时使用这里方法。 数据目录必须指向postgresql的$PGDATA,并且 pghoard 守护进程必须可以读取它。

    prefix ( 默认:站点名称)

    这里站点相关的所有备份的路径前缀。 默认为站点的NAME。

    电子邮件通知文件

    当需要人工干预的错误条件解决时,就创建警报文件。 建议将这些文件的存在添加到警报系统中。

    authentication_error

    至少一个PostgreSQL连接的身份验证中存在一个问题。 这通常表示错误的用户名和/或者密码。

    configuration_error

    至少一个PostgreSQL连接的身份验证中存在一个问题。 这通常表示缺少 pg_hba.conf 条目或者 postgresql.conf. 中不兼容的设置

    upload_retries_warning

    上载文件失败次数超过 upload_retries_warning_limit。 需要人工干预才能找出原因并在情况被修复后删除警报。

    version_mismatch_error

    本地PostgreSQL客户端版本 pg_basebackup 或者 pg_receivexlog 与服务器PostgreSQL版本不存在 MATCH。 你需要将它们更新为同一版本级别。

    version_unsupported_error

    不支持PostgreSQL版本。

    许可证

    PGHoard是在Apache许可下许可的,版本 2.0. 完整许可文本在 LICENSE 文件和 http://www.apache.org/licenses/LICENSE-2.0.txt 文件中可用。

    Credits

    PGHoard was//> 为 Aiven云数据库创建,现在由syb有限公司维护,hackers hackers>。

    最近的贡献者是GitHub项目页面的列表,https://github.com/ohmu/pghoard/graphs/contributors

    联系人

    Bug 报告和补丁非常欢迎,请将它们发布为GitHub问题,并在 https://github.com/ohmu/pghoard 请求请求。 任何可能的漏洞或者其他严重问题都应直接报告给维护者的<opensource@ohmu.fi>。

    版权

    版权所有( C ) 2015 Ohmu有限公司


    服务  REST  pos  POST  备份  postgres  
    相关文章