PostgreSQL pg_rewind原理
发表于:2024-10-24 作者:千家信息网编辑
千家信息网最后更新 2024年10月24日,一、背景常见的高可用架构中,如果master挂了且有数据没有同步到备,高可用系统会提升备为主对外服务。对于老主有可能再以备的身份加入集群时,可能搭建流复制关系失败。可以用pg_rewind工具使主备的
千家信息网最后更新 2024年10月24日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安全错误
数据库的锁怎样保障安全
网络安全形势及方法
iter聚变材料数据库
网络安全教材扫描版
查看服务器速度
事务型数据库都有哪些
最新网络安全股票龙头
网络技术应用光盘
数据库管理实验csdn
护航冬奥网络安全自查报告
数据库的复码
数据库性别设置为什么类型
英伟达与服务器有什么关系
最成功的数据库
数据库设计一对一
中国移动atlas服务器
绍兴软件开发驻场收费标准
在线网络安全知识竞赛答案
一软件开发项目
清华同方服务器管理口
软件开发的研究与实验方法
网络安全及病毒防范教程
北仑应用软件开发服务
由软件开发转产品经理
中职网络技术与应用
人类皮肤细胞数据库
服务器添加端口
数据库右外连接什么意思
查看app用什么软件开发
山西什么是软件开发设施
数据库心跳区域