首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
并发编程之缓存:SpringBoot整合ehcache2.x或3.x
基础配置 测试对象 @Data public class ProductInfoModel implements Serializable { private int id; private String title; private String desc; private BigDecimal price; private String icons; private int inventoryId; // 缓存最后更新的时间 pr
一行Java
2022/04/06
1.2K0
并发编程之缓存:SpringBoot整合ehcache2.x或3.x
另一种缓存,Spring Boot 整合 Ehcache
用惯了 Redis ,很多人已经忘记了还有另一个缓存方案 Ehcache ,是的,在 Redis 一统江湖的时代,Ehcache 渐渐有点没落了,不过,我们还是有必要了解下 Ehcache ,在有的场景下,我们还是会用到 Ehcache。
江南一点雨
2019/06/18
5500
Springboot整合ehcache缓存「建议收藏」
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说Springboot整合ehcache缓存「建议收藏」,希望能够帮助大家进步!!!
Java架构师必看
2022/02/15
1.1K0
Springboot整合ehcache缓存「建议收藏」
玩转EhCache之最简单的缓存框架
Ehcache是一个用Java实现的使用简单,高速,实现线程安全的缓存管理类库,ehcache提供了用内存,磁盘文件存储,以及分布式存储方式等多种灵活的cache管理方案。同时ehcache作为开放源代码项目,采用限制比较宽松的Apache License V2.0作为授权方式,被广泛地用于Hibernate, Spring,Cocoon等其他开源系统。Ehcache 从 Hibernate 发展而来,逐渐涵盖了 Cahce 界的全部功能,是目前发展势头最好的一个项目。具有快速,简单,低消耗,依赖性小,扩展性强,支持对象或序列化缓存,支持缓存或元素的失效,提供 LRU、LFU 和 FIFO 缓存策略,支持内存缓存和磁盘缓存,分布式缓存机制等等特点。
小程故事多
2018/08/22
2.9K0
玩转EhCache之最简单的缓存框架
一.使用Ehcache
本文最后更新于 878 天前,其中的信息可能已经有所发展或是发生改变。 1. pom <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.8.9</version> </dependency> 2. 创建 Ehcache 的配置文件 路径src/main/resources/hcahe.xml <ehcache xmlns:xsi="http://www.
Yuyy
2022/06/28
4860
一.使用Ehcache
(11)SpringBoot整合EhCache做缓存
EhCache 简介:EhCache 是一个纯Java的进程内缓存框架,是Hibernate中默认的CacheProvider;其缓存的数据可以存放在内存里面,也可以存放在硬盘上;其核心是CacheManager,一切Ehcache的应用都是从CacheManager开始的;它是用来管理Cache(缓存)的,一个应用可以有多个CacheManager,而一个CacheManager下又可以有多个Cache;Cache内部保存的是一个个的Element,而一个Element中保存的是一个key和value的配对,相当于Map里面的一个Entry。
IT云清
2022/05/07
1.3K0
springboot ehcache 配置使用方法
@CacheEvict(value="menucache", allEntries=true) ,更新缓存
FHAdmin
2021/06/25
1.1K0
EhCache缓存工具类 原
参考:https://blog.csdn.net/qq_34531925/article/details/79134903
wuweixiang
2018/08/14
1.1K0
SpringBoot配置EhCache缓存
在 src/main/resources 目录下创建 ehcache.xml 文件,内容如下:
崔笑颜
2020/06/08
1.4K0
SpringBoot2 整合Ehcache组件,轻量级缓存管理
EhCache是一个纯Java的进程内缓存框架,具有快速、上手简单等特点,是Hibernate中默认的缓存提供方。
知了一笑
2020/08/13
6440
Ehcache介绍及整合Spring实现高速缓存
Ehcache介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。它使用的是JVM的堆内存,超过内存可以设置缓存到磁盘,企业版的可以使用JVM堆外的物理内存。 Spring整合Ehcache 首先加入最新的ehcache的maven依赖 <!-- ehcache --> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>
Java技术栈
2018/03/30
1.6K0
Ehcache介绍及整合Spring实现高速缓存
SpringBoot整合Ehcache
  本文介绍下SpringBoot整合SpringDataJPA后加入缓存组件Ehcache的操作。
用户4919348
2019/05/21
1.3K0
spring ehcache配置以及使用(afterPropertiesSet)
大家好,又见面了,我是你们的朋友全栈君。spring 配置ehcache例子:[url]http://blog.csdn.net/linfanhehe/article/details/7693091[/url] [color=red][b]主要特性[/b][/color] 1. 快速. 2. 简单. [b]3. 多种缓存策略[/b] 4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题 5. 缓存数据会在虚拟机重启的过程中写入磁盘 [b]6. 可以通过RMI、可插入API等方式进行分布式缓存[/b] 7. 具有缓存和缓存管理器的侦听接口 8. 支持多缓存管理器实例,以及一个实例的多个缓存区域 [b]9. 提供Hibernate的缓存实现[/b]
全栈程序员站长
2022/07/23
4860
Spring Boot---(14)Spring Boot 整合EhCache做缓存
EHCache是来自sourceforge(http://ehcache.sourceforge.net/) 的开源项目,也是纯Java实现的简单、快速的Cache组件。EHCache支持内存和磁盘的缓存,支持LRU、LFU和FIFO多种淘汰算法,支持分布式的Cache,可以作为Hibernate的缓存插件。同时它也能提供基于Filter的Cache,该Filter可以缓存响应的内容并采用 Gzip压缩提高响应速度。
IT云清
2019/01/22
1.1K0
Spring接口缓存实现方案Caffeine和EhCache
1.引入jar包 compile("com.github.ben-manes.caffeine:caffeine:2.8.6") compile("org.springframework.boot:spring-boot-starter-cache") 2.application.properties ##配置ehcache spring.cache.ehcache.config = classpath:/ehcache.xml spring.cache.type = ehcache
oktokeep
2024/11/21
1590
Ehcache配置详解及CacheManager使用
timeToIdleSeconds 当缓存闲置n秒后销毁 timeToLiveSeconds 当缓存存活n秒后销毁 缓存配置 name:缓存名称。 maxElementsInMemory:缓存最大个数。 eternal:对象是否永久有效,一但设置了,timeout将不起作用。 timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。 timeToL
小柒2012
2018/04/13
1.8K0
SpringBoot中Shiro缓存使用Redis、Ehcache
SpringBoot 中配置redis作为session 缓存器。 让shiro引用
云扬四海
2019/08/19
2.8K0
ehcache的配置使用
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
逝兮诚
2019/10/30
8730
Redis应用—8.相关的缓存框架
整体上看,Ehcache的使用是相对简单便捷的,提供了完整的各类API接口。需要注意,虽然Ehcache支持磁盘的持久化,但是由于存在两级缓存介质,在一级内存中的缓存如果没有主动刷入磁盘持久化,则在应用异常宕机时,依然会出现缓存数据丢失,为此可以根据需要将缓存刷到磁盘。将缓存条目刷到磁盘的操作可以通过cache.flush()方法来执行。需要注意:将对象写入磁盘前,要先将对象进行序列化。
东阳马生架构
2025/03/07
1810
有Redis为什么还要本地缓存?谈谈你对本地缓存的理解?
本地缓存是将数据存储在应用程序所在的本地内存中的缓存方式。既然,已经有了 Redis 可以实现分布式缓存了,为什么还需要本地缓存呢?接下来,我们一起来看。
磊哥
2024/11/01
2060
相关推荐
并发编程之缓存:SpringBoot整合ehcache2.x或3.x
更多 >
交个朋友
加入架构与运维学习入门群
系统架构设计入门 运维体系构建指南
加入架构与运维工作实战群
高并发系统设计 运维自动化实践
加入前端学习入门群
前端基础系统教学 经验分享避坑指南
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档