Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >POSTGRESQL 主节点失败后, 在多变的情况下重新让他融入复制中

POSTGRESQL 主节点失败后, 在多变的情况下重新让他融入复制中

作者头像
AustinDatabases
发布于 2021-09-02 08:24:22
发布于 2021-09-02 08:24:22
1.8K0
举报
文章被收录于专栏:AustinDatabasesAustinDatabases

POSTGRESQL 在主从流复制中,在主库失败切换后,从库变为主库后,如果主库不是因为硬件的原因,想继续拉起来,并且加入到新的复制关系中,一般都会通过pg_rewind的程序来进行拉起来. 但不少问题反馈对pg_rewind在重新拉起旧主库出现问题,到底有什么情况下pg_rewind对你的数据库重新建立复制关系"力不从心", 怎么去避免这样的情况是这篇文字要讨论和提到的.

对于对pg_rewind不熟悉的小伙伴,这里在重新解释,一下PG_REWIND的工作主要是针对源数据目录与目的数据目录的同步,通过拷贝的方式,包含配置文件,PG_REWIND不需要读取所有的未改变的文件,只需要读取变化的文件. 这样将一个失败的主库恢复为从库的速度和效率都是最高的. pg_rewind 会评估源和目的集群的时间轴信息,以及偏离点的信息. 另外pg_rewind主要的针对的场景就是主从切换后,主重新加入到新的集群的场景,在wal 日志丢失和不全的情况下,是无法来进行相关的复制的工作的.

另外使用pg_rewind时必须要启用, FPW 和 wal_ log_hint 这两个是必然要开启的选项,否则系统是无法正常使用pg_rewind的.

另外有两点注意,当pg_rewind操作失败后,则目标系统文件损坏,此时只能通过备份的方式来重建"从库",同时对于数据目录中一些"只读文件",使用pg_rewind 时会失败,常见与使用了ssl key 证书的时候.

工作原理:

1 扫描源于目的数据库中最后一次相同的checkpoint点之后的信息,并根据开始不同的信息来组织相关的数据块列表,通过wal log中的进行查找

2 针对列表中的数据块通过拷贝的方式,直接在文件系统级别拷贝,其中还包含pg_xact中的文件以及配置文件等等

3 开始应用在切换点后创建的checkpoint点后的wallog数据并进行重放,pg_rewind本身是不会进行相关的工作,而是通过打入一个备份的标签,在节点开启后重放日志,达到最终的一致性.

1 正常停止主库

2 提升从库

此时需要注意,如果使用了物理复制槽,则必须确认(新主上也有物理复制槽,否则在此设置连接会失败)

SELECT * FROM pg_create_physical_replication_slot('slot_s1');

以下为手动恢复的过程

一 情况 (在主库和从库都不修改数据的情况下)

在原主新从执行pg_rewind命令,连接

1 pg_rewind --target-pgdata=/pgdata/data --source-server='host=192.168.198.101 port=5432 user=repl password=repl dbname=postgres' -P

2 在原主新从,添加recovery.conf文件, 具体可以从原从库,上的recovery.done 中拷贝并修改文件,文件的内容

standby_mode = 'on'

primary_conninfo = 'user=repl passfile=''/home/postgres/.pgpass'' host=192.168.198.101 port=5432 sslmode=prefer sslcompression=1 target_session_attrs=any'

primary_slot_name='slot_s1'

recovery_target_timeline='latest'

3 启动主库

4 查询复制建立的情况

二 情况 (主库和从库,新主修改了数据的情况)

1 主库关机

2 提升新从变为新主,并插入数据

3 在新"从"上运行pg_rewind命令

pg_rewind --target-pgdata=/pgdata/data --source-server='host=192.168.198.101 port=5432 user=repl password=repl dbname=postgres' -P

4 重建recovery.conf

standby_mode = 'on'

primary_conninfo = 'user=repl passfile=''/home/postgres/.pgpass'' host=192.168.198.101 port=5432 sslmode=prefer sslcompression=1 target_session_attrs=any'

primary_slot_name='slot_s1'

recovery_target_timeline='latest'

5 启动新从库并在新的从库上查询新添加的数据

三, (主库和从库,新从库修改了数据的情况)

1 关闭主库

2 将新的从库变为主库

3 启动DOWN及的原主库,并添加数据库,在关闭他

4 pg_rewind --target-pgdata=/pgdata/data --source-server='host=192.168.198.101 port=5432 user=repl password=repl dbname=postgres' -P

5 添加recovery.conf

standby_mode = 'on'

primary_conninfo = 'user=repl passfile=''/home/postgres/.pgpass'' host=192.168.198.101 port=5432 sslmode=prefer sslcompression=1 target_session_attrs=any'

primary_slot_name='slot_s1'

recovery_target_timeline='latest'

6 启动新的从库,查看刚才添加的数据库tt5是否存在, 可以看到原有的tt5已经不存在了.

四, (在主库DOWN机后,DOWN机后的主库和新的主库均变动了数据)

1 关闭主库

2 从库提升为主库

3 在"新主" 上插入数据

4 在"旧主上插入数据"

5 关闭"旧主"

6 执行pg_rewind

pg_rewind --target-pgdata=/pgdata/data --source-server='host=192.168.198.101 port=5432 user=repl password=repl dbname=postgres' -P

7添加recovery.conf

standby_mode = 'on'

primary_conninfo = 'user=repl passfile=''/home/postgres/.pgpass'' host=192.168.198.101 port=5432 sslmode=prefer sslcompression=1 target_session_attrs=any'

primary_slot_name='slot_s1'

recovery_target_timeline='latest'

8 启动新从库(旧主), 查看从库的数据状态

复制状态

以上情况中,pg_rewind都可以将失败的主, 拉起来并和"新主"进行数据同步.

最后我们模拟一下,突然掉电的情况,看看是否有其他的变化. 并且在主库上加大压力,通过pg_bench 对数据库进行压力测试

在大量插入数据的过程中直接直接将虚拟机硬关机

此时我们将从库变为主库

然后启动已经变成孤家寡人的"主库", 然后他将刚才在掉电情况下为写入的数据进行了redo

然后我们重复上面的工作

pg_rewind --target-pgdata=/pgdata/data --source-server='host=192.168.198.101 port=5432 user=repl password=repl dbname=postgres' -P

配置好复制,启动新的从库

总结: 整体pg_rewind 在多种情况下,都可以保证失败后的数据库重新拉起来并进入新的复制, 但需要注意的两点

1 如果添加的物理复制槽的,那就需要在新的主库上添加,或确认复制槽的存在

2 加入的从库的数据与主库不一致的会全部被抹去,所以在重新加入的过程中需要注意是否有必要要保留"新从"不一致的数据.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PostgreSQL从小白到高手教程 - 第44讲:pg流复制部署
PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。
用户5892232
2024/02/02
5690
PostgreSQL从小白到高手教程 - 第44讲:pg流复制部署
PostgreSQL 12 的同步流复制搭建及主库hang问题处理与分析
主备流复制,是PostgreSQL最常用、最简单的一种高可用、读写分离的形式,类似于Oracle的ADG,主库用于读写,备库可以只读。
数据和云
2021/07/30
1.8K0
PG高可用之repmgr(1主2从+1witness)+Pgpool-II实现主从切换+读写分离+负载均衡
第二次执行时不再提示输入yes,并且可以成功执行命令,则表示SSH对等性配置成功。
AiDBA宝典
2022/11/07
3.2K0
PG高可用之repmgr(1主2从+1witness)+Pgpool-II实现主从切换+读写分离+负载均衡
进阶数据库系列(十五):PostgreSQL 主从同步原理与实践
在正式介绍 PostgreSQL 主从同步复制 之前,我们先了解一下 PostgreSQL 的预写日志机制(WAL)。
民工哥
2023/08/22
6.1K0
进阶数据库系列(十五):PostgreSQL 主从同步原理与实践
进阶数据库系列(二十一):PostgreSQL 数据目录同步工具 pg_rewind
pg_rewind 相比 pg_basebackup 和 rsync 这样的工具来说,优势是它不需要从源目录拷贝所有的数据文件,而是会对比时间线发生偏离的点,只拷贝变化过的文件,这样对于数据量很大的情况下速度更快。
民工哥
2023/08/22
2.1K0
进阶数据库系列(二十一):PostgreSQL 数据目录同步工具 pg_rewind
PostgreSQL基础(十五):PostgreSQL的主从操作
PostgreSQL自身只支持简单的主从,没有主从自动切换,仿照类似Nginx的效果一样,采用keepalived的形式,在主节点宕机后,通过脚本的执行完成主从切换。
Lansonli
2024/10/04
1.5K0
PostgreSQL基础(十五):PostgreSQL的主从操作
Postgresql主从复制--物理复制
PostgreSQL支持物理复制(流复制)及逻辑复制2种。通过流复制技术,可以从实例级复制出一个与主库一模一样的实例级的从库。流复制同步方式有同步、异步两种。
俊才
2019/09/26
7K0
PostgreSQL13.0流复制尝鲜
postgresql13.0于2020年9月21日正式发布,话说现在pg的大版本从10开始发生了变化,以第一个数字代表一个大版本更新,而9之前的版本则是以9.1->9.2->9.x这样代表大版本更新。所以现在看起来pg的更新好像越来越快了,每个版本其实更新的内容不是很多。13发布后下载来了源码尝尝鲜,源码编译上没有什么改变,依旧很简单很亲和,四条简单的命令完成编译安装,对平台兼容性也很好。
数据库架构之美
2021/02/26
8810
PostgreSQL13.0流复制尝鲜
pg_rewind到底能做什么?
我们知道postgresql的主从切换有点麻烦,或者说操作步骤要求很严格。可能我们经常遇到这种情况,在没有将主库杀死的情况下将备库提升为主,这时主备库可能由于某种原因都在提供写入操作,这时发生脑裂,如果不考虑数据丢失因素,这时我们可能想将原来的主库以备库的模式重新加入集群,但是主备库此时的时间线已经偏离了,这时就需要我们的pg_rewind工具了。
数据库架构之美
2019/12/18
8360
PostgreSQL 之 pg_rewind使用详解
是postgresql主丛数据库之同步数据目录的工具。需要目标服务器在postgresql.conf 中允许wal_log_hints,或者在 initdb初始化集群时允许 checksums ,full_page_writes也必须为on
星哥玩云
2022/08/17
1.7K0
【DB宝91】PG高可用之主从流复制+keepalived 的高可用
通过keepalived 来实现 PostgreSQL 数据库的主从自动切换,以达到高可用。当主节点宕机时,从节点可自动切换为主节点,继续对外提供服务。
AiDBA宝典
2022/02/23
3K0
【DB宝91】PG高可用之主从流复制+keepalived 的高可用
5、pgpool-II高可用性(一)数据库的高可用性
使用 pgpool-II 软件;我们常用来实现流复制的高可用性;备库只读的,不可写;就是当主库出现问题时;需要把备库自动激活为主库;来接管服务。
huofo
2022/03/18
2.1K0
Postgresql主从复制
Postgresql主从复制 主备数据库启动,备库启动wal_receiver进程,wal进程向主库发送连接请求; 主库收到连接请求后启动wal_sender进程,并与wal_receiver进程建立tcp连接; 备库wal_receiver进程发送最新的wal lsn 给主库; 主库进行lsn 对比,定期向备库发送心跳信息,来确认备库的可用性,并且将没有传递的wal日志文件进行发送,同时调用SyncRepWaitForLSN()函数来获取锁存器,并且等待备库响应;锁存器的释放时机和主备同步模式的选择有
用户7353950
2022/05/11
9540
Postgresql主从复制
聊聊PostgreSQL的Replication
CAP理论 consistency:在整个集群角度来看,每个节点是看到的数据一致的;不能出现集群中节点出现数据不一致的问题 vailability:集群中节点,只有有一个节点能提供服务 partitioning:集群中的节点之间网络出现问题,造成集群中一部分节点和另外一部分节点互相无法访问 基本术语 Master节点:提供数据写的服务节点 Standby节点:根据主节点(master节点)数据更改,这些更改同步到另外一个节点(standby节点) Warm Standby节点:可以提升为master节点的s
用户4700054
2022/08/17
1.6K0
聊聊PostgreSQL的Replication
Postgresql PG_REWIND 怎么就这样不行
其实PG 早就想到这个问题了,PG有一个独特的命令 pg_rewind 可以帮助你,再造一个你。
AustinDatabases
2019/12/17
1.4K0
Postgresql  PG_REWIND 怎么就这样不行
postgresql 提升主库的操作
我们目前的postgresql是主从流复制模式,standby没有对外提供服务,只当做热备用。
保持热爱奔赴山海
2019/09/17
1.4K0
PostgreSQL主备环境搭建
PG学习初体验--源码安装和简单命令(r8笔记第97天) 记得在2年前写过一篇PostgreSQL的文章,当时处于兴趣,本来想在工作中接一下PG的业务,最后因为各种各样的原因就搁置了。 今天整理了下PostgreSQL的一些基础内容,参考的书是唐成老师的那本《PostgreSQL修炼之道》,有了Oracle和MySQL的基础,看起来会比从零开始要容易一些,总体的感觉,PG功能确实很多很全,功能上像Oracle看齐,技术风格和MySQL很像,在做一些总结的时候,不停的在两个数据库之间来回切换。 关于主备环
jeanron100
2018/03/30
2K0
PostgreSQL主备环境搭建
基于repmgr的postgresql主备高可用方案
本文比较基础,主要介绍postgresql开源高可用工具repmgr的部署和使用,初学者可以根据本文步骤一步一步做下去,废话不多说,直接进入主题,本文以两台机器为例。
数据库架构之美
2019/12/18
3.4K0
postgresql主从复制配置「建议收藏」
postgresql主从复制是一种高可用解决方案,可以实现读写分离。postgresql主从复制是基于xlog来实现的,主库开启日志功能,从库根据主库xlog来完成数据的同步。
全栈程序员站长
2022/09/22
3.7K0
postgresql主从复制配置「建议收藏」
pg_basebackup原理解析
pg_basebackup提供一个全量备份。常用来搭建流复制环境。属于物理备份。逻辑备份工具时pg_dump。参数说明:
yzsDBA
2021/06/25
2.1K0
pg_basebackup原理解析
相关推荐
PostgreSQL从小白到高手教程 - 第44讲:pg流复制部署
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档