阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

PostgreSQL pg_rewind原理简述

124次阅读
没有评论

共计 2424 个字符,预计需要花费 7 分钟才能阅读完成。

一、背景

常见的高可用架构中,如果 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]

 

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计2424字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中