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
复制
扫码关注了解更多