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

【译】postgresql 扩展工具 增量备份扩展 ptrack

原创 贾勇智 2022-03-23
2298

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 使用限制

  1. ptrack要求wal_level >= 'replica'. 否则如果发生崩溃恢复,可能会丢失对某些更改的跟踪,只在检查点时间持久地刷新ptrackmap。
  2. 唯一一个完全支持ptrack备份恢复工具是pg_probackup
  3. ptrack.map_size,只能在 postmaster 启动时调整。此外,您将丢失所有跟踪更改,因此建议在维护窗口中执行此操作,并在此操作中进行完整备份。
  4. 需要最多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。

最后修改时间:2022-03-23 23:45:54
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论