PostgreSQL pg_rewind原理
admin
2023-02-09 03:00:07
0

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

二、pg_rewind原理
PostgreSQL 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、对应文件的操作action
typedef 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_REMOVE
5、提取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中的bitmap
pg_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]

相关内容

热门资讯

德国总理:美国正在被伊朗羞辱 德国之声4月27日报道,德国总理默茨在访问一所学校时表示,在当前的持续冲突中,伊朗领导层正试图羞辱美...
理响中国|“长”歌以行,风云激... 光阴如梭,东方潮阔。这里是中国的长三角,世界的长三角。无论过去、现在还是未来,这片土地都因时代而生,...
白宫:特朗普及其国安团队开会讨... 新华社华盛顿4月27日电 美国白宫新闻秘书莱维特27日在记者会上证实,总统特朗普及其国家安全团队当天...
人民日报刊文:日本放开杀伤性武... 日本放开杀伤性武器出口推高地缘冲突风险(国际论坛)常思纯《人民日报》(2026年04月28日 第 0...
医疗保障法草案二审:明确生育保... 满足多样化健康保障需求本报记者 彭 波4月27日,医疗保障法草案二审稿提请十四届全国人大常委会第二十...
天津一景区发生自转旋翼机事故1... 澎湃新闻记者 吕新文中国民用航空华北地区管理局4月22日公布《豪客通航“10•1”天津长芦汉盐旅游区...
卡塔尔埃米尔与美国总统特朗普通... 当地时间24日,卡塔尔埃米尔塔米姆与美国总统特朗普通电话,重点就中东地区局势以及伊朗与美国谈判问题交...
男子30年前被扣押2859克黄... 澎湃新闻记者 王鑫家住辽宁省大连市的潘永嘉近日向澎湃新闻反映称,三十年前,他在大连周水子机场被盖州市...
商务部:取消反制欧盟两家金融机... 中华人民共和国商务部令二〇二六年 第1号鉴于欧盟已取消对中国两家金融机构的制裁措施,现公布《关于取消...
过去24小时共有5艘船只通过霍... 总台记者当地时间24日获悉,过去24小时内,共有5艘船只通过霍尔木兹海峡,其中包括一艘伊朗油轮。(总...