1 增量备份扩展 ptrack
1.1 介绍
Ptrack 是 PostgreSQL 的块级增量备份引擎。您可以通过 pg_probackup PostgreSQL 备份和恢复管理器有效地使用 ptrack 引擎进行增量备份。
它旨在允许误报(即块/页面在 ptrack 映射中被标记,但实际上并未更改),但绝不允许误报(即丢失任何 PGDATA 更改,提示位除外)。
目前,ptrack 代码库分为小型 PostgreSQL 核心补丁和扩展。所有公共 SQL API 方法和主引擎都放在 ptrack 扩展中,而核心补丁仅包含某些挂钩并修改二进制实用程序以忽略 ptrack.map.* 文件。
此扩展与 PostgreSQL 11、12、13、14 兼容。
1.2 安装
下载ptrack源包
git clone https://github.com/postgrespro/ptrack.git
下载postgresql源包
git clone https://github.com/postgres/postgres.git -b REL_14_STABLE && cd postgres
应用PostgreSQL核心补丁
git apply -3 ../ptrack/patches/REL_14_STABLE-ptrack-core.diff
编译安装postgresql
gmake world
gmake install-world
设置ptrack.map_size参数
ptrack.map_size参数默认为0 ,单位:MB,0表示ptrack功能关闭,建议将此参数设置成PG数据库大小的1/1000。
如需禁用ptrack或清理ptrack数据,将ptrack.map_size设置为0
echo "shared_preload_libraries='ptrack'">> /pgdata/14/data/postgresql.conf
echo "ptrack.map_size=64">>/pgdata/14/data/postgresql.conf
root编译安装ptrack扩展,安装完成,需要重启postgres,reload 不生效。
USE_PGXS=1 make -C /root/ptrack/ install
登陆重启后的postgres,创建ptrack扩展
CREATE EXTENSION ptrack;
ptrack相关SQL API
ptrack_version() :返回ptrack 版本
ptrack_init_lsn() :返回最后一个Ptrack映射初始化的LSN。
ptrack_get_pagemapset(start_lsn pg_lsn) :返回自指定start_lsn始具有多个更改块及其位图的一组更改的数据文件。
ptrack_get_change_stat(start_lsn pg_lsn) :返回自指定START_LSN以来更改统计(文件数,页数和大小MB)。
例子:
postgres=# select ptrack_version();
ptrack_version
----------------
2.3
(1 row)
postgres=# select ptrack_init_lsn();
ptrack_init_lsn
-----------------
0/170C430
(1 row)
postgres=# select * from ptrack_get_pagemapset('0/170C430');
path | pagecount | pagemap
---------------------+-----------+------------------------------------------
base/13892/1255 | 4 | \x00001600010000000000000000
base/13892/1255_fsm | 1 | \x0400000000000000000000
base/13892/1247 | 2 | \x006000000000000000000000
base/13892/1247_fsm | 3 | \x0700000000000000000000
base/13892/1249 | 1 | \x00000100000000000000000000
base/13892/1259 | 1 | \x0100000000000000000000
base/13892/2609 | 1 | \x000000002000000000000000000000
base/13892/2608 | 1 | \x00000000000000000100000000000000000000
base/13892/3079 | 1 | \x0100000000000000000000
base/13892/2690 | 1 | \x000400000000000000000000
base/13892/2691 | 1 | \x00008000000000000000000000
base/13892/2703 | 1 | \x0400000000000000000000
base/13892/2704 | 2 | \x1400000000000000000000
base/13892/2658 | 1 | \x004000000000000000000000
base/13892/2659 | 1 | \x000200000000000000000000
base/13892/2662 | 1 | \x0400000000000000000000
base/13892/2663 | 1 | \x0400000000000000000000
base/13892/3455 | 1 | \x1000000000000000000000
base/13892/2675 | 1 | \x008000000000000000000000
base/13892/2673 | 3 | \x000000002006000000000000000000
base/13892/2674 | 4 | \x00000000001015000000000000000000
base/13892/3080 | 1 | \x0200000000000000000000
base/13892/3081 | 1 | \x0200000000000000000000
base/13892/1247_vm | 1 | \x0100000000000000000000
base/13892/1249_vm | 1 | \x0100000000000000000000
base/13892/1255_vm | 1 | \x0100000000000000000000
base/13892/1259_vm | 1 | \x0100000000000000000000
base/13892/16394 | 1 | \x0100000000000000000000
(28 rows)
postgres=# select * from ptrack_get_change_stat('0/170C430');
files | pages | size, MB
-------+-------+------------------------
28 | 40 | 0.31250000000000000000
(1 row)
1.3 使用限制
- ptrack要求
wal_level >= 'replica'. 否则如果发生崩溃恢复,可能会丢失对某些更改的跟踪,只在检查点时间持久地刷新ptrackmap。 - 唯一一个完全支持ptrack备份恢复工具是pg_probackup
- ptrack.map_size,只能在 postmaster 启动时调整。此外,您将丢失所有跟踪更改,因此建议在维护窗口中执行此操作,并在此操作中进行完整备份。
- 需要最多
ptrack.map_size * 2额外的磁盘空间,因为ptrack出于持久性目的使用额外的临时文件。有关详细信息,请参阅架构部分。
1.4 基准
简而言之,对于数十到数百 GB 大小的数据库,在 TPS 上使用 ptrack 的开销通常不超过百分之几(1-3%),而备份时间随着备份大小的系数线性缩减 1.这意味着对只有 20% 更改页面的数据库进行增量 ptrack 备份将比完整备份快 5 倍。更多细节在这里。
1.5 原理
我们在 ptrack 中使用单个共享哈希表。由于地图的固定大小,可能会出现误报(当某些块被标记为已更改而没有实际修改时),但不会出现误报结果。但是,通过设置足够高的 ptrack.map_size 可以完全消除这些误报。
所有读/写都是使用 uint64 条目上的原子操作进行的,因此在正常的 PostgreSQL 操作期间映射是完全无锁的。因为我们不使用锁进行读/写访问,所以 ptrack 自上次检查点以来保持地图(ptrack.map)完好无损,并使用最多 1 个额外的临时文件:
临时文件 ptrack.map.tmp 在检查点期间持久替换 ptrack.map。
映射在检查点结束时以原子方式逐块写入磁盘,涉及 CRC32 校验和计算,该计算在崩溃恢复或重启后重新读取的下一个整个映射上进行检查。
为了在 ptrack_get_pagemapset() 中收集修改块的整个变更集,我们遍历整个 PGDATA (base//, global/, pg_tblspc//*) 并使用 map 验证每个关系的每个块自是否指定了 LSN。




