千家信息网

PostgreSQL pg_rewind原理

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,一、背景常见的高可用架构中,如果master挂了且有数据没有同步到备,高可用系统会提升备为主对外服务。对于老主有可能再以备的身份加入集群时,可能搭建流复制关系失败。可以用pg_rewind工具使主备的
千家信息网最后更新 2026年11月03日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安全错误 数据库的锁怎样保障安全 互联网黑科技 什么是科技互联网 科技赋能下的互联网金融 互联网金融 科技 杭州互联网科技公司 互联网金融监管科技 丰台科技园 互联网公司 农村开互联网科技讲堂 崇明区互联网教育科技诚信经营 千方科技属于互联网企业吗 中国互联网公司排名锤子科技 为客找房互联网科技公司怎么样 山东有哪些互联网科技公司 山东子淼互联网科技有限公司 艺电能源互联网科技有限公司招聘 深圳互联网科技园地址 长沙易易互联网科技有限公司 平安好医生打造互联网科技医疗 互联网大会出现的黑科技 小牛互联网科技有限公司地址 卓越科技(互联网 ) 云电互联网科技 互联网科技logo 成都狮子座互联网科技 宝灵互联网科技有限公司 亳州好赞互联网科技有限公司 燊美集互联网科技有限公司 广东鹅鹅鹅互联网科技有限公司 互联网科技手机排行榜 银川新华互联网科技学校原画
0