Greenplum的差异化修复原理简介

0    198    1

Tags:

👉 本文共约5521个字,系统预计阅读时间或需21分钟。

简介

Greenplum PR15146[1] 增加了一种新的 mirror 节点修复方式 —— 差异化修复(Differential recovery),介于增量修复(Incremental recovery)和全量修复(Full recovery)之间,当数据量庞大且由于 WAL 缺失不能进行增量修复时,差异化修复提供了一种快速修复的能力。但通过测试,差异化修复的性能反倒不如全量修复,让我们来一探究竟吧 🧐

☆ GPDB 节点修复原理简介

GPDB 的 segment 节点修复以 python 脚本 gprecoverseg 为入口,通过读取 Coordinator 节点的元数据,来获取需要修复(seg.isSegmentDown())节点的三元组(RecoveryTriplet):

  • • failed: 当前 down 的 segment,即要修复的节点
  • • live: 当前 up 的节点,作为修复的 source
  • • failover: 节点修复的 dest,如果该值为 None,则在 failed 节点原地修复

通过将如上三元组数组构造为一个 GpMirrorListToBuild 结构后调用该对象的 recover_mirrors 函数进行修复。

recover_mirrors 首先通过 build_recover_info 为每个需要修复的 segment 生成一个 RecoverInfo 对象,保存在一个 { hostname, RecoverInfo list } 的字典结构中。

然后调用 _run_setup_recovery_run_recovery 分别去要修复的节点执行 gpsegsetuprecovery.pygpsegrecovery.py

gpsegsetuprecovery.py 在目标节点上根据宕机节点的修复类型(full/incremental)做不同的前置工作:

  • • 若是全量修复,执行 ValidationForFullRecovery 检测目标端的目录是否满足需求(如果非 overwrite 需要保证目标目录为空)
  • • 若是增量修复,执行 SetupForIncrementalRecovery 去源端执行 CHECKPOINT 命令(执行 CHECKPOINT 是为了保证如果 source 端刚被 promote,其 control file 能反映最新的 timeline information,详见 pg_rewind[2])并将目的端的 postmaster.pid 删除。

gpsegrecovery.py 在目标节点上根据修复类型执行 pg_basebackuppg_rewind,各命令使用的参数如下:

PgBaseBackup

参数含义
-c fastSets checkpoint mode to fast
-D target_datadir目标目录
-h source_host源端目录
-p source_port源端 port
--create-slot进行 backup 之间创建 --slot 指定的 replication slot
--slot要创建的 replcation slot 名称
--wal-method streambasebackup 忽略 WAL 文件的传输,而是由另外一个进程在 basebackup 的同时流式传输 WAL 文件
--no-verify-checksums忽略 checksums
--write-recovery-conf生成 Recovery Config,PG 12 之前为 recovery.conf,之后为 postgresql.auto.conf
--force-overwritegpdb 引入的一个选项,在做 pg_basebackup 之前不需要目的端目录为空,而是在执行的过程中将需要从源端拷贝的目录或文件删除
--target-gp-dbidgpdb 引入的选项,为了适配 Greenplum 用户定义的 tablespaces
-E ./db_dumps -E ./promote忽略的目录
--progress显示进度百分比
--verbose显示更多的日志信息

PgRewind

参数含义
--write-recovery-conf生成 Recovery Config,PG 12 之前为 recovery.conf,之后为 postgresql.auto.conf
--slot=internal_wal_replication_slot写入 Recovery Config 的 replication slot
--source-server=CONNSTR源端数据库
--target-pgdata=DIRECTORY目的端数据目录
--progress显示更多的日志信息

值得注意的是,无论增量修复还是全量修复后,静态的实例状态未必处于一致的状态,都需要启动实例进入 recovery mode 回放日志来达到一致的状态。主要原因有两个:

  1. 有些文件在拷贝过之后在源端有修改,这就使得数据目录不是一个完整的快照状态
  2. 读取的文件可能不是完整的数据页(由于 pg 的 PAGE_SIZE 和 OS 的 PAGE_SIZE 不同),需要源端开启 full_page_writes 选项保证正确性

关于 postgres 全量修复和增量修复更详细的解读可参考 pg_basebackup 代码浅析[3] 和 pg_rewind 代码浅析[4]。

☆ 差异化修复

gpdb 作为分析型数据库通常实例的数据量较大,在宕机之后如果能增量修复具有显著的性能优势,但有时由于 WAL 日志缺失会导致增量修复的失败,且如果 pg_rewind 中断了,通常不建议进行重试,只能使用更耗时的全量修复。在全量修复过程中如果网络抖动,极有可能在同步了 90% 数据的时候修复失败,只能重新执行全量修复,费力劳心。

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!
Greenplum的差异化修复原理简介后续精彩内容已被小麦苗无情隐藏,请输入验证码解锁本站所有文章!
验证码:
请先关注本站微信公众号,然后回复“小麦苗博客”,获取验证码。在微信里搜索“DB宝”或者“www_xmmup_com”或者微信扫描右侧二维码都可以关注本站微信公众号。

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

嘿,我是小麦,需要帮助随时找我哦。另外,Oracle和MySQL OCP包过哟,可随时联系麦老师。
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部

麦老师提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,非诚勿扰,谢谢!