Greenplum 官方提供备份恢复工具:gpbackup、gprestore,可以对 Greenplum 集群进行逻辑备份恢复。同时可以使用pg物理备份工具pg_basebackup对master 以及所有 primary segment 分别单独备份恢复。
1. 测试环境
集群架构:
结构 | 机器IP | 部署 | 使用硬盘 |
---|---|---|---|
1 Master + 2 Segment Host | 10.37.2.180(Master) 10.37.2.181(Seg) 10.37.2.182(Seg) | 12 segment | SSD |
机器配置:
机器IP | CPU(逻辑核数) | 内存(RAM) | 硬盘 | 操作系统 |
---|---|---|---|---|
10.37.2.180 | 32C | 128G | HDD+SSD | CentOS7.3 |
10.37.2.181 | 32C | 128G | HDD+SSD | CentOS7.3 |
10.37.2.182 | 32C | 128G | HDD+SSD | CentOS7.3 |
测试库详情:
库大小 | 表数量 | 索引数量 | 表数据大小 |
---|---|---|---|
全量:672G | 41个 | 90个 | 317G |
全量+增量:888G(增量:216G) | 41个 | 90个 | 369G(增量:52G) |
2. 逻辑备份
2.1 全量备份
备份命令(备份详情请参考附录1):
gpbackup --leaf-partition-data --dbname 库名 --backup-dir 备份目录 --jobs 并发数
恢复命令:
gprestore -backup-dir 备份目录 --create-db --timestamp 备份时间戳
耗时信息:
源库大小 | 备份文件大小 | 备份(1并发) | 备份(2并发) | 恢复(1并发) | 恢复(2并发) |
---|---|---|---|---|---|
672G | 119G | 54m4s | 30m19s | 4h29m3s | 2h31m18s |
注:2并发时已达测试环境千兆网络瓶颈,故不再增加。
2.2 增量备份
逻辑备份支持增量备份,只需在备份命令中指定 –incremental 参数即可,增量备份仅支持 append only 表,heap 表即使指定增量参数,也进行全量备份。
备份命令:
gpbackup --leaf-partition-data --dbname 库名 --backup-dir 备份目录 --jobs 并发数 --incremental
恢复命令同全量备份,时间戳指定增量备份的时间戳即可
备份文件大小 | 备份时间 | 恢复时间 | 表数据恢复时间 | Index |
---|---|---|---|---|
119G+54G | 25m55s | 5h29m35s | 2h57m29s | 2h32m2s |
2.3 全量增量性能对比
备份 | 库大小 | 备份时间 | 备份速度 |
---|---|---|---|
全量备份 | 672G | 54m4s | 12G/m |
增量备份(仅增量) | 216G | 25m55s | 8G/m |
恢复 | 库大小 | 恢复时间 | 恢复速度 |
---|---|---|---|
全量 | 672G | 4h29m3s | 149G/h |
全量+增量 | 888G(增量:216G) | 5h29m35s | 161G/h |
全量备份与增量备份的备份恢复速度差距不大。
3. 物理备份
3.1 备份
备份命令:
pg_basebackup -p segment1端口号 -X f -c fast -D 备份目录/gpseg0 --target-gp-dbid segment1_DBID -h 127.0.0.1
......
pg_basebackup -p segment12端口号 -X f -c fast -D 备份目录/gpseg5 --target-gp-dbid segment12_DBID -h 127.0.0.1
备份耗时:
源库大小 | 物理备份(串行) | 物理备份(并行) |
---|---|---|
672G | 25m47s | 11m33s |
注:串行与并行是指单台 segment host 内的各个 segments 之间,segment host 之间均为并行。
3.2 恢复
物理备份并非 Greenplum 官方推荐的方式,恢复需要对每个 segment 进行单独恢复。
恢复步骤:
1、将每个 segment 的备份文件分别拷贝至 master 与 standby master、primary 与 mirror 对应的数据目录中
2、在 mirror 数据目录中生成 recovery.conf 文件,内容如下,其中 host 与 port 需要根据不同 segment 设置为不同值:
standby_mode = 'on'
primary_conninfo = 'user=gpadmin host=sdw1 port=6000 sslmode=prefer sslcompression=1 krbsrvname=postgres application_name=gp_walreceiver'
primary_slot_name = 'internal_wal_replication_slot'
3、在 master 上执行 gpstart -a 启动数据库(注:此时 master 与 standby master、primary 与 mirror 的复制关系尚不存在)
4、登陆到 master 与 每个 primary segment 创建复制槽,命令如下(segment 无法正常连接,需要使用 utility 模式):
PGOPTIONS='-c gp_session_role=utility' psql -p 6000
执行创建复制槽:
select pg_create_physical_replication_slot('internal_wal_replication_slot');
5、在 master 上执行 gpstate -s 查看主备之间复制状态是否正常
3.3 增量
在上述物理备份的基础上,拷贝增量 WAL 日志(或解压归档日志)到 segment 的 pg_xlog 目录中之后启动数据库。查询 WAL 日志增量数据是否可以正常应用:HEAP 表可以正常应用 WAL 日志中的增量数据,AO 表无法应用,并且查询报错:
ERROR: read beyond eof in table "t_col" file "base/16436/16396.1", read position 0 (small offset 10648), actual read length 0 (large read length 21296) (cdbbufferedread.c:211) (seg0 slice1 10.243.145.205:6000 pid=1235) (cdbbufferedread.c:211)
4. 总结
根据如上的调查结果,对比两种备份方案,得出:
备份方案 | 优点 | 缺点 |
---|---|---|
逻辑备份 | 1、Greenplum 官方推荐 2、保证全局数据一致性 3、备份、恢复方案简单 4、可支持增量备份 | 1、恢复速度非常慢(10TB 恢复超过 3 天) 2、备份速度较慢 3、只能恢复到备份时间点 |
物理备份 | 1、备份速度较快 2、恢复速度快 | 1、非 Greenplum 官方推荐备份方式 2、由于是逐节点备份,无法确保全局数据一致性 3、备份、恢复方案较复杂 4、只能恢复到备份时间点 |
由于 Greenplum 本身 master 与 segment 都自带高可用,segment 宕机 mirror 可以自动切换,master 宕机可以手动切换至 standby master,所以只有在主备都无法启动时需要使用备份进行恢复操作。无论物理备份还是逻辑备份,均只能恢复到备份时间点,若使用备份文件进行恢复,需要通过其他方式将备份点之后的数据补上。
附录1 逻辑备份详细
逻辑备份时,由 master 向每个 segment 发送类似如下命令 COPY 表数据:
COPY public.t_ao_co_zstd10 TO PROGRAM 'gzip -c -1 > /pgdata_test/gpback/gpadmin/gpseg<SEGID>/backups/20200727/2020072709201
2/gpbackup_<SEGID>_20200727092012_33282.gz' WITH CSV DELIMITER ',' ON SEGMENT IGNORE EXTERNAL PARTITIONS;
增量备份情况,对于备份的数据,删除有什么好方法么?