暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

pgBackRest使用指南(三)

飞象数据 2018-01-22
3290

7、并行备份/恢复

pgBackRest提供并行处理,以提高压缩和传输的性能。可以使用—process-max选项来设置此功能所要使用的进程的数量。backup ⇒ 检查CPU的数量

$ sudo lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    1
       [filtered 17 lines of output]
复制

通常最好不要为备份命令使用25%以上可用的cpu。备份不需要运行那么快,只要它们是定期执行的,尽可能保证备份过程不应该影响数据库性能。恢复命令可以使用所有可用的cpu,因为在恢复期间,在集群被关闭,并且在主机上通常没有其他重要的工作。如果主机包含多个集群,那么在设置恢复并行时应该注意这一点。backup ⇒ 单进程执行备份

$ sudo -u backrest pgbackrest --stanza=demo --type=full backup
复制

backup:/etc/pgbackrest.conf ⇒ 配置pgBackRest 使用多个备份进程

[demo]
db1-host=db-master
db1-path=/var/lib/postgresql/9.4/demo
db1-user=postgres
[global]
process-max=3
repo-path=/var/lib/pgbackrest
retention-full=2
start-fast=y
复制

backup ⇒ 使用多个进程进行备份

$ sudo -u backrest pgbackrest --stanza=demo --type=full backup
复制

backup ⇒ 从演示数据库获取备份信息

$ sudo -u backrest pgbackrest info
stanza: demo
    status: ok
    db (current)
        wal archive min/max (9.4-1): 000000080000000000000026  000000080000000000000027
        full backup: 20170903-213736F
            timestamp start/stop: 2017-09-03 21:37:36  2017-09-03 21:37:43
            wal start/stop: 000000080000000000000026  000000080000000000000026
            database size: 25.6MB, backup size: 25.6MB
            repository size: 3MB, repository backup size: 3MB
        full backup: 20170903-213745F
            timestamp start/stop: 2017-09-03 21:37:45  2017-09-03 21:37:52
            wal start/stop: 000000080000000000000027  000000080000000000000027
            database size: 25.6MB, backup size: 25.6MB
            repository size: 3MB, repository backup size: 3MB
复制

备份的性能应该通过使用多个进程来改进。对于非常小的备份,差异可能并不十分明显,但是随着数据库的大小增加,时间节省也会增加。

8、启动和停止

有时,防止pgBackRest在系统上运行是很有必要的。例如,当主库故障转移到备库,最好同时停止pgBackRest在老主库节点上运行,以防PostgreSQL重启或者服务不能完全停止。同时也要保证pgBackRest在Cron中没有设置。db-master ⇒ 停止pgBackRest服务

$ sudo -u postgres pgbackrest stop
复制

当前,pgBackrest进程不再运行。backup ⇒ 做备份

$ sudo -u backrest pgbackrest --stanza=demo backup
P00  ERROR: [062]: process 'db-master remote' terminated unexpectedly [062]: stop file exists for all stanzas
复制

指定—force选项终止当前正在运行的所有pgBackRest进程。如果pgBackRest工具已经停止了,那么再次停止会有警告信息。db-master ⇒ 再次停止pgBackRest服务

$ sudo -u postgres pgbackrest stop
P00   WARN: stop file already exists for all stanzas
复制

使用start命令启动pgBackRest服务db-master ⇒ 启动pgBackRest服务

$ sudo -u postgres pgbackrest start
复制

也可以停止单个stanza的pgBackRest服务。db-master ⇒ 停止为演示stanza提供的pgBackRest服务

$ sudo -u postgres pgbackrest --stanza=demo stop
复制

现在为指定stanza提供的pgBackRest服务已经停止了backup ⇒ 尝试备份

$ sudo -u backrest pgbackrest --stanza=demo backup
P00  ERROR: [062]: process 'db-master remote' terminated unexpectedly [062]: stop file exists for stanza demo
复制

当启动为单个stanza提供服务的pgBackRest进程时,还必须指定该stanza。db-master ⇒ 为演示stanza启动pgBackRest服务

$ sudo -u postgres pgbackrest --stanza=demo start
复制

9、复制

复制允许从单个主库创建多个PostgreSQL实例的备份。这些备份在平衡读请求和在主库失效时提供冗余是很有用处的。

9.1 热备

热备份是使用WAL归档文件执行复制,备库允许只读操作。新建一台命名为db-standby的新主机用来运行备库。依照安装说明安装pgBackRest工具,依照安装演示集群来进行集群的安装。pgBackRest的配置和主数据库的配置非常相像,除了当到达在流结束时,将启用standby_mode设置使群集保持恢复模式。db-standby:/etc/pgbackrest.conf ⇒ 配置pgBackRest为备份模式

[demo]
db-path=/var/lib/postgresql/9.4/demo
recovery-option=standby_mode=on
[global]
backup-host=backup
复制

现在,备库可以通过restore命令创建。db-standby ⇒ 恢复演示备库实例

$ sudo -u postgres pgbackrest --stanza=demo --delta restore
$ sudo -u postgres cat var/lib/postgresql/9.4/demo/recovery.conf
standby_mode = 'on'
restore_command = '/usr/bin/pgbackrest --stanza=demo archive-get %f "%p"'
复制

注意:standby_mode已经被写入到recovery.conf文件中。在pgBackRest中配置恢复设置意味着recovery.conf不需要备份在其他的任何位置,因为每次恢复的时候pgBackRest都会自动创建它。如果这种行为是首选的话,—type=preserve选项可与还原一起使用,以保留现有的recovery.conf文件。在启动PostgreSQL之前,必须启用hot_standby启用设置,才允许在备库上进行只读连接,否则,连接尝试将被拒绝。db-standby:/etc/postgresql/9.4/demo/postgresql.conf ⇒ 启用hot_standby

hot_standby = on
log_filename = 'postgresql.log'
log_line_prefix = ''
复制

db-standby ⇒ 启动postgres实例

$ sudo pg_ctlcluster 9.4 demo start
复制

数据库日志给出了恢复状态有价值的信息。特别注意”the cluster has entered standby mode and is ready to accept read-only connections”的信息。db-standby ⇒ 检查日志中表示成功的信息

sudo -u postgres cat var/log/postgresql/postgresql-9.4-demo.log
LOG:  could not bind IPv6 socket: Cannot assign requested address
HINT:  Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
LOG:  database system was interrupted; last known up at 2017-09-03 21:37:46 UTC
LOG:  entering standby mode
LOG:  restored log file "00000008.history" from archive
LOG:  incomplete startup packet
LOG:  restored log file "000000080000000000000027" from archive
LOG:  redo starts at 0/27000028
LOG:  consistent recovery state reached at 0/270000F0
LOG:  database system is ready to accept read only connections
复制

测试备库是否正常的一个简单方法就是在主库上创建一张表。db-master ⇒ 主库上创建一张新表

$ sudo -u postgres psql -c " \
       begin; \
       create table replicated_table (message text); \
       insert into replicated_table values ('Important Data'); \
       commit; \
       select * from replicated_table";
    message     
----------------
 Important Data
(1 row)
复制

然后在备库上查询新表db-standby ⇒ 在备库上查询新表

$ sudo -u postgres psql -c "select * from replicated_table;"
ERROR:  relation "replicated_table" does not exist
LINE 1: select * from replicated_table;
复制

由于PostgreSQL正在从归档中提取WAL执行恢复,在备库执行完主库中包含这些更改的WAL之前,在备库数据库中是不能看到变化的。可以手动调用calling pg_switch_xlog()方法来将WAL段推到归档位置(创建了一个新的WAL片段,以包含进一步的更改。)db-master ⇒ 调用pg_switch_xlog()方法

$ sudo -u postgres psql -c "select *, current_timestamp from pg_switch_xlog()";
pg_switch_xlog |             now              
----------------+------------------------------
 0/280199E0  | 2017-09-03 21:38:13.15324+00
(1 row)
复制

在一小段时间的延迟之后,新表将出现在备库上。db-standby ⇒ 新表出现在备库上(可能需要小段延迟)

$ sudo -u postgres psql -c " \
       select *, current_timestamp from replicated_table"
    message     |              now              
----------------+-------------------------------
   Important Data | 2017-09-03 21:38:15.648454+00
(1 row)
复制

检查用于访问存储库的备库配置

$ sudo -u postgres pgbackrest --stanza=demo --log-level-console=info check
P00   INFO: check command begin 1.23: --backup-host=backup --db1-path=/var/lib/postgresql/9.4/demo --log-level-console=info --log-level-stderr=off --no-log-timestamp --stanza=demo
P00   INFO: switch xlog cannot be performed on the standby, all other checks passed successfully
P00   INFO: check command end: completed successfully
复制

9.2 流复制

流复制并不仅仅依赖于在归档文件,而是直接连接到主服务器,并在对主进行修改后立即应用更改。这就导致了主和备用之间的延迟更小。流式复制需要具有复制权限的用户。db-master ⇒ 创建流复制用户

$ sudo -u postgres psql -c " \
       create user replicator password 'jw8s0F4' replication";
CREATE ROLE
复制

必须更新pg_hba.conf文件,以允许备库复制用户可以进行连接。确保将下面的地址替换为实际主库地址。执行reload重新加载pg_hba.conf文件。db-master ⇒ 在pg_hba.conf文件创建复制用户的入口

$ sudo -u postgres sh -c 'echo \
       "host    replication     replicator      172.17.0.5/32           md5" \
       >> etc/postgresql/9.4/demo/pg_hba.conf'
$ sudo pg_ctlcluster 9.4 demo reload
复制

备库需要知道如何与主库连接,因此在pgBackRest中的配置项primary_conninfo需要被配置。db-standby:/etc/pgbackrest.conf ⇒ 设置primary_conninfo

[demo]
db-path=/var/lib/postgresql/9.4/demo
recovery-option=standby_mode=on
recovery-option=primary_conninfo=host=172.17.0.3 port=5432 user=replicator
[global]
backup-host=backup
复制

在primary_conninfo中是可以配置密码的,但是使用.pgpass文件更灵活,更安全。db-standby ⇒ 在.pgpass文件中配置复制用户密码

$ sudo -u postgres sh -c 'echo \
       "172.17.0.3:*:replication:replicator:jw8s0F4" \
       >> home/postgres/.pgpass'
$ sudo -u postgres chmod 600 home/postgres/.pgpass
复制

现在,备库能够通过restore命令创建了。db-standby ⇒ 停止PostgreSQL并且恢复备库实例。

$ sudo pg_ctlcluster 9.4 demo stop
$ sudo -u postgres pgbackrest --stanza=demo --delta restore
$ sudo -u postgres cat var/lib/postgresql/9.4/demo/recovery.conf
primary_conninfo = 'host=172.17.0.3 port=5432 user=replicator'
standby_mode = 'on'
restore_command = '/usr/bin/pgbackrest --stanza=demo archive-get %f "%p"'
复制

db-standby ⇒ 启动PostgreSQL实例

$ sudo pg_ctlcluster 9.4 demo start
复制

在日志将确认流复制已开始。db-standby ⇒ 检查数据库输出日志表示成功的日志消息

$ sudo -u postgres cat var/log/postgresql/postgresql-9.4-demo.log
       [filtered 9 lines of output]
LOG:  database system is ready to accept read only connections
LOG:  restored log file "000000080000000000000028" from archive
LOG:  started streaming WAL from primary at 0/29000000 on timeline 8
复制

现在在主库创建的新表会很快出现在在备库上而无需手动调用pg_switch_xlog()方法。db-master ⇒ 在主库创建新表

sudo -u postgres psql -c " \
       begin; \
       create table stream_table (message text); \
       insert into stream_table values ('Important Data'); \
       commit; \
       select *, current_timestamp from stream_table";
  message     |              now              
----------------+-------------------------------
 Important Data | 2017-09-03 21:38:24.805031+00
(1 row)
复制

db-standby ⇒ 在备库查询表

$ sudo -u postgres psql -c " \
       select *, current_timestamp from stream_table"
    message     |              now              
----------------+-------------------------------
 Important Data | 2017-09-03 21:38:24.970255+00
(1 row)
复制

10、从备库恢复

pgBackRest能够在备库执行备份而不一定非要在主库。在备库备份需要备库启用backup-standby开关。如果配置了多个备库,那么找到的第一个备库将被用来备份。backup:/etc/pgbackrest.conf ⇒ 配置db2-host/db2-user和db2-path选项

[demo]
db1-host=db-master
db1-path=/var/lib/postgresql/9.4/demo
db1-user=postgres
db2-host=db-standby
db2-path=/var/lib/postgresql/9.4/demo
db2-user=postgres
[global]
backup-standby=y
process-max=3
repo-path=/var/lib/pgbackrest
retention-full=2
start-fast=y
复制

尽管绝大多数文件将从备用文件中复制,以减少对主的负载,但是备份过程中,主库和备库都是备份所需的。数据库主机能够被按任意顺序配置,pgBackRest可以自动确定哪个是主服务器,哪个是备用服务器。backup ⇒ 从备库备份演示数据库

$ sudo -u backrest pgbackrest --stanza=demo --log-level-console=detail backup
       [filtered 2 lines of output]
P00   INFO: execute exclusive pg_start_backup() with label "pgBackRest backup started at 2017-09-03 21:38:25": backup begins after the requested immediate checkpoint completes
P00   INFO: backup start archive = 00000008000000000000002A, lsn = 0/2A0000C8
P00   INFO: wait for replay on the standby to reach 0/2A0000C8
P00   INFO: replay on the standby reached 0/2A000168
P01   INFO: backup file db-master:/var/lib/postgresql/9.4/demo/global/pg_control (8KB, 0%) checksum 7107d8a1d83406f0970d2c48f884c82496116baf
P03   INFO: backup file db-standby:/var/lib/postgresql/9.4/demo/base/12139/11889 (344KB, 18%) checksum 62ff1462a0320fa26bcb6e8dcaff1aab87d737ce
P01   INFO: backup file db-master:/var/lib/postgresql/9.4/demo/backup_label (238B, 18%) checksum 44e02c6b4e47bb7612a0ea44a88c6956ed9ce496
P02   INFO: backup file db-standby:/var/lib/postgresql/9.4/demo/base/12139/12007 (392KB, 38%) checksum ab24248d1d73b7a40f1bffb35237bed8b74bc615
P03   INFO: backup file db-standby:/var/lib/postgresql/9.4/demo/base/12139/12010 (232KB, 50%) checksum c020c4f632a4ddaaf1d9d8d235881242b73fd3b7
       [filtered 34 lines of output]
复制

这个增量备份显示,大多数文件都是从db-备用主机复制的,只有少数文件是从db-主主机复制的。pgBackRest创建一个与在主上执行的备份相同的备库备份。它通过启动/停止主库上的备份、拷贝备库主机的复制文件、拷贝主库主机上其余的几个文件来完成备份。这意味着备份中将包含来自主数据库的日志和统计信息。

11、升级PostgreSQL数据库

在将PostgreSQL升级到一个新的主要版本后,必须将所有pgBackRest配置的数据库路径更新为新的数据库位置,并在备份主机上运行节级升级。如果数据库是离线状态,请使用—no-online选项。下面的说明并不是升级PostgreSQL的全面指南,相反,他们将概述升级主机和备用设备的一般过程,目的是演示重新配置pgBackRest所需的步骤。在升级之前进行备份。db-master ⇒ 安装新的PostgreSQL版本

$ sudo apt-get install postgresql-9.5
复制

创建新的数据库实例,如果在数据库安装过程中已经创建了默认的实例,则移除他以避免混淆。db-master ⇒ 删除默认实例,创建新的实例

$ sudo pg_dropcluster 9.5 main
$ sudo -u postgres usr/lib/postgresql/9.5/bin/initdb \
       -D var/lib/postgresql/9.5/demo -k -A peer
$ sudo pg_createcluster 9.5 demo
Configuring already existing cluster (configuration: etc/postgresql/9.5/demo, data: var/lib/postgresql/9.5/demo, owner: 5000:5000)
Ver Cluster Port Status Owner    Data directory               Log file
9.5 demo    5433 down   postgres var/lib/postgresql/9.5/demo var/log/postgresql/postgresql-9.5-demo.log
复制

停用旧的备份实例,因为他将从新的升级后的实例中恢复出来以确保数据库系统ID在主库和备库上是相同的。db-standby ⇒ 停用旧的实例并且删除被创建的默认实例

$ sudo pg_ctlcluster 9.4 demo stop
$ sudo apt-get install postgresql-9.5
$ sudo pg_dropcluster 9.5 main
复制

停用主库的旧实例执行升级操作db-master ⇒ 停用旧实例执行升级操作

$ sudo pg_ctlcluster 9.4 demo stop
$ sudo -u postgres sh -c 'cd var/lib/postgresql && \
       /usr/lib/postgresql/9.5/bin/pg_upgrade \
       --old-bindir=/usr/lib/postgresql/9.4/bin \
       --new-bindir=/usr/lib/postgresql/9.5/bin \
       --old-datadir=/var/lib/postgresql/9.4/demo \
       --new-datadir=/var/lib/postgresql/9.5/demo \
       --old-options=" -c config_file=/etc/postgresql/9.4/demo/postgresql.conf" \
       --new-options=" -c config_file=/etc/postgresql/9.5/demo/postgresql.conf"'
       [filtered 68 lines of output]
Creating script to delete old cluster                       ok
Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade so,
       [filtered 4 lines of output]
复制

配置新实例的配置和端口
db-master:/etc/postgresql/9.5/demo/postgresql.conf ⇒ 配置PostgreSQL

archive_command = 'pgbackrest --stanza=demo archive-push %p'
archive_mode = on
listen_addresses = '*'
log_line_prefix = ''
max_wal_senders = 3
port = 5432
wal_level = hot_standby
复制

更新所有系统上pgBackRest的配置,使其指向新的实例。
db-master:/etc/pgbackrest.conf ⇒  更新db-path

[demo]
db-path=/var/lib/postgresql/9.5/demo
[global]
archive-async=y
backup-host=backup
backup-user=backrest
log-level-file=detail
spool-path=/var/spool/pgbackrest
[global:archive-push]
process-max=2
复制

db-standby:/etc/pgbackrest.conf ⇒ 更新db-path

[demo]
db-path=/var/lib/postgresql/9.5/demo
recovery-option=standby_mode=on
recovery-option=primary_conninfo=host=172.17.0.3 port=5432 user=replicator
[global]
backup-host=backup
复制

backup:/etc/pgbackrest.conf ⇒ 更新db1-path and db2-path,禁用备库备份

[demo]
db1-host=db-master
db1-path=/var/lib/postgresql/9.5/demo
db1-user=postgres
db2-host=db-standby
db2-path=/var/lib/postgresql/9.5/demo
db2-user=postgres
[global]
backup-standby=n
process-max=3
repo-path=/var/lib/pgbackrest
retention-full=2
start-fast=y
复制

db-master ⇒ 拷贝hba文件

$ sudo cp /etc/postgresql/9.4/demo/pg_hba.conf \
       /etc/postgresql/9.5/demo/pg_hba.conf
复制

在实例启动之前,必须在pgBackRest存储所在的服务器上运行stanza-upgrade命令。
backup ⇒ 升级stanza

sudo -u backrest pgbackrest --stanza=demo --no-online \
       --log-level-console=info stanza-upgrade
P00   INFO: stanza-upgrade command begin 1.23: --no-backup-standby --db1-host=db-primary --db1-path=/var/lib/postgresql/9.5/demo --db1-user=postgres --db2-host=db-standby --db2-path=/var/lib/postgresql/9.5/demo --db2-user=postgres --log-level-console=info --no-log-timestamp --no-online --repo-path=/var/lib/pgbackrest --stanza=demo
P00   INFO: stanza-upgrade command end: completed successfully
复制

启动新的群集并确认它已成功安装。
db-primary ⇒ 启动新实例

$ sudo pg_ctlcluster 9.5 demo start
复制

使用check命令验证数据库配置。备份主机上关于从库宕机是正常的,可以被忽略。
db-primary ⇒ 检查配置

$ sudo -u postgres pg_lsclusters
Ver Cluster Port Status Owner    Data directory               Log file
9.4 demo    5432 down   postgres /var/lib/postgresql/9.4/demo /var/log/postgresql/postgresql-9.4-demo.log
9.5 demo    5432 online postgres /var/lib/postgresql/9.5/demo /var/log/postgresql/postgresql-9.5-demo.log
$ sudo -u postgres pgbackrest --stanza=demo check
复制

backup ⇒ 检查配置

$ sudo -u backrest pgbackrest --stanza=demo check
P00   WARN: [056]: raised on 'db-standby remote' host: could not connect to server: No such file or directory
                Is the server running locally and accepting
                connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
复制

移除旧集群
db-primary ⇒ 移除旧集群

$ sudo pg_dropcluster 9.4 demo
复制

在新群集上运行一个完整的备份,然后从备份恢复从库。如果请求incr或diff,则备份类型将自动更改为全备份。
backup ⇒ 运行一个全备份

$ sudo -u backrest pgbackrest --stanza=demo --type=full backup
复制

在从服务器上安装postgreSQL二进制文件,并创建实例
db-standby ⇒ 移除一个旧实例并且初始化一个新的

$ sudo pg_dropcluster 9.4 demo
$ sudo -u postgres /usr/lib/postgresql/9.5/bin/initdb \
       -D /var/lib/postgresql/9.5/demo -k -A peer
$ sudo pg_createcluster 9.5 demo
Configuring already existing cluster (configuration: /etc/postgresql/9.5/demo, data: /var/lib/postgresql/9.5/demo, owner: 5000:5000)
Ver Cluster Port Status Owner    Data directory               Log file
9.5 demo    5432 down   postgres /var/lib/postgresql/9.5/demo /var/log/postgresql/postgresql-9.5-demo.log
复制

db-standby ⇒ 恢复演示从库实例

$ sudo -u postgres pgbackrest --stanza=demo --delta restore
复制

db-standby:/etc/postgresql/9.5/demo/postgresql.conf ⇒ 配置PostgreSQL

hot_standby = on
复制

db-standby ⇒ 启动PostgreSQL

$ sudo pg_ctlcluster 9.5 demo start
复制

现在可以启用从库备份知道从库恢复完成。
backup:/etc/pgbackrest.conf ⇒ 再次启用从库备份

[demo]
db1-host=db-primary
db1-path=/var/lib/postgresql/9.5/demo
db1-user=postgres
db2-host=db-standby
db2-path=/var/lib/postgresql/9.5/demo
db2-user=postgres
[global]
backup-standby=y
process-max=3
repo-path=/var/lib/pgbackrest
retention-full=2
start-fast=y
复制






扫码关注了解更多






文章转载自飞象数据,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论