PostgreSQL 备库的延迟问题
目录标题
- 1. 查看主备状态
- 计算方式:
- 实际情况:
- 举个例子:
- 2. 查看历史状态
- 3. 分析日志文件
- 4. 查看数据库层面的复制状态
- 5. 检查活动事务
- 6. 检查系统资源
- 7. 检查网络状况
- 8. 检查复制槽状态
- 9. 检查未提交的两阶段事务
要排查 PostgreSQL 备库的延迟问题,您可以按照以下步骤进行:
1. 查看主备状态
-
使用
patronictl list
命令:该命令会显示集群中各节点的角色、状态、时间线等信息。patronictl list
该命令的输出将包括每个节点的角色、状态、时间线等信息,帮助您了解主备节点的当前状态。
patronictl list
是 Patroni 提供的命令,用于显示当前 Patroni 集群的状态和信息。在输出结果中,Lag in MB
表示每个备库(replica)与主库(primary)之间的延迟,单位是 MB(兆字节)。
计算方式:
Lag in MB
通常是基于以下因素来计算的:
-
WAL日志传输延迟:Patroni 使用 PostgreSQL 的流复制(streaming replication)机制,将主库上的 WAL(Write Ahead Log)日志传输到备库。在备库接收到 WAL 日志后,它会应用这些日志,保持与主库的同步。
-
日志差异:
Lag in MB
主要通过计算主库和备库之间的 WAL 日志差异来得出。这个差异通常由以下几个指标决定:- 主库的当前 WAL LSN(Log Sequence Number)。
- 备库已接收到的最新 WAL LSN。
备库的
Lag in MB
计算公式通常如下:
\[\text{Lag in MB} = \frac{\text{Current WAL LSN} - \text{Replica WAL LSN}}{1024 \times 1024}\]
这里,Current WAL LSN
是主库当前的 WAL 位置(LSN),Replica WAL LSN
是备库上已应用的最新 WAL 位置。通过计算这两个 LSN 之间的差距,并将其转换为 MB,得出备库的延迟。
- 日志传输和应用时间:
- 传输延迟:从主库到备库的 WAL 日志传输时间。
- 应用延迟:备库将接收到的 WAL 日志应用到数据库的时间。
实际情况:
Lag in MB
是一个近似值,表示备库的延迟量。它并不直接反映实际的数据延迟(即查询的响应时间),而是表示备库与主库之间的 WAL 日志差异。较大的延迟可能意味着备库未及时接收到或应用主库的 WAL 日志。
在实践中,Lag in MB
可以用于:
- 监控备库同步的健康状况。
- 发现复制延迟过大的情况。
- 调整性能优化策略,避免备库滞后过长时间。
举个例子:
假设主库的 WAL LSN 是 0/10000000
,而备库的 WAL LSN 是 0/08000000
。那么它们之间的差异是 0/10000000 - 0/08000000 = 0/08000000
。如果每个 WAL 页的大小是 8KB,那么可以计算出这个差异对应的延迟是:
\[
\text{Lag in MB} = \frac{(0/08000000)}{1024 \times 1024} = \text{具体的 MB 数值}
\]
这个值会以 Lag in MB
显示出来,通常在 Patroni 集群的状态监控中查看。
SELECT now(),application_name,pg_current_wal_lsn() AS current_wal_lsn,sent_lsn,pg_wal_lsn_diff(pg_current_wal_lsn(), sent_lsn)/1024/1024 AS lag_in_MB
FROM pg_stat_replication;
2. 查看历史状态
-
使用
patronictl history
命令:该命令可以帮助您了解集群状态的变化历史,识别可能导致延迟的事件。patronictl history
通过查看历史状态,您可以识别出集群状态变化的时间点,帮助定位可能导致延迟的事件。
3. 分析日志文件
-
检查主/备节点的 PostgreSQL 日志文件:日志文件通常位于 PostgreSQL 数据目录下的
pg_log
目录中。cd /pg_log
在该目录下,您可以找到以日期命名的日志文件,如
postgresql-<日期>.log
和postgresql-<日期>.csv
。archive_command 和 restore_command 等由PG调用的外部二进制的输出打在 .log 里面
-
查找与复制相关的错误或警告信息:关注日志中是否有网络连接问题、磁盘空间不足等错误或警告信息。
grep -i 'replication' postgresql-*.csv
该命令将搜索所有日志文件中包含“replication”字样的行,帮助您快速定位与复制相关的问题。
4. 查看数据库层面的复制状态
-
在主库上,执行以下 SQL 查询,查看复制状态:
SELECT * FROM pg_stat_replication;
SELECT (case pg_is_in_recovery() when 't' then null else pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn)::float end)/1024/1024 AS pg_location_diff_MB FROM pg_stat_replication;
该查询会返回当前复制连接的状态信息,包括复制延迟等。
-
在备库上,执行以下 SQL 查询,查看复制状态:
SELECT * FROM pg_stat_wal_receiver;
该查询会返回备库接收 WAL 的状态信息,包括接收延迟等。
5. 检查活动事务
-
在主库上,执行以下 SQL 查询,查看当前活动事务:
SELECT * FROM pg_stat_activity WHERE state = 'active';
长时间运行的活动事务可能会干扰 WAL 复制过程,从而增加复制延迟。
-
流复制
-
pg_stat_replication
6. 检查系统资源
-
检查主备节点的 CPU、内存和磁盘 I/O 使用情况:
使用系统监控工具,如
top
、htop
、iostat
等,查看系统资源的使用情况。top
该命令将显示系统的实时资源使用情况,帮助您识别是否存在资源瓶颈。
-
top
-
htop
-
iostat
7. 检查网络状况
-
确保主备节点之间的网络连接稳定,带宽充足:
使用网络监控工具,如
ping
、traceroute
等,检查网络延迟和丢包情况。ping <备库IP地址>
该命令将测试主库与备库之间的网络连接质量,帮助您识别网络问题。
8. 检查复制槽状态
-
查看复制槽的状态:
SELECT slot_name, slot_type, database, active, active_pid FROM pg_replication_slots;
如果
active
列为false
,说明复制槽未激活,可能导致 WAL 日志堆积。
9. 检查未提交的两阶段事务
-
查看未提交的两阶段事务:
SELECT gid, prepared, owner, database, transaction AS xmin FROM pg_prepared_xacts ORDER BY age(transaction) DESC;
未提交的两阶段事务会导致 WAL 日志无法清理,增加复制延迟。
通过以上步骤,您可以全面排查 PostgreSQL 备库的延迟问题,找出可能的原因并采取相应的措施进行解决。
参考链接:
- PostgreSQL如何监控备库延迟_psql从库查看同步延迟
- PostgreSQL数据库WAL日志空间大小以及不清理的原因深入分析
- 主备同步存在多长时间的延迟_云数据库RDS
- PostgreSQL流复制三(延迟备库)
- 主从之间延迟过大如何优化?
- PostgreSQL数据库参数优化建议
- PostgreSQL 检查主从延迟mysql 查看主从延迟
- 两阶段提交
相关文章:

PostgreSQL 备库的延迟问题
目录标题 1. 查看主备状态计算方式:实际情况:举个例子: 2. 查看历史状态3. 分析日志文件4. 查看数据库层面的复制状态5. 检查活动事务6. 检查系统资源7. 检查网络状况8. 检查复制槽状态9. 检查未提交的两阶段事务 要排查 PostgreSQL 备库的延…...
力扣-二叉树-226 翻转二叉树
思路 利用递归的思路 代码 class Solution { public:TreeNode* invertTree(TreeNode* root) {if(root nullptr){return root;}swap( root->right, root->left);invertTree(root->left);invertTree(root->right);return root;} };...

基于SpringBoot的在线车辆租赁信息管理系统
系统展示 用户前台界面 管理员后台界面 系统背景 随着互联网技术的不断发展和人们生活水平的提高,汽车租赁行业迎来了前所未有的发展机遇。传统的汽车租赁方式往往存在流程繁琐、信息不透明等问题,难以满足现代消费者对于便捷、高效服务的需求。因此&…...
掌握 systemd:Linux 服务管理的核心工具
1. 什么是 systemd? 定义:systemd 是 Linux 系统的初始化系统(init system)和服务管理器,用于替代传统的 SysVinit。核心目标: 加速系统启动(并行化任务)。统一管理服务、日志、挂载…...
【信息系统项目管理师-案例真题】2019下半年案例分析答案和详解
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题一【问题 1】(6 分)【问题 2 】(8 分)【问题 3 】(11 分)试题二【问题 1】(5分)【问题 2】 (14 分)【问题 3 】(6 分)试题三【问题 1】(8 分)【问题 2 】(6 分)【问题 3】 (8 分)【问题 4 …...
C/C++程序的内存是如何开辟的?
💬 欢迎讨论:在阅读过程中有任何疑问,欢迎在评论区留言,我们一起交流学习! 👍 点赞、收藏与分享:如果你觉得这篇文章对你有帮助,记得点赞、收藏,并分享给更多对C语言感兴…...

日志结构化处理:PO对象toString日志转JSON工具
日志结构化处理:PO对象toString日志转JSON工具 1. 解决的问题2. 下载地址 在Java项目中,PO(Plain Old Java Object)对象遍布各个角落,且常常伴随着大量的日志记录需求。传统的做法是通过toString方法直接打印这些对象&…...

python学opencv|读取图像(六十五)使用cv2.boundingRect()函数实现图像轮廓矩形标注
【1】引言 前序学习进程中,已经使用cv2.findContours()函数cv2.drawContours()函数实现图像轮廓识别和标注,这种标注沿着图像的轮廓进行,比较细致。相关文章链接为: python学opencv|读取图像(六十四)使用…...

大疆无人机需要的kml文件如何制作kml导出(大疆KML文件)
大疆无人机需要的轨迹kml文件,是一种专门的格式,这个kml里面只有轨迹点,其它的属性信息都不需要。 BigemapPro提供了专门的大疆格式输出, 软件这里下载 www.bigemap.com 安装后,kml导入如下图: 然后选择…...

ArrayList、LinkedList、HashMap、HashTable、HashSet、TreeSet
集合族谱 在这些集合中,仅有vector和hashtable是线程安全的,其内部方法基本都有synchronized修饰。 ArrayList 底层采用Object数组实现,实现了RandomAccess接口因此支持随机访问。插入删除操作效率慢。 ArrayList需要一份连续的内存空间。 A…...

手动配置IP
手动配置IP,需要考虑四个配置项: 四个配置项 IP地址、子网掩码、默认网关、DNS服务器 IP地址:格式表现为点分十进制,如192.168.254.1 子网掩码:用于区分网络位和主机位 【子网掩码的二进制表达式一定是连续的&#…...

idea如何使用AI编程提升效率-在IntelliJ IDEA 中安装 GitHub Copilot 插件的步骤-卓伊凡
idea如何使用AI编程提升效率-在IntelliJ IDEA 中安装 GitHub Copilot 插件的步骤-卓伊凡 问题 idea编译器 安装copilot AI工具 实际操作 在 IntelliJ IDEA 中安装 GitHub Copilot 插件的步骤如下: 打开 IntelliJ IDEA: 打开你的 IntelliJ IDEA 应用…...

游戏引擎学习第101天
回顾当前情况 昨天的进度基本上完成了所有内容,但我们还没有进行调试。虽然我们在运行时做的事情大致上是对的,但还是存在一些可能或者确定的bug。正如昨天最后提到的,既然现在时间晚了,就不太适合开始调试,所以今天我…...
css块级元素和行内元素区别
在CSS中,元素可以分为两大类:块级元素(Block-level elements)和行内元素(Inline elements)。这两种元素在网页布局中起着不同的作用,主要体现在它们的显示方式、尺寸控制、以及与其他元素的交互…...

JAVA安全—Shiro反序列化DNS利用链CC利用链AES动态调试
前言 讲了FastJson反序列化的原理和利用链,今天讲一下Shiro的反序列化利用,这个也是目前比较热门的。 原生态反序列化 我们先来复习一下原生态的反序列化,之前也是讲过的,打开我们写过的serialization_demo。代码也很简单&…...
什么是信息熵
信息熵 公式 一个离散随机变量 X X X的可能取值为 X x 1 , x 2 , . . . , x n Xx_1,x_2,...,x_n Xx1,x2,...,xn,而对应的概率为 p i p ( X x i ) p_ip(Xx_i) pip(Xxi),如下 x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3 x 4 x_4 x4… x n x_n xnp( x …...

使用API有效率地管理Dynadot域名,清除某一文件夹中域名的默认DNS设置
关于Dynadot Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮…...

2.11 sqlite3数据库【数据库的相关操作指令、函数】
练习: 将 epoll 服务器 客户端拿来用 客户端:写一个界面,里面有注册登录 服务器:处理注册和登录逻辑,注册的话将注册的账号密码写入数据库,登录的话查询数据库中是否存在账号,并验证密码是否正确…...

当 LSTM 遇上 ARIMA!!
大家好,我是小青 ARIMA 和 LSTM 是两种常用于时间序列预测的模型,各有优劣。 ARIMA 擅长捕捉线性关系,而 LSTM 擅长处理非线性和长时间依赖的关系。将ARIMA 和 LSTM 融合,可以充分发挥它们各自的优势,构建更强大的时…...

kali连接xshell
1.先保证宿主机:以太网适配器 VMware Network Adapter VMnet8 和kali(net 模式)在同一个网段 windows VMnet8开启 查看是否是自动获取ip ipv4 和ipv6一样的 查看 windows VMnet8的IPv4的地址 查看 kali 的IP地址 window ping的结果…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...