千家信息网

PostgreSQL pg_rewind原理

发表于:2025-11-10 作者:千家信息网编辑
千家信息网最后更新 2025年11月10日,一、背景常见的高可用架构中,如果master挂了且有数据没有同步到备,高可用系统会提升备为主对外服务。对于老主有可能再以备的身份加入集群时,可能搭建流复制关系失败。可以用pg_rewind工具使主备的
千家信息网最后更新 2025年11月10日PostgreSQL pg_rewind原理

一、背景
常见的高可用架构中,如果master挂了且有数据没有同步到备,高可用系统会提升备为主对外服务。对于老主有可能再以备的身份加入集群时,可能搭建流复制关系失败。可以用pg_rewind工具使主备的数据一致。

二、pg_rewind原理

三、相关代码

1、每个文件(目录)的差异被记录在结构体 file_entry_t 中,其定义如下typedef struct file_entry_t{    char       *path;    file_type_t type;    file_action_t action;    /* for a regular file */    size_t  oldsize;    size_t  newsize;    Bool    isrelfile;          /* is it a relation data file? */    datapagemap_t pagemap;    /* for a symlink */    char       *link_target;    struct file_entry_t *next;} file_entry_t;2、文件类型typedef enum{    FILE_TYPE_REGULAR,//常规文件    FILE_TYPE_DIRECTORY,//目录    FILE_TYPE_SYMLINK//软连接} file_type_t;3、对应文件的操作actiontypedef enum{    FILE_ACTION_CREATE,         /* 创建目录或者软链接: create_target(entry)*/    FILE_ACTION_COPY,           /* 复制整个文件或者重写已存在的文件: fetch_file_range(entry->path, 0, entry->newsize);*/    FILE_ACTION_COPY_TAIL,      /* 从source中拷贝从oldsize到newsize的部分 fetch_file_range(entry->path, entry->oldsize, entry->newsize)*/    FILE_ACTION_NONE,           /* 无操作 */    FILE_ACTION_TRUNCATE,       /* 裁剪target集群文件到'newsize'大小: truncate_target_file(entry->path, entry->newsize)*/    FILE_ACTION_REMOVE          /* 删除本地文件/目录/软链接: remove_target(entry)*/} file_action_t;4、其他变量解读isrefile 表示该文件是否是一个表数据文件,表数据文件的路径要满足以下几个条件:isRelDataFile(path):    global/ 目录下的文件,即数据库共享的表文件目录下的文件    base/ 目录下的文件,即默认tablespace的表文件目录下的文件    pg_tblspc/&rnode.spcNode/TABLESPACE_VERSION_DIRECTORY/目录下的文件,即其他tablespace 的表文件目录下的文件,其中PG_9.4_201403261 与版本相关    文件名符合的格式pagemap (怎么用?extractPageInfo)存储了一个bitmap,每一位存储了对应的目的集群文件中的每个page 从两个集群的分叉点之后是否发生了变化,1代表发生变化,0代表未变化。oldsize 代表目的集群该文件的大小,newsize 代表源集群该文件的大小。pg_rewind 中通过源集群和目的集群的对应文件大小比较或者文件(目录)是否存在,指定文件的处理action,例如:    oldsize > newsize: action=FILE_ACTION_TRUNCATE    oldsize < newsize: action=FILE_ACTION_COPY_TAIL    如果文件不存在,则action=FILE_ACTION_COPY,PG_VERSION文件除外    如果目录不存在,则action=FILE_ACTION_CREATE    如果文件多余,则action=FILE_ACTION_REMOVE    以上动作由函数process_target_file和process_source_file一起处理。只在process_target_file设置FILE_ACTION_REMOVE5、提取wal日志获取更改页的步骤:extractPageInfo:    for (block_id = 0; block_id <= record->max_block_id; block_id++){        if (!XLogRecGetBlockTag(record, block_id, &rnode, &forknum, &blkno))            continue;        /* We only care about the main fork; others are copied in toto */        if (forknum != MAIN_FORKNUM)//MAIN_FORKNUM是什么意思?            continue;        process_block_change(forknum, rnode, blkno);    }6、pagemap中的bitmappg_rewind 工具执行需要打开full_page_writes,而打开了full_page_writes 之后,checkpoint 后每个数据页的第一次修改对应的数据页的全部内容都会写在WAL日志记录中,所以pg_rewind 可以根据WAL 日志的组织结构很容易的找到对应已经修改的数据页信息,并把对应的file_entry_t 的bitmap 置为1。XLogRecGetBlockTag:XLogReaderState.blocks[XLR_MAX_BLOCK_ID + 1]
文件 目录 数据 集群 代表 大小 日志 目的 变化 工具 结构 链接 处理 存储 原理 一致 两个 代码 信息 内容 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 基于路由技术的网络安全 远端数据库表 同步到本地 杭州五际网络技术有限公司培训 彩票软件开发目的 华为云服务器操作记录在哪看 网络安全的稳定状态 在维普数据库中,检索期刊 网络安全全球关注 拜登加强美国网络安全 安卓软件开发有潜力吗 后端数据库入门 网络安全运维工程师前景 安装服务器系统光盘 北京衡融信网络技术有限公司 网络安全考研女生如何 廊坊吉好网络技术有限公司简介 小学网络安全教育视频大全下载 软件开发出来了就可以用吗 数据库表的约束是什么意思 大专专业网络技术工作难找吗 永兴安卓软件开发培训学校 保密与网络安全培训 海尔嵌入式软件开发待遇 服务器映射端口设置 织梦里怎么进行数据库设置 北京衡融信网络技术有限公司 方舟服务器模组版本不符 创建数据库链接池要倒包吗 软件开发学习的 网络安全层次体系是什么
0