PostgreSQL 流复制的主备切换

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 概述流复制的主库和备库的角色不是静态存在的,在维护过程中可以对二者进行角色切换。例如当主库硬件故障或主库需要调整参数需要重启系统时,通常要进行流复制的主备切换。如何判断主备角色在通常的主备架构下(一主多备,级联除外)有以下五种方法判断主备角色操作系统上查看wal发送进程或wal接收线程...

概述

流复制的主库和备库的角色不是静态存在的,在维护过程中可以对二者进行角色切换。例如当主库硬件故障或主库需要调整参数需要重启系统时,通常要进行流复制的主备切换。

如何判断主备角色

在通常的主备架构下(一主多备,级联除外)有以下五种方法判断主备角色

  • 操作系统上查看wal发送进程或wal接收线程
  • 数据库中查看pg_stat_replication表
  • 通过系统函数查看
    f说明是主库,t说明是备库
postgres=# select pg_is_in_recovery();
 pg_is_in_recovery 
-------------------
 f
(1 row)
  • 查看数据库控制信息
    通过pg_controldata命令,查看 Database cluster state一栏

如果是in production ,说明是主库

Database cluster state: in production
  • 通过recovery.conf 文件判断
    一般的,备库才有recovery.conf,主库一般没有或是改名为recovery.done

文件触发方式切换

在备库启动时在 recovery.conf 文件中加入一个触发文件的路径(新加则需要重启备库)

trigger_file='/pgdata/.postgresql.trigger.2019'

关闭主库

[postgres@GuangFa_PG9 pgdata]$ pg_ctl stop -m fast
waiting for server to shut down.... done
server stopped

在备库上创建那个刚刚新加的文件

[postgres@localhost pgdata]$ touch /pgdata/.postgresql.trigger.2019

可以看到备库上的recovery文件已经成为done了

-rw-rw-r--. 1 postgres postgres 239 Dec 25 21:50 recovery.done

此时备库已经被激活为主库,可以直接做读写操作了

[postgres@localhost pgdata]$ pg_controldata |grep cluster
Database cluster state: in production

现在我们把原来的主库当做备库重新开始搭建主备,方法和之前一样
准备recovery.conf文件
指向原来的备库,再重启数据库即可

pg_ctl promote方式切换

在文件触发方式下,需要配置参数和创建文件,比较繁琐。自PG9.1版本以后有了一个命令支持主备切换,就是pg_ctl promote命令

切换步骤如下:
1)关闭主库,建议使用-m fast 模式关闭
2)在备库上使用pg_ctl promote命令,直接将备库切为主库
3)在老主库上配置recovery.conf 文件,启动
4)查看主备状态并查看进程

如下:

[postgres@GuangFa_PG9 pgdata]$ pg_ctl promote
server promoting
[postgres@GuangFa_PG9 pgdata]$ pg_controldata |grep cluster
Database cluster state: in production

pg_rewind命令

首先我们先确认一下,使用这个命令的前提条件之一:

  • postgresql.conf 配置文件wal_log_hints参数值设为on
  • 数据库安装时通过initdb初始化数据库时使用了--data-checksums 选项

我们再来看一下这个命令的应用场景,在上述的两种方式的切换中,第二步都是关闭原主库,而且是强制关闭,因为关闭会有一个checkpoint的点。备库同步完成后,两边的数据是同样的一致性状态。这样原来的主很容易就能做新主的备库

但是如果在执行的过程中忘记了关闭主库,主库一直处于运行状态,那么这个旧主和新主在数据时间线上就不是一致的了。就会导致后续搭建备库失败

这个命令就是通过新主去同步旧主,使这两个库处于一致性的状态。类似于PG旧主的一次向前回滚。

是为了防止库级别太大,重搭建库过于麻烦。而出的一个命令

[postgres@GuangFa_PG9 pgdata]$ pg_rewind --help
pg_rewind resynchronizes a PostgreSQL cluster with another copy of the cluster.

Usage:
  pg_rewind [OPTION]...

Options:
  -D, --target-pgdata=DIRECTORY existing data directory to modify
      --source-pgdata=DIRECTORY source data directory to synchronize with
      --source-server=CONNSTR source server to synchronize with
  -n, --dry-run stop before modifying anything
  -P, --progress write progress messages
      --debug write a lot of debug messages
  -V, --version output version information, then exit
  -?, --help show this help, then exit
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
监控 数据可视化 关系型数据库
PostgreSQL主备库搭建
pg主备库的搭建,首先需在2个节点安装pg软件,然后依次在2个节点配置主备。 本文采用os为CentOS7.6,pg版本使用14.2,以下为详细部署步骤。
835 0
|
SQL 关系型数据库 MySQL
Ruoyi从mysql切换到postgresql的几个坑
本文详细介绍基于ruoyi的数据库从mysql切换到postgresql详细步骤。
1055 0
Ruoyi从mysql切换到postgresql的几个坑
|
关系型数据库 数据库 PostgreSQL
PostgreSQL环境搭建和主备构建 2
PostgreSQL环境搭建和主备构建
357 0
|
SQL 关系型数据库 Shell
PostgreSQL环境搭建和主备构建 1
PostgreSQL环境搭建和主备构建
81 0
|
SQL 存储 关系型数据库
PostgreSQL 流复制搭建主从环境,同步和异步的解释,压力测试,主从角色切换|学习笔记
快速学习PostgreSQL 流复制搭建主从环境,同步和异步的解释,压力测试,主从角色切换
930 0
PostgreSQL 流复制搭建主从环境,同步和异步的解释,压力测试,主从角色切换|学习笔记
|
SQL 存储 关系型数据库
9 PostgreSQL 点对点多主表级复制-触发器篇|学习笔记
快速学习9 PostgreSQL 点对点多主表级复制-触发器篇
411 0
9 PostgreSQL 点对点多主表级复制-触发器篇|学习笔记
|
存储 SQL Oracle
10 PostgreSQL 表级复制-物化视图篇, 支持异地,异构如 Oracle 到 pg 的物化视图|学习笔记
快速学习10 PostgreSQL 表级复制-物化视图篇,支持异地,异构如 Oracle 到 pg 的物化视图
528 0
10 PostgreSQL 表级复制-物化视图篇, 支持异地,异构如 Oracle 到 pg 的物化视图|学习笔记
|
存储 SQL 缓存
PostgreSQL 复制原理及高可用集群(一)|学习笔记
快速学习 PostgreSQL 复制原理及高可用集群(一)
405 0
PostgreSQL 复制原理及高可用集群(一)|学习笔记
|
SQL 消息中间件 算法
14 PostgreSQL 表级复制-Londiste3哈希数据分区复制|学习笔记
快速学习14 PostgreSQL 表级复制-Londiste3哈希数据分区复制
164 0
14 PostgreSQL 表级复制-Londiste3哈希数据分区复制|学习笔记
|
SQL 消息中间件 存储
PostgreSQL 表级复制-Londiste3安装以及使用|学习笔记
快速学习 PostgreSQL 表级复制-Londiste3安装以及使用
349 0
PostgreSQL 表级复制-Londiste3安装以及使用|学习笔记