PostgreSQL pg_rewind原理

  

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

  

二,pg_rewind原理
 PostgreSQL pg_rewind原理”> <br/>三,相关代码</p>
  <pre> <代码> 1,每个文件(目录)的差异被记录在结构体file_entry_t中,其定义如下
  typedef struct file_entry_t
  {
  char *路径;
  file_type_t类型;
  file_action_t行动;
  
  为一个常规文件*//*
  size_t oldsize;
  size_t newsize;
  Bool isrelfile;/*数据文件的关系吗?*/datapagemap_t pagemap;
  
  符号链接*//*
  char * link_target;
  
  struct file_entry_t *下;
  }file_entry_t;
  2、文件类型
  typedef枚举
  {
  FILE_TYPE_REGULAR,//常规文件
  FILE_TYPE_DIRECTORY,//目录
  FILE_TYPE_SYMLINK//软连接
  }file_type_t;
  3、对应文件的操作行动
  typedef枚举
  {
  FILE_ACTION_CREATE,/*创建目录或者软链接:create_target(条目)*/FILE_ACTION_COPY,/*复制整个文件或者重写已存在的文件:fetch_file_range(条目→路径,0,条目→newsize); */FILE_ACTION_COPY_TAIL,/*从源中拷贝从oldsize到newsize的部分fetch_file_range(条目→路径,输入→oldsize,条目→newsize) */FILE_ACTION_NONE,/*无操作*/FILE_ACTION_TRUNCATE,/*裁剪目标集群文件到“newsize”大小:truncate_target_file(条目→路径,输入→newsize) */FILE_ACTION_REMOVE/*删除本地文件/目录/软链接:remove_target(条目)*/}file_action_t;
  4,其他变量解读
  isrefile表示该文件是否是一个表数据文件,表数据文件的路径要满足以下几个条件:
  isRelDataFile(路径):
  全球/目录下的文件,即数据库共享的表文件目录下的文件
  基地/目录下的文件,即默认表的表文件目录下的文件
  pg_tblspc/rnode。spcNode/TABLESPACE_VERSION_DIRECTORY目录下的文件,即其他表的表文件目录下的文件,其中PG_9.4_201403261与版本相关
  文件名符合的格式
  pagemap(怎么用? extractPageInfo)存储了一个位图,每一位存储了对应的目的集群文件中的每个页面从两个集群的分叉点之后是否发生了变化,1代表发生变化,0代表未变化。
  oldsize代表目的集群该文件的大小,newsize代表源集群该文件的大小.pg_rewind中通过源集群和目的集群的对应文件大小比较或者文件(目录)是否存在,指定文件的处理,例如:
  oldsize祝辞newsize: action=FILE_ACTION_TRUNCATE
  oldsize & lt;newsize: action=FILE_ACTION_COPY_TAIL
  如果文件不存在,则行动=FILE_ACTION_COPY PG_VERSION文件除外
  如果目录不存在,则行动=FILE_ACTION_CREATE
  如果文件多余,则行动=FILE_ACTION_REMOVE
  以上动作由函数process_target_file和process_source_file一起处理。只在process_target_file设置FILE_ACTION_REMOVE
  5,提取细胞膜日志获取更改页的步骤:
  extractPageInfo:
  (block_id=0;block_id & lt;=记录→max_block_id;block_id + +) {
  如果(!XLogRecGetBlockTag(记录、block_id和rnode, forknum,, blkno))
  继续;/*我们只关心主叉;其他人复制全部*/如果(forknum !=MAIN_FORKNUM)//MAIN_FORKNUM是什么意思?
  继续;
  process_block_change (forknum rnode blkno);
  }
  6,pagemap中的位图
  pg_rewind工具执行需要打开full_page_writes,而打开了full_page_writes之后,检查点后每个数据页的第一次修改对应的数据页的全部内容都会写在细胞膜日志记录中,所以pg_rewind可以根据细胞膜日志的组织结构很容易的找到对应已经修改的数据页信息,并把对应的file_entry_t的位图置为1。
  XLogRecGetBlockTag: XLogReaderState。块(XLR_MAX_BLOCK_ID + 1)
  </代码> </pre><h2 class=PostgreSQL pg_rewind原理