PostgreSQL实战之物理复制和逻辑复制(五)

news2025/1/24 2:21:15

目录

PostgreSQL实战之物理复制和逻辑复制(五)

5 流复制主备切换

5.1 判断主备角色的五种方法

5.2 主备切换之文件触发方式

5.3 主备切换之pg_ctl promote方式

5.4 pg_rewind


PostgreSQL实战之物理复制和逻辑复制(五)

5 流复制主备切换

        流复制的主库和备库角色不是静态存在的,在维护过程中可以对两者进行角色切换,例如当主库硬件故障或主库系统参数调整需要重启操作系统时,通常进行流复制主备切换,这一小节将介绍手工主备切换,主备切换的方式有两种,一种是通过创建触发器文件方式触发主备切换,另一种方式通过pg_ct| promot命令触发主备切换。
        目前PostgreSQL高可用方案大多基于流复制环境进行部署,流复制主备切换是PostgreSQL高可用方案的基础。

5.1 判断主备角色的五种方法


        进行流复制主备切换之前首先得知道当前数据库的角色,这里提供五种方法判断数据库角色,测试环境为一主一备,这些方法同样适用于一主多备环境,对于级联复制或逻辑复制的场景不完全适用,但基本思想是一致的。
        方式一:操作系统上查看WAL发送进程或WAL接收进程
之前介绍了流复制部署过程,大家知道流复制主库上有WAL发送进程,流复制备库上有WAL接收进程,根据这个思路,在数据库主机上执行以下命令,如果输出wa| sender ..streaming进程则说明当前数据库为主库:

[postgresepghost1 ~]$ ps -ef | grep "wa|" | grep -v "grep"
postgres 16666 166610 sep06 ? 00:00:09 postgres: wa| writer process
postgres 16672 166610 sep06 ? 00:00:13 postgres: wa| sender process repuser
192.168.28.75(57872)streaming 3/9C34BCB8
如果输出 wa| receiver .. streaming进程则说明当前数据库为备库,如下所示:
[postgres@pghost2 ~] $ ps -ef | grep "wa|" | grep -v "grep"
postgres 2729122567osep06 ?   00:00:32 postgres: wa| receiver process
    streaming 3/9C355788

           方式二:数据库上查看WAL发送进程或WAL接收进程
同样,也可以在数据库层面查看WAL发送进程和 WAL接收进程,例如在主库上查询pg_stat_rep|ication视图,如果返回记录说明是主库,备库上查询此视图无记录,如下所示:

postgres=# SELECT pid,usename,app|ication_name,c|ient_addr,state,sync_state
           FROM pg_stat_rep|ication ;
pid        |   usename  | app|ication_name |  client_addr |   state   | sync_state
-----------+------------+------------------+ -----+-------+------------------------
16672        |  repuser   |       node2      |192.168.28.75 | streaming | sync
(1 row)

同样,在备库上查看pg_stat_wal_receiver视图,如果返回记录说明是备库,流复制主库上此视图无记录,如下所示:

postgres=# SELECT pid,status,|ast_msg_send_time,|ast_msg_receipt_time,conninfo
           FROM pg_stat_wal_receiver ;
-[ RECORD1 ]------------+---------------------------------------------------
pid                        |    17551
status                    |     streaming
last_msg_send_time        |    2017-10-07 09:22:07.479282+08
last_msg_receipt_time   |     2017-10-07 09:22:07.480277+08
conninfo                |   user=repuser passfi|e=/home/postgres/.pgpass dbname=
    replication host=192.168.28.74 port=1921 application_name=slavel fallback_application_name=walreceiver sslmode=disab|e ss|compression=1 target_session_attrs=any

        方式三:通过系统函数查看
登录数据库执行以函数,如下所示:

postgres=# SELECT pg_is_in_recovery();
pg_is_in_recovery
-----------------
t
(1 row)

如果返回t说明是备库,返回f说明是主库。方式四:查看数据库控制信息
通过pg_controldata命令查看数据库控制信息,内容包含WAL日志信息、checkpoint,数据块等信息,通过Database cluster state信息可判断是主库还是备库,如下所示:

[postgresepghost1 ~]$ pg_controldata | grep clusterDatabase cluster state :
in production

以上查询结果返回in production表示为主库,返回in archive recovery表示是备库,如下所示:

[postgres@pghost2 ~] $ pg_controldata | grep clusterDatabase cluster state :
in archive recovery 

        方式四:查看数据库控制信息

通过pg_controldata命令查看数据库控制信息,内容包含WAL日志信息、checkpoint、数据块等信息,通过Database cluster state信息可判断是主库还是备库,如下所示:

[postgres@pghost1 ~] $ pg_controldata | grep cluster
Database cluster state:                in production

以上查询结果返回in production表示为主库,返回in archive recovery表示是备库,如下所示:

[postgres@pghost2 ~] $ pg_controldata | grep cluster
Database cluster state:                    in archive recovery

        方式五:通过recovery.conf 配置文件查看
根据之前小节流复制部署过程,在备库SPGDATA目录下会创建recovery.conf配置文件,如果存在这个文件说明是备库,如果SPGDATA目录不存在此文件或此文件后缀名是recovery.done 则说明是主库。

5.2 主备切换之文件触发方式

PostgreSQL9.0版本流复制主备切换只能通过创建触发文件方式进行,本章将介绍这种主备切换方式,测试环境为一主一备异步流复制环境,pghostl上的数据库为主库,pghost2上的数据库为备库,文件触发方式的手工主备切换主要步骤如下:
1)配置备库recovery.conf文件 trigger_file参数,设置激活备库的触发文件路径和名称。
2)关闭主库,建议使用-m fast模式关闭。
3)在备库上创建触发文件激活备库,如果recovery.conf变成recovery.done表示备库已经切换成主库。
4)这时需要将老的主库切换成备库,在老的主库的$PGDATA目录下创建recovery.conf文件(如果此目录下不存在recovery.conf文件,可以根据$PGHOME/recovery.conf.sample模板文件复制一个,如果此目录下存在recovery.done文件,需将recovery.done文件重命名为recovery.conf),配置和老的从库一样,只是primary_conninfo参数中的IP换成对端IP。
5)启动老的主库,这时观察主、备进程是否正常,如果正常表示主备切换成功。首先在备库上配置recovery.conf,如下所示:

recovery_target_timeline = 'latest'
standby_mode = on
primary_conninfo = 'host=192.168.28.74  port=1921  user=repuser'
trigger_file = '/database/pg10/pg_root/.postgresql.trigger.1921'

trigger_file可以配置成普通文件或隐藏文件,调整以上参数后需重启备库使配置参数生效。
之后关闭主库,如下所示:

[postgres@pghost1 ~]$ pg_ctl stop -m fastwaiting for server to shut down . . . . done
server stopped

在备库上创建触发文件激活备库,如下所示:

[postgres@pghost2 pg_root] $ ll recovery.conf
--rw-r--r-- 1 postgres postgres 5.8K Sep 8 20:47 recovery.conf
[postgres@pghost2 pg_root]$ touch /database/pg10/pg_root/.postgresql.trigger.1921

触发器文件名称和路径需和recovery.conf配置文件trigger_file保持一致,再次查看recovery文件时,发现后辍由原来的.conf变成了.done。

[postgres@pghost2 pg_root]$ ll recovery .done
-rw一r——r-- 1 postgres postgres 5.8K Sep 8 20:47 recovery.done

查看备库数据库日志,如下所示:

根据备库以上信息,由于关闭了主库,首先日志显示连接不上主库,接着显示发现了触发文件,之后显示恢复成功,数据库切换成读写模式。
这时根据pg_controldata输出进行验证,如下所示:

[postgres@pghost2 pg_root] $ pg_controldata | grep clusterDatabase cluster state :
in production

以上显示数据库角色已经是主库角色,在pghost2上创建一张名为test_alived的表并插入数据,如下所示:

postgres=# CREATE TABLE test_alived2(id int4) ;
CREATE TABLE
postgres=#INSERT INTO test_alived2 VALUES(1);
INSERT 0 1

之后,根据步骤4)的内容我们准备将老的主库切换成备库角色,在老的主库上配置recovery.conf,如下所示:

recovery_target_timeline = ' latest'
standby mode = on
primary_conninfo = 'host=192.168.28.75  port=1921 user=repuser'  
trigger_file ='/database/pg10/pg_root/.postgresql.trigger.1921'

以上配置和 pghost2上的recovery.done配置文件一致,只是primary_conninfo参数的host选项配置成对端主机IP。
之后在pghost1上的postgres主机用户家目录创建~/.pgpass文件,如下所示:

[postgres@pghost1 ~]$ touch ~/.pgpass
[postgres@pghost1 ~]$ chmod 600~/.pgpass

并在~l.pgpass文件中插入以下内容:

192.168.28.74:1921 :replication : repuser:re12a345
192.168.28.75:1921 :replication : repuser:rel2a345

之后启动pghost1 上的数据库,如下所示:

[postgres@pghost1 ~] $ pg_ctl start

启动后观察数据库日志,发现数据库启动正常,查看数据库表,发现test_alived2表也有了,如下所示:

postgres=# SELECT * from test_alived2 ;
id
-------
(1 row)

同时,pghost1上已经有了WAL接收进程,pghost2上有了WAL发送进程,说明老的主库已经成功切换成备库,以上是主备切换的所有步骤。

5.3 主备切换之pg_ctl promote方式

 上一节介绍了以文件触发方式进行主备切换,PostgreSQL9.1版本开始支持pg_ctlpromote触发方式,相比文件触发方式操作更方便,promote命令语法如下:

pg_ctl promote [-D datadir]

-D是指数据目录,如果不指定会使用环境变量$PGDATA设置的值。promote命令发出后,运行中的备库将停止恢复模式并切换成读写模式的主库。
pg_ctl promote主备切换步骤和文件触发方式大体相同,只是步骤1中不需要配置recovery.conf配置文件中的trigger_file参数,并且步骤3中换成以pg_ctl promote方式进行主备切换,如下:
1)关闭主库,建议使用-m fast模式关闭。
2)在备库上执行pg_ctl promote命令激活备库,如果recovery.conf变成recovery.done表示备库已切换成为主库。
3)这时需要将老的主库切换成备库,在老的主库的SPGDATA目录下创建recovery.conf文件(如果此目录下不存在recovery.conf文件,可以根据$PGHOME/recovery.conf.sample模板文件复制一个,如果此目录下存在recovery.done文件,需将recovery.done文件重命名为recovery.conf),配置和老的从库一样,只是 primary_conninfo参数中的IP换成对端IP。
4)启动老的主库,这时观察主、备进程是否正常,如果正常表示主备切换成功。
以上是pg_ctl promote主备切换的主要步骤,这一小节不进行演示了,下一小节介绍pg_rewind工具时会给出使用pg_ctl promote进行主备切换的示例。

5.4 pg_rewind

pg_rewind 是流复制维护时一个非常好的数据同步工具。
使用pg_rewind的前提条件为以下之一:
(1)postgresql.conf配置文件wal_log_hints参数设置成on。
(2)数据库安装时通过initdb初始化数据库时使用了--data-checksums选项,这个选项开启后会在数据块上进行检测以发现I/O错误,此选项只能在 initdb时设置,开启后性能有损失。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/151282.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue作业

文章目录作业1作业2作业3作业4作业1 作业:需要用data保存:商品名、单价、数量,然后显示到页面上,点击按钮可以变更数量,最小值1,减按钮不可用,最大值20,隐藏按钮 总价格应该是 单价…

酒业“新物种”的新思维:用户、品牌、模式

【潮汐商业评论/原创】中国的酒文化源远流长。古人有一万种喝酒的理由,或聚会畅饮,或独酌解忧,而餐桌是酒最常出现的地方。如今,与酒相关的场景日益多元,往往洋溢着青春的气息。一顶帐篷,三两好友围坐&…

一、数据仓库基础理论

数据仓库基础理论一、数据仓库1、概念2、数据仓库分层结构3、为什么要分层二、数据集市三、数据湖1、数据湖和数据仓库一、数据仓库 1、概念 数据仓库(Data Warehouse, DW):一个面向主题的、集成的、非易失的、反应历史变化的、用来支持企业…

哈弗品牌发布新能源越野新品类车型:H-DOG

1月6日,哈弗品牌新能源车型哈弗H-DOG在海口新能源车展亮相。哈弗H-DOG针对用户5天通勤、2天郊野、e享时刻三大使用场景打磨,满足用户“可城、可野、可电”的用车需求,是哈弗品牌在新能源轻越野上的全新探索。• 哈弗H-DOG采用了全新的潮野力量…

Sentinel降级策略-RT、异常比例、异常数

Sentinel降级—RT 1)RT:平均响应时间;配置平均响应时间为200ms,200ms内就要将请求处理完成; 2)注意:Sentinel 默认统计的 RT 上限是4900ms,超出此阈值会算作 4900ms ,若…

【PyTorch深度学习实践】05_逻辑斯蒂回归

文章目录1. 分类问题相关数据集1.1 MINIST1.2 CIFAR-102. 回归(Regression)VS分类(Classification)2.1 模型对比2.2 损失函数对比2.3 实现代码对比3. 完整代码之前使用线性回归解决的都是**回归(预测)**问题,逻辑斯蒂回归模型可以用来解决另一…

MySQL数据库:数据基本的增删改查

一、查询数据 1.查询表内所有数据 select * from 表名; 2.指定列查询 select 字段1, 字段2, …… from 表名; 3.查询字段为表达式 select 表达式1, 表达式2,…… from 表名; 4.起表名查询 如果对查询结果的字段名不满意,还可以自己进行取别名。 select 字段1 …

#Reading Paper# 【序列推荐】Session-based Recommendation with Graph Neural Networks

#论文题目:【序列推荐】SR-GNN: Session-based Recommendation with Graph Neural Networks(SR-GNN:基于会话的图神经网络推荐) #论文地址:https://arxiv.org/abs/1811.00855 #论文源码开源地址: https://github.com/C…

如何设置Windows文件夹背景为黑色?(其实就是“深色模式”)

大家好。我们直接进入正题! 如何把Windows文件夹背景改成黑色?就像下面这样。 第一步:打开 “个性化” 设置界面 这里介绍两种方法:(1)在电脑桌面 右键——》 个性化 ,如下图 (2)点击 开始——》设置 ——》个性化 ,如…

Typora+upic的配置

typora upic 的配置 背景说明 本人使用的是Mac book 的M1芯片电脑,为了方便写博客,整理了图片上传的方式; upic是一款上传图片的工具,主要为了帮助写博客上传工具使用的,方便上传图片; 配置七牛云的图床…

如何在 Kubernetes 部署 PostgreSQL

文章目录1. 简介2. 条件3. helm 部署 posgresql3.1 添加 Helm 存储库3.2 默认安装3.3 选参安装3.4 持久存储安装3.4.1 创建 PersistentVolume3.4.2 创建 PersistentVolumeClaim3.4.3 安装 Helm Chart3.4.5 连接到 PostgreSQL 客户端3.5 自定义配置 value.yaml4. 手动部署 postg…

Anaconda、CUDA、Pytorch安装

文章目录Anaconda、CUDA、Pytorch安装安装Anaconda安装CUDA安装cuDNN安装Pytorch小技巧验证原文链接: Tommy Shang的博客Anaconda、CUDA、Pytorch安装 很久没有更新博客,最近给实验室的机器安装Pytorch环境,顺手也把自己的机器装了一遍。 整…

《凤凰项目》读后感

无极限零部件公司的问题不提变更单导致变更引起很多问题,变更登记系统推行不下去不知道自己团队有多少项目在运行导致无法预估人力,进度怎么样,项目管理系统推行不下去安全部门提出各种安全问题,补丁安装审计部门提出各种审计不合…

Java学习之代码块

目录 一、代码块的基本介绍 二、基本语法 注意事项 三、代码块的好处和案例演示 四、注意事项和使用细节 第一点 第二点 第三点 案例演示 第四点 第五点 第六点 第七点 五、练习题 第一题 第二题 考察知识点 结论 结果 一、代码块的基本介绍 代码化块又称为初…

【论文导读】Deep Stable Learning for Out-Of-Distribution Generalization

DWR用到复杂数据集中。 看了一半发现一个博客将的也不错 放在这里Deep Stable Learning for Out-Of-Distribution Generalization_六点先生的博客-CSDN博客_随机傅里叶特征 目标任务: 一般假设(训练数据的已知异质性(如领域标签&#xff0…

FGH75T65SHD-F155 场截止沟槽 IGBT单管 应用于太阳能逆变器、UPS等多种应用

FGH75T65SHD-F155采用新型场截止 IGBT 技术,为太阳能逆变器、UPS、焊接机、电信、ESS 和 PFC 等低导通和开关损耗至关重要的应用提供最佳性能。 ONsemi安森美IGBT单管系列: FGH40N60SMD FGH60N60SMD FGH75T65SHD-F155 NGTB40N120FL2WG 特性&#x…

架构设计---用户加密处理

前言: 在互联网各种安全问题中,最能引发话题,刺激大众神经的就是用户的泄密问题,数据库被拖库导致所有的数据泄露,这种系统安全问题涉及的因素可能有很多,大部分和开发软件的程序员没有关系,但…

【PyTorch深度学习实践】03_反向传播

文章目录1.计算图2.反向传播2.1 链式求导法则2.2 反向传播过程3.Pytorch中前馈和反馈的计算3.1 Tensor3.2 代码演示对于简单的模型,梯度变换可以用解析式表达进行手算,但是复杂模型(很多w,b)的损失函数需要挨个写解析式…

【黑马】瑞吉外卖-Day03、04笔记

瑞吉外卖Day03、04 公共字段自动填充 使用MybatisPlus实现 问题分析 代码实现 Mybatis Plus公共字段自动填充,也就是在插入或者更新的时候为指定字段赋予指定的值,使用它的好处就是可以统一对这些字段进行处理,避免了重复代码。 实现步骤…

【学习】life long learning

文章目录life long learningLLL的难点评估二、LLL的三个解法1、Selective Synaptic Plasticity选择性突触可塑性为什么会有灾难性遗忘呢?GEM2、Additional Neural Resource Allocation额外的神经资源分配packNet&CPG3、memory replyCurriculum Learninglife lon…