关于集群节点 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. 文心一言 VS 讯飞星火 VS chatgpt (207)-- 算法导论15.4 4题

    四.说明如何只使用表 c 中 2*min(m,n) 个表项及O(1)的额外空间来计算LCS的长度.然后说明如何只用 min(m,n) 个表项及O(1)的额外空间完成相同的工作.要写代码的时候,请用go ...

  2. Java static关键字的小练习

    1 package com.bytezreo.statictest; 2 3 /** 4 * 5 * @Description static 关键字的使用 小练习 6 * @author Byteze ...

  3. inputNextFocus vue - js 跳转 下一个 tab

    inputNextFocus vue - js 跳转 下一个 tab <template> <Input v-model="val1" ref="inp ...

  4. 基于恒玄WT250芯片的蓝牙辅听耳机方案调试总结

    前记 在蓝牙辅听领域卷了几年之后.各种型号的蓝牙辅听器都做过.这次,客户需要一款性价比超高的蓝牙辅听器.经过成本以及功能考量的筛选.最终定下来使用wt250来做一款低成本的蓝牙辅听器. 硬件部分 wt ...

  5. java方法的内存及练习

    方法的内存 一.方法调用的基本内存原理: Java内存分配 栈: 方法运行时使用的内存方法进栈运行,运行完毕就出栈 堆: newl出来的,都在堆内存中开辟了一个小空间 方法区: 存储可以运行的clas ...

  6. 记录--手把手教你,用electron实现截图软件

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 背景 因为我们日常开发项目的时候,需要和同事对接api和文档还有UI图,所以有时候要同时打开多个窗口,并在多个窗口中切换,来选择自己要的信 ...

  7. 记录--巧用 overflow-scroll 实现丝滑轮播图

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言: 近期我在项目中就接到了一个完成轮播图组件的需求.最开始我也像大家一样,直接选择使用了知名的开源项目 "Swiper&qu ...

  8. Docker 中使用 scratch 镜像构建 Go 应用镜像,容器报错:X509: Certificate Signed by Unknown Authority

    本文首发于 Ficow Shen's Blog,原文地址: Docker 中使用 scratch 镜像构建 Go 应用镜像,容器报错:X509: Certificate Signed by Unkno ...

  9. 《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南 - 第5章

    本章勘误: 暂无,等待细心的你告诉我哦. 本章注解: 出处:207页 原文: 在我们的应用程序中,是不太可能出现LargeHeapHandleTable的问题的.一般来说,可能出现问题会是在需要(动态 ...

  10. vue中elementui表格错位问题解决(一次到位)

    引入element-resize-detector 在项目引入插件(用来监听元素宽度变化) npm install element-resize-detector --save 在文件中引入(写在sc ...