关于集群节点 timeline 不一致的处理方式

本文出处:https://www.modb.pro/db/400223

在 PostgreSQL/MogDB/openGauss 数据库日常维护过程中,如果多次对数据库进行角色切换,可能会出现 timeline 不一致的情况,导致备库不能正常加入到数据库集群,现在以 PG 为例对这些可能发生的情况进行复现,并进行整理。

timeline 介绍

为了将基于时间点恢复后生成的 WAL 记录序列与初始数据库历史中产生的 WAL 记录序列区分开来,避免原来的 wal 文件被覆盖,同时也为了避免管理混乱,PostgreSQL 数据库引入了“时间线”的概念,使其可以通过备份恢复到任何之前的状态,包括早先被放弃的时间线分支中的状态。

当一次归档恢复完成,一个新的时间线被创建来标识恢复之后生成的 WAL 记录序列。时间线 ID 号是 WAL 段文件名的一部分,因此一个新的时间线不会重写由之前的时间线生成的 WAL 数据。

场景一

--主库日志

ERROR: requested starting point 0/8000000 on timeline 1 is not in this server's history

DETAIL: This server's history forked from timeline 1 at 0/6018D98.

STATEMENT: START_REPLICATION 0/8000000 TIMELINE 1

--备库日志

LOG: new timeline 2 forked off current database system timeline 1 before current recovery point 0/80000A0

FATAL: could not start WAL streaming: ERROR: requested starting point 0/8000000 on timeline 1 is not in this server's history

DETAIL: This server's history forked from timeline 1 at 0/6018D98.

发生场景

备库 promote 为主库,源主库以备库的方式重新加入集群

以备份的方式恢复为新主库,源主库以备库的方式加入集群

处理方式

重建备库,适用数据量较小的数据库

借助 pg_rewind 工具,推荐使用这种方式 pg_rewind 会把所有的配置文件都覆盖,建议提前做好备份 并在启动前添加 recovery.conf 或 standby.signal 文件

pg_rewind 相关报错

pg_rewind: fatal: target server needs to use either data checksums or "wal_log_hints = on"

即使数据库已经开启了wal_log_hints = on,依然报这个错,这时需要以primary的形式重启一下数据库。

pg_rewind: source and target cluster are on the same timeline

pg_rewind: no rewind required

主备时间线一致,无法直接使用,这时需要让目标节点先以备库的方式运行,然后通过promote提升为主节点,增加timeline,再次执行pg_rewind

pg_rewind: fatal: could not find common ancestor of the source and target cluster's timelines

建议直接重建备库

场景二

--备库启动失败

LOG: entering standby mode

FATAL: requested timeline 2 is not a child of this server's history

DETAIL: Latest checkpoint is at 0/8000028 on timeline 1, but in the history of the requested timeline, the server forked off from that timeline at 0/6018D98.

LOG: startup process (PID 1059) exited with exit code 1

发生场景

在场景一中启动数据库,会将新主库的 00000002.history 传输到备库本地

[postgres@bogon pg_wal]$ ls -l

total 49160

-rw-------. 1 postgres postgres 332 May 5 20:52 000000010000000000000004.00000028.backup

-rw-------. 1 postgres postgres 16777216 May 6 08:54 000000010000000000000008

-rw-------. 1 postgres postgres 16777216 May 6 08:49 000000010000000000000009

-rw-------. 1 postgres postgres 16777216 May 6 08:54 00000001000000000000000A

-rw-------. 1 postgres postgres 32 May 6 08:58 00000002.history

drwx------. 2 postgres postgres 88 May 6 08:58 archive_status

处理方式

将pg_wal、archive_status 和 归档目录 中的 00000002.history 删除即可

[postgres@bogon pg_wal]$ rm -f 00000002.history

[postgres@bogon pg_wal]$ cd archive_status/

[postgres@bogon archive_status]$ ls -l

total 0

-rw-------. 1 postgres postgres 0 May 5 20:52 000000010000000000000004.00000028.backup.done

-rw-------. 1 postgres postgres 0 May 6 08:58 00000002.history.done

[postgres@bogon archive_status]$ rm -rf *

[postgres@bogon archive_status]$

场景三

LOG: started streaming WAL from primary at 0/7000000 on timeline 2

FATAL: could not receive data from WAL stream: ERROR: requested starting point 0/7000000 is ahead of the WAL flush position of this server 0/601A5D8

cp: cannot stat ‘/data/pgarchive/00000003.history’: No such file or directory

cp: cannot stat ‘/data/pgarchive/000000020000000000000007’: No such file or directory

发生场景

备库以单机(未加入集群,以 primary 的角色)的方式启动过,虽然时间线没变,但是 wal 文件已经不一致

处理方式 此时由于备库的需要从 0/7000000 开始进行重放,已经比主库的 0/601A5D8 提前,说明此时数据库已经不一致。 尝试过修改通过 pg_resetwal 修改 timeline,也尝试过通过 pg_switch_wal()切换 wal 文件,依然无法通过 pg_rewind 进行处理,原因是 wal 不连续,只能选择重建

--修改timeline

postgres=# SELECT timeline_id,redo_wal_file FROM pg_control_checkpoint();

timeline_id | redo_wal_file

-------------+--------------------------

2 | 00000002000000000000000F

(1 row)

$pg_resetwal -l 000000030000000000000010 /data/pgdata14/

Write-ahead log reset

--修改时间线

postgres=# SELECT timeline_id,redo_wal_file FROM pg_control_checkpoint();

timeline_id | redo_wal_file

-------------+--------------------------

3 | 000000030000000000000012

(1 row)

--切换wal

postgres=# select pg_switch_wal();

$ pg_ctl promote -D /data/pgdata14

总结

备库在运行过程中,以 promote 的方式提升为主,即使有数据写入,只要 wal 完整,也可以使用 pg_rewind 回退. 在 pg_rewind 完成后启动,注意修改参数文件、hba 文件、清理归档日志及添加 standby.signal/recovery.conf

备库在运行过程中,以主库的方式重启过,即使没有任何操作,也没有办法回退,只能重建 只要中间以主库运行过,wal 就没有办法连续了

关于集群节点timeline不一致的处理方式的更多相关文章

  1. hadoop中集群节点ID不一致( java.io.IOException: Incompatible clusterIDs )

  2. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:4.安装Oracle RAC FAQ-4.3.Oracle 集群节点间连通失败

    1.检查节点连通性的错误 [grid@linuxrac1 grid]$ ./runcluvfy.sh stage -post hwos -n linuxrac1,linuxrac2 -verbose ...

  3. Akka(12): 分布式运算:Cluster-Singleton-让运算在集群节点中自动转移

    在很多应用场景中都会出现在系统中需要某类Actor的唯一实例(only instance).这个实例在集群环境中可能在任何一个节点上,但保证它是唯一的.Akka的Cluster-Singleton提供 ...

  4. 【故障公告】10:30-10:45 左右 docker swarm 集群节点问题引发故障

    非常抱歉,今天 10:30-10:45 左右由于 docker swarm 集群节点出现问题,造成除博客之外的站点出现访问异常,由此给您带来很大的麻烦,请您谅解. 故障开始时出现有时访问正常有时访问出 ...

  5. Kubernetes从懵圈到熟练:读懂这一篇,集群节点不下线

    排查完全陌生的问题,完全不熟悉的系统组件,是售后工程师的一大工作乐趣,当然也是挑战.今天借这篇文章,跟大家分析一例这样的问题.排查过程中,需要理解一些自己完全陌生的组件,比如systemd和dbus. ...

  6. Rabbitmq关于集群节点功能的读书笔记

    消息和队列可以指定是否持久化,如果指定持久化则会保存到硬盘上 ,不然只在内存里 普通集群模式下持久化的队列不能重建了 内存节点和磁盘节点的区别就是将元数据放在了内存还是硬盘,仅此而已,当在集群中声明队 ...

  7. Quartz的集群模式和单机模式共存-让一个非集群的Quartz与集群节点并行着运行

    假如你让一个非集群的 Quartz 应用与集群节点并行着运行,设法使用 JobInitializationPlugin和 RAMJobStore Quartz支持可选节点执行jobquartz集群,会 ...

  8. 删除RAC集群节点

    删除GRID集群节点:参考oracle database 11g RAC手册(第二版) 目前GRID集群中节点信息:[grid@node1 ~]$ olsnodesnode1node2node3nod ...

  9. 如何诊断 11.2 集群节点驱逐问题 (文档 ID 1674872.1)

    适用于: Oracle Database - Enterprise Edition - 版本 11.2.0.1 到 11.2.0.2 [发行版 11.2]本文档所含信息适用于所有平台 用途 这篇文档提 ...

  10. 集群节点Elasticsearch升级

    集群节点Elasticsearch升级 操作流程 1.首先执行Elasticsearch-1.2.2集群的索引数据备份 2.关闭elasticsearch-1.2.2集群的recovery.compr ...

随机推荐

  1. 【Azure 存储服务】Azure Data Lake Storage (ADLS) Gen2 GRS Failover是否支持自动切换或者手动切换到灾备的终结点呢?

    问题描述 在Azure的存储服务中,介绍灾备恢复和Storage Account故障转移的文档中,有一句话"Account failover is not supported for sto ...

  2. 【Azure 微服务】Service fabric升级结构版本失败问题

    问题描述 Service fabric升级结构版本失败,Service Fabric的可靠性层是白银层,持久性层为青铜层,当把节点从6个直接在虚拟规模集(VMSS)中缩放成了3个.从而引起了Servi ...

  3. 线段树-多个懒标记pushdown

    P3373 [模板]线段树 2 这里需要用到两个懒标记,一个懒标记为add,记录加,另一个懒标记为mul,记录乘. 我们需要规定一个优先级,然后考虑如何将懒标记下传. 这里无非有两种顺序,一种是先乘后 ...

  4. 使用go语言开发自动化API测试工具

    前言 上一篇文章说到我还开发了一个独立的自动测试工具,可以根据 OpenAPI 的文档来测试,并且在测试完成后输出测试报告,报告内容包括每个接口是否测试通过和响应时间等. 这个工具我使用了 go 语言 ...

  5. APISIX的安装和简单使用

    APISIX 是一个云原生.高性能.可扩展的微服务 API 网关. 它是基于 Nginx 和 etcd 来实现,和传统 API 网关相比,APISIX 具备动态路由和插件热加载,特别适合微服务体系下的 ...

  6. Android 优雅的Activity回调代码封装

    原文地址: Android 优雅的Activity回调代码封装 - Stars-One的杂货小窝 之前提到Jetpack架构组件学习(3)--Activity Results API使用 - Star ...

  7. spring boot 自动装载对象为null问题的解决

    情况描述 有个Server类,成员变量是spring中自动管理的bean类对象 public class Server { @Autowired private CommandMapper comma ...

  8. 公开的Webservice集锦

    备注:以下所有的来自 互联网,版权归原作者所有 股票行情数据 WEB 服务(支持香港.深圳.上海基金.债券和股票:支持多股票同时查询) Endpoint: http://webservice.webx ...

  9. shell求水仙花数

    水仙花数(100-999).水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身 c++代码 int i=100; while(i<=999){ int sum=0; int ...

  10. java基础的项目

    334,零钱通 思路: (1) 先完成显示菜单,并可以选择菜单,给出对应提示 (2) 完成零钱通明细,简单的话可以使用String拼接 (3)完成收益入账   完成功能驱动程序员增加新的变化和代码 ( ...