文档章节

pg_rewind

MtrS
 MtrS
发布于 2016/09/13 08:21
字数 2046
阅读 48
收藏 0

走向未来 pg_rewind {.center}

小次郎@飞象翻译  origin By Giuseppe Broccolo (第二象限)

原文链接

PostgreSQL 9.5 以后pg_rewind 可以让旧的主, 追随提升的备库,并继续跟进.

由于在这期间,提升的备库(此时已经成为primary)拥有了自己的时间线(qιuqιu☄:startupxlog timeline+1)。 在switchover过程,集群不能正常工作的场景中,这时会用到pg_rewind

你经历过"脑裂"的切换过程么?

如果目标是切换角色的主节点和备节点 你最终得到两个两个独立的主节点, 每一个拥有一个独立的时间线, 这时PG dba在HA的情况下,pg_rewind 就可以派得上用场 !

在PostgreSQL 9.5以前,那里是这个问题只有一个解决办法︰

重新追随新的主做一次新的基础备份(basebackup),并将他作为一个新的备用节点加入HA集群中去, 一般来说,这也不是一个问题, 如果你的数据库比较大, 假设你有数百GBs 的数据,这时,这样的操作很容易导致停机时间比较长。

在时间的数据库还原到以前的点可以创建可以用不同的方式处理一些复杂性。 对于深入解释的演变和PostgreSQL的 容错组件, 你可以 Gulcin 关于 PostgreSQL 容错能力的演变系列文章 其中提到了 pg_rewind 使用时间旅行特征中的演变。

pg_rewind 的工作原理

pg_rewind 扫描"旧"Master 节点的 PGDATA 目录,在切换到新的时间线的过程中, 标记出这些时间内更改的数据块, 然后从提升的主(原先为从设备)复制只有这些块。

然后,这用于替换所做的更改。

作为一个"抵押品"效应,配置文件也会从提升的Master状态中去复制 (所以DBA必须要小心处理, 能够让这个节点能够融入到HA集群中去) 这样,就不需要对PGDATA做一次完全同步。

要做到这一点,就要拥有旧主 switchover 前的最后时刻产生的所有WALs。 通过比较数据的状态存在于 PGDATA 的块与登录 WALs 的变化,找出改变并标记。 一旦确定更改的数据块,WALs 重演,模仿时间线的 rewind("倒带")。

此外︰

实例必须在初始化时使用 "-k"(或 --data-checksums)参数

启用 wal_log_hints参数

在PostgreSQL 9.5以前,必要的WALs从最后一个检查点开始,并且不能在这个时间线之后,

为了更好地理解它是如何工作的,可以以如下Master节点情景为示列︰

# Set PATH variable
export PATH=/usr/pgsql-9.5/bin:${PATH}

# This is the directory where we will be working on
# Feel free to change it and the rest of the script
# will adapt itself
WORKDIR=/var/lib/pgsql/9.5

# Environment variables for PGDATA and archive directories
MASTER_PGDATA=${WORKDIR}/master
STANDBY1_PGDATA=${WORKDIR}/standby1
ARCHIVE_DIR=${WORKDIR}/archive

# Initialise the cluster
initdb --data-checksums -D ${MASTER_PGDATA}

# Basic configuration of PostgreSQL
cat >> ${MASTER_PGDATA}/postgresql.conf <<EOF
archive_command = 'cp %p ${ARCHIVE_DIR}/%f'
archive_mode = on
wal_level = hot_standby
max_wal_senders = 10
min_wal_size = '32MB'
max_wal_size = '32MB'
hot_standby = on
wal_log_hints = on
EOF

cat >> ${MASTER_PGDATA}/pg_hba.conf <<EOF
# Trust local access for replication
# BE CAREFUL WHEN DOING THIS IN PRODUCTION
local replication replication trust
EOF

# Create the archive directory
mkdir -p ${ARCHIVE_DIR}

# Start the master
pg_ctl -D ${MASTER_PGDATA} -l ${WORKDIR}/master.log start

# Create the replication user
psql -c "CREATE USER replication WITH replication"

(注: 少量的WAL保持在主),然后待机状态︰

# Create the first standby
pg_basebackup -D ${STANDBY1_PGDATA} -R -c fast -U replication -x

cat >> ${STANDBY1_PGDATA}/postgresql.conf <<EOF
port = 5433
EOF

# Start the first standby 启动备库
pg_ctl -D ${STANDBY1_PGDATA} -l ${WORKDIR}/standby1.log start

让我们在主库插入一些数据。可以看到备机也是从(热)备机状态。

现在提升备机,脱离Master节点,使用命令如下︰

pg_ctl -D ${STANDBY1_PGDATA} promote

现在如果你更新的大师,没有更改将可见从待机状态。 此外,在归档文件 / 目录就可以看到文件 00000002.history, 这表明在备机提升期间,时间线发生了变化。

现在让我们"倒带"主人,并使其跟进提升待机状态︰

~$ pg_ctl -D ${MASTER_PGDATA} stop
waiting for server to shut down.... done
server stopped
~$ pg_rewind --target-pgdata=${MASTER_PGDATA} \
    --source-server="port=5433 user=postgres dbname=postgres"

注意:在这里,对于连接到源服务器 — — 提升待机状态 — — 我们使用 postgres 用户,因为 pg_rewind 需要超级用户的身份检查数据块

如果 max_wal_size 参数不是足够大,以保持所需的 WALs 到 pg_xlog / 备用服务器的目录中,我已经故意做了决定之前,类似于以下的错误可以得到︰

The servers diverged at WAL position 0/3015938 on timeline 1.
could not open file "/var/lib/pgsql/9.5/master/pg_xlog/000000010000000000000002": No such file or directory

could not find previous WAL record at 0/3015938
Failure, exiting

现在,有两种可能的方式来解决这个问题: (小次郎注:通过后面的评论,我们发现第二个方法不可行,不可行(=@__@=)?)

手动检查缺少的范围,在归档中,开始从一个列出的错误消息,然后将它们复制到 pg_xlog / 目录的主人

在 recovery.conf 和 PGDATA 的主人,在地方中添加适当的 restore_command,所以 pg_rewind 会自动地寻找失踪 WALs

第二个选项可能是最合适的方法。例如,想想,是否你有沃尔玛档案由酒保︰ 你能基地 restore_command 要使用 get 沃尔玛功能的酒保,由加布里埃这篇有趣的文章所述。这样做的时候,酒保将用作沃尔玛集线器,提供必要的沃尔玛文件,到 pg_rewind。

一旦检索到失踪的范围,你可以再次运行 pg_rewind 命令和以下消息应确保一切正常工作︰

~$ pg_rewind --target-pgdata=${MASTER_PGDATA} \
    --source-server="port=5433 user=postgres dbname=postgres"
servers diverged at WAL position 0/3015938 on timeline 1
rewinding from last common checkpoint at 0/3000140 on timeline 1
Done!

请记住,这个操作只是很少的块复制(这是在修复脑裂(次郎注:those changed during the split-brain),即便您的数据库大小是数以百计的 GBs! 记住,配置文件也会被复制,在"降级"的Master节点数据目录中的recovery.conf也已经被覆盖了.

  • 更改该实例是在哪里在 postgresql.conf 监听的端口 (在我们的示例中, 将其设置为5432)

  • 为了使降级的主库可以连接到提升的主库上去,需要在主库更改recovery.conf文件中的primary_conninfo

完成此操作后,启动降级的Master节点,它将将开始跟进提升的备机(即新的主),然后将其待机反过来。

你希望拥有一个一个更复杂的HA集群吗?不用担心!

第2部分将深入剖析PostgreSQL 9.5 中的pg_rewind!

评论翻译:

lesovsky: 请注意,pg_rewind 仅适用万一当老主人停止正确,和那里是没有办法倒带如果已经崩溃,SIGKILL'ed 或类似。

Vladimir:

在 recovery.conf 和 PGDATA 的主人,在地方中添加适当的 restore_command,所以 pg_rewind 会自动地寻找失踪 WALs

这真的管用吗?好像是,关于这些pg_rewind 源代码没有提及到这一块呢?

嗨,Vladimir,

 是的,这的确存在误导性: 后来经过尝试,这我意识到它不能以这种方式工作(
 但错误地没有改变了书面的部分 — — 太晚现在!伤心表情 :()。

 无论如何,Barman 的get-wal 特性是真的很有趣(此处是广告),
 任何情况下,都可以从归档中检索到需要的WALs,并且可以单独使用
 如果给pg_rewind 添加个补丁就nice 了,让其支持从类似"restore_command"的参数中检索归档

不过,谢谢指出问题。

Alexander:

如果主库已经奔溃,还有没有办法rewind,SIGKILL'ed 或类似。

也不是完全无药可救了,还有一种解决办法:(救死马的方法么?) 1) 从"pg_xlog/archive_status"中删除文件 2) 在单用户模式下启动您的数据库 (postgres -single -D -c archive_mode =-c archive_command = false)。 3) 执行检查点 "checkpoint" 4) 按下 Ctrl + D 离开单用户模式。

瞧,现在你有干净关闭,pg_rewind 应该工作 表情嘚瑟笑 :)

   博主回复:

   嗨,Alexander

   谢谢你提供的这个过程。之前没尝试过啊,(小次郎注:你厉害),
   这真的对于任何类型的Master节点故障管用么?无论如何,作为已经突出显示到莱绍夫斯基,
   我在这里考虑的场景是* switchover *,主库正常的关闭,没有考虑到 failover。

本文转载自:http://blog.2ndquadrant.com/introduction-to-pgrewind/

MtrS
粉丝 36
博文 699
码字总数 419371
作品 0
榆林
私信 提问
PostgreSQL 11 preview - Allow on-line enabling and disabling of data checksums

标签 PostgreSQL , checksum , online modify , pgverifychecksums , pgenabledatachecksums , pgdisabledatachecksums 背景 PostgreSQL的数据文件是以数据块组织的,由于数据块可能比文件系......

德哥
2018/05/06
0
0
PostgreSQL pg_resetwal pg_resetxlog 强制使用某些值(例如system id)

标签 PostgreSQL , pgresetxlog , pgresetwal , 修复控制文件 , pg_controldata , 修复恢复异常 背景 使用pgresetwal , pgresetxlog 修复控制文件时,如何强制指定数据库实例systemid? pgres...

德哥
04/14
0
0
PostgreSQL pg_rewind实例--could not find previous WA

一、介绍 作为pg_rewind报错章节补充一个用例,说明其用法。 二、实例 1、history文件 2、查找分叉点 说明:findCommonAncestorTimeline: 1)比较sourceHistory[0]、targetHistory[0]的时间...

yzs的专栏
05/17
0
0
PostgreSQL 9.5 Alpha 2 发布

PostgreSQL 9.5 Alpha 2 发布,此版本相比 Alpha 1 改进如下: Make pg_rewind work with symlinks Fix several issue with locking Numerous changes and improvements to Row Level Securi......

淡漠悠然
2015/08/07
1K
3
PostgreSQL 11 1000亿 tpcb、1000W tpcc 性能测试 - on 阿里云ECS + ESSD (含quorum based 0丢失多副本配置与性能测试)

标签 PostgreSQL , pgbench , tpcb , tpcc , tpch 背景 https://help.aliyun.com/knowledgedetail/64950.html 阿里云ESSD提供了的能力,单台ECS可以挂载16块ESSD盘,组成512 TB的大容量存储。...

德哥
04/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx访问日志/日志切割/静态文件过期时间/防盗链

Nginx访问日志主要记录部署在nginx上的网站访问数据,日志格式定义在nginx主配置文件中。 nginx主配置文件:/etc/nginx/nginx.conf 查看nginx主配置文件: ```markup [root@linux ~]# cat /e...

asnfuy
6分钟前
4
0
JS_高程4.变量,作用域和内存问题(2)执行环境及作用域

本文转载于:专业的前端网站➨JS_高程4.变量,作用域和内存问题(2)执行环境及作用域 1.执行环境:执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为,       每个执...

前端老手
10分钟前
3
0
手机迅雷下载的文件,电脑上找不到问题

不知道手机迅雷怎么做到的,手机迅雷下载的文件,手机上可以看的到 但连电脑后, 电脑上看不到文件 . 尝试了打开查看隐藏文件, 但没有效果 . 手机上查询文件权限 也是对的 . 可读,可写, 不隐藏 ...

ol_O_O_lo
12分钟前
3
0
python学习11:Python tuple元组详解

元组是 Python 中另一个重要的序列结构,和列表类似,也是由一系列按特定顺序排序的元素组成。和列表不同的是,列表可以任意操作元素,是可变序列;而元组是不可变序列,即元组中的元素不可以...

太空堡垒185
24分钟前
3
0
Java实现数据结构之线性结构

一、顺序表 顺序表本质是使用数组储存数组的一种数据结构,在计算机的储存中是连续的分配内存的。 下面是我自己使用java实现的简单顺序表结构 package list; public class MyArrayList<E> { ...

daxiongdi
27分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部