os: ubuntu 16.04
postgresql: 9.6.8

pg_rewind是用于在集簇的时间线分叉以后,同步一个 PostgreSQL 集簇和同一集簇的另一份拷贝的工具。一种典型的场景是在故障切换后让旧的主服务器作为新主机的备机重新上线。

其结果等效于把目标数据目录替换成源数据目录。数据文件中只有更改过的块才会被拷贝,所有其他的文件会被整个拷贝,包括配置文件。pg_rewind比起做一个新的基础备份或者rsync等工具的优势在于,pg_rewind不要求读取集簇中未更改的块。这使得它在数据库很大并且在集簇间只有小部分块不同时速度很快。

pg_rewind检查源集簇和目标集簇的时间线历史来判断它们在哪一点分叉,并且期望在目标集簇的pg_xlog目录中找到 WAL 来返回到分叉点。分叉点可能会在目标时间线、源时间线或者它们的共同祖先上找到。在典型的失效场景中,目标集簇在分叉后很快就被关闭,这不是问题,但是如果目标集簇在分叉后已经运行了很长时间,旧的 WAL 文件可能已经不存在了。在这样的情况下,它们可以被手工从 WAL 归档复制到pg_xlog目录,或者通过配置recovery.conf在启动时取得。pg_rewind的使用并不限于故障切换的场景,例如一个后备服务器可能被提升、运行一些写事务,然后被倒回再次成为一个后备。

当目标服务器在运行了pg_rewind之后第一次启动时,它将进入到恢复模式并且重放源服务器在分叉点之后产生的所有 WAL。如果运行pg_rewind时有些 WAL 在源服务器上找不到,并且因此无法被pg_rewind复制过来,则在目标服务器被启动时必须让这些 WAL 可用。这可以通过在目标数据目录中创建一个recovery.conf文件并且在其中使用一个适当的restore_command来实现。

pg_rewind有两个要求:
1、目标服务器在postgresql.conf中启用了wal_log_hints选项,或者在用initdb初始化集簇时启用了数据校验。目前默认情况下这两者都没有被打开。
2、full_page_writes也必须被设置为on,这是默认的。

查看参数

postgres=# show wal_log_hints;
 wal_log_hints
---------------
 on
(1 row)postgres=# show full_page_writes;
 full_page_writes
------------------
 on
(1 row)

配置好stream replication

过程略

master 上操作

postgres=# create table tmp_t0(c0 varchar(100));
CREATE TABLE
postgres=# insert into tmp_t0 (c0) values('100');
INSERT 0 1
postgres=#

slave 上操作

postgres=# \d
         List of relations
 Schema |  Name  | Type  |  Owner
--------+--------+-------+----------
 public | tmp_t0 | table | postgres
(1 row)postgres=# select * from tmp_t0;c0
-----100
(1 row)

此时将slave 提升为 master

$ /usr/lib/postgresql/9.6/bin/pg_ctl promote -D /data/pg9.6/main/

此时,有两个master。

老master上插入数据

postgres=# insert into tmp_t0 (c0) values('101');
INSERT 0 1
postgres=# select * from tmp_t0;c0
-----100101
(2 rows)

新master上插入数据

postgres=# insert into tmp_t0 (c0) values('102');
INSERT 0 1
postgres=# select * from tmp_t0;c0
-----100102
(2 rows)

那这个时候两个master上的数据不一致了,怎样把老的master变为新的master的slaver。
这个时候就需要用到 pg_rewind.

老master上操作

必须干净的关闭,关闭后暂时不能以备节点角色直接拉起来。

# /etc/init.d/postgresql stop
或者
$ /usr/lib/postgresql/9.6/bin/pg_ctl stop -m fast -D /data/pg9.6/main$ /usr/lib/postgresql/9.6/bin/pg_rewind --target-pgdata=/data/pg9.6/main --source-server='host=192.168.56.100 port=5432 user=postgres password=passw0rd dbname=postgres' -Pconnected to server
servers diverged at WAL position 0/3009BD8 on timeline 1
rewinding from last common checkpoint at 0/3000218 on timeline 1
reading source file list
reading target file list
reading WAL in target
need to copy 52 MB (total source directory size is 69 MB)
53345/53345 kB (100%) copied
creating backup label and updating control file
syncing target data directory
Done!

创建 recovery.conf 文件

$ vi $PGDATA/recovery.conf
#restore_command = 'lz4 -d /data/backup/pgwalarchive/%f.lz4 %p'
recovery_target_timeline = 'latest'
standby_mode = 'on'
primary_conninfo = 'host=192.168.56.100 port=5432 port=5432 user=replicator password=passw0rd dbname=postgres'
trigger_file = '/tmp/postgresql.trigger.5432'

启动老的master

# /etc/init.d/postgresql start
或者
$ /usr/lib/postgresql/9.6/bin/pg_ctl start -D /data/pg9.6/main$ psql
psql (9.6.8)
Type "help" for help.postgres=#
postgres=# select * from tmp_t0;c0
-----100102
(2 rows)

至此,老的master已经变为新master的slave。

pg_rewind 的工作方式:
其基本思想是从源集簇拷贝所有文件系统级别的改变到目标集簇:

1、以源集簇的时间线历史从目标集簇分叉出来的点之前的最后一个检查点为起点,扫描目标集簇的 WAL 日志。对于每一个 WAL 记录,读取每一个被动过的数据块。这会得到在目标集簇中从源集簇被分支出去以后所有被更改过的数据块列表。

2、使用直接的文件系统访问(–source-pgdata)或者 SQL (–source-server),把所有那些更改过的块从源集簇拷贝到目标集簇。

3、把所有其他诸如pg_clog和配置文件(除了关系文件之外所有的东西)从源集簇拷贝到目标集簇。

4、从源集簇应用 WAL,从失效处创建的检查点开始(严格来说,pg_rewind并不应用 WAL,它只是创建一个备份标签文件,该文件让PostgreSQL从那个检查点开始向前重放所有 WAL)。

可以这样理解,加入所有的文件都需要拷贝,那么和rsync是一样的。
所以 pg_rewind 不会比 rsync 慢。

参考:
http://postgres.cn/docs/9.6/app-pgrewind.html

转载于:https://www.cnblogs.com/ctypyb2002/p/9792877.html

pg_rewind 快速角色切换相关推荐

  1. iscsi没有可用于使用快速连接登陆的目标_【解密】5G商用在即 OPPO快速网络切换方法;高管宣布华为河图商标注册成功;小米折叠屏专利曝光 类似于摩托罗拉Razr...

    1.[专利解密]5G商用在即 OPPO快速网络切换方法 2.好消息!高管宣布华为河图商标注册成功 3.小米折叠屏专利曝光 类似于摩托罗拉Razr 4.索尼Xperia提交新专利 上下双升降结构 1.[ ...

  2. nexues vpc 角色切换,引起staick 重置引起业务中断问题

    严禁出现 先说严禁两台设备出现双ture,正常为failse NX-OS# show system internal vpcm info global | i Sticky Sticky Master ...

  3. win10 快速窗口切换方式

    win10 快速窗口切换方式: 同时按住Alt键和Tab键 这样同时显示以后 Alt 键不要从 点击Tab 键切换窗口就行啦加粗样式****

  4. Linux/Unix 效率工具:快速路径切换 z 命令

    简介 z是一个开源的快速路径切换工具(类似工具还有 z.lua.autojump.fasd).通过 Frecency机制对日常访问的路径进行 Frecent权重计算,z会帮你切换到所有匹配正则关键字的 ...

  5. iShare·AD小技巧--在AD中如何快速的切换版层

    在AD中如何快速的切换版层 1.按键盘"*"切换版层 2.使用小键盘"+""-" 3.Ctrl+Shift+鼠标滚轴 4.Shift+S 5 ...

  6. wordpress国内网速慢加速及防DDOS攻击快速CF切换教程

    wordpress国内网速慢加速及防DDOS攻击快速CF切换教程标题 一.现网站的情况分析 二.网站搬迁 1.操作系统选择 2.命令行 第一步:安装nginx 第二步:开启防火墙 第三步:安装mysq ...

  7. 【商城应用】角色切换流程

    今天给大家介绍一下商城中的角色切换场景,大的商城一般都会有很多供应商,像1688的app就是这样子的,会有用户角色切换,也就是用户既可以是供应商角色又可以是普通用户角色.这样的好处也是显而易见的,比如 ...

  8. netware客户服务禁用了欢迎屏幕和快速用户切换

    netware客户服务禁用了欢迎屏幕和快速用户切换 卸载netware的客户服务 网上邻居----右击---属性---本地连接----右击----属性---单击"此连接使用下列项目" ...

  9. MySQL MGR 单主模式下单点故障时的节点角色切换规则

    MGR单主模式下,有一个节点可读可写,其余节点都是只读,其中表现为super_read_only被自动设为了ON. 那么,如果可读可写的节点异常宕机了,会进行怎样的切换呢? 在选择新的可写角色时,主要 ...

最新文章

  1. ubuntu 12.04 联想thinkpad e430 安装wifi驱动
  2. 08-Measured Boot Driver (MBD)
  3. 在正确的方向坚持下去,一直坚持下去,直到有成果
  4. 授权码模式-获取令牌
  5. Linux 进程间通信:管道、共享内存、消息队列、信号量
  6. 前端如何实现:在不刷新页面的情况下实时看到自己的评论
  7. 每天十分钟系列:JS数据操作之神奇的map()
  8. linux 清除内存和Cache方法
  9. 毕设题目:Matlab DTMF双音多频
  10. c语言全局钩子,如何实现键盘钩子(文章)?
  11. 100兆的网速在电脑上怎样测试软件,怎么测网速多少兆,360测网速
  12. led时间代码html,LED旋转时钟制作(有源代码)
  13. M资源,每个进程最多N个资源,最多几个进程不会发生死锁
  14. 关于CMake的使用介绍
  15. 【复试英语】应对考官三招解决尴尬局面!
  16. #9.白盒测试:数据流测试
  17. 联想笔记本打开野兽模式
  18. 淮北师范大学c语言试卷,2016年淮北师范大学物理与电子信息学院高级语言程序设计(加试)之C语言程序设计复试笔试最后押题五套卷...
  19. 服务助手NSSM——将Windows程序封装成服务
  20. 安卓配高德地图离线样式

热门文章

  1. mysql学习--1.事务
  2. Mycat适合场景及不适合场景
  3. ios中数据存储方式
  4. Python OpenCV学习笔记之:灰度图像的直方图计算
  5. App Store最新审核指南(2015年3月更新版)
  6. ios 7.1.2 拍照声音
  7. Ruby 获取 HTTP 回应的编码和内容
  8. python 根据开头时间戳 合并两个文件
  9. nginx 安装失败 没有/etc/nginx目录
  10. make clean与make distclean的区别-转