当前位置: 首页 > news >正文

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 通常是基于以下因素来计算的:

  1. WAL日志传输延迟:Patroni 使用 PostgreSQL 的流复制(streaming replication)机制,将主库上的 WAL(Write Ahead Log)日志传输到备库。在备库接收到 WAL 日志后,它会应用这些日志,保持与主库的同步。

  2. 日志差异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,得出备库的延迟。

  1. 日志传输和应用时间
    • 传输延迟:从主库到备库的 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 使用情况

    使用系统监控工具,如 tophtopiostat 等,查看系统资源的使用情况。

    top
    

    该命令将显示系统的实时资源使用情况,帮助您识别是否存在资源瓶颈。

  • top

  • htop

  • iostat

7. 检查网络状况

  • 确保主备节点之间的网络连接稳定,带宽充足

    使用网络监控工具,如 pingtraceroute 等,检查网络延迟和丢包情况。

    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. 查看主备状态计算方式&#xff1a;实际情况&#xff1a;举个例子&#xff1a; 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的在线车辆租赁信息管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着互联网技术的不断发展和人们生活水平的提高&#xff0c;汽车租赁行业迎来了前所未有的发展机遇。传统的汽车租赁方式往往存在流程繁琐、信息不透明等问题&#xff0c;难以满足现代消费者对于便捷、高效服务的需求。因此&…...

掌握 systemd:Linux 服务管理的核心工具

1. 什么是 systemd&#xff1f; 定义&#xff1a;systemd 是 Linux 系统的初始化系统&#xff08;init system&#xff09;和服务管理器&#xff0c;用于替代传统的 SysVinit。核心目标&#xff1a; 加速系统启动&#xff08;并行化任务&#xff09;。统一管理服务、日志、挂载…...

【信息系统项目管理师-案例真题】2019下半年案例分析答案和详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题一【问题 1】(6 分)【问题 2‍ 】(8 分)【问题 3‍ 】(11 分)试题二【问题 1】‍(5分)【问题 2】‍ (14 分)【问题 3‍ 】(6 分)试题三【问题 1】(8 分)【问题 2‍ 】(6 分)【问题 3】‍ (8 分)【问题 4‍ …...

C/C++程序的内存是如何开辟的?

&#x1f4ac; 欢迎讨论&#xff1a;在阅读过程中有任何疑问&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;如果你觉得这篇文章对你有帮助&#xff0c;记得点赞、收藏&#xff0c;并分享给更多对C语言感兴…...

日志结构化处理:PO对象toString日志转JSON工具

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

python学opencv|读取图像(六十五)使用cv2.boundingRect()函数实现图像轮廓矩形标注

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

大疆无人机需要的kml文件如何制作kml导出(大疆KML文件)

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

ArrayList、LinkedList、HashMap、HashTable、HashSet、TreeSet

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

手动配置IP

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

idea如何使用AI编程提升效率-在IntelliJ IDEA 中安装 GitHub Copilot 插件的步骤-卓伊凡

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

游戏引擎学习第101天

回顾当前情况 昨天的进度基本上完成了所有内容&#xff0c;但我们还没有进行调试。虽然我们在运行时做的事情大致上是对的&#xff0c;但还是存在一些可能或者确定的bug。正如昨天最后提到的&#xff0c;既然现在时间晚了&#xff0c;就不太适合开始调试&#xff0c;所以今天我…...

css块级元素和行内元素区别

在CSS中&#xff0c;元素可以分为两大类&#xff1a;块级元素&#xff08;Block-level elements&#xff09;和行内元素&#xff08;Inline elements&#xff09;。这两种元素在网页布局中起着不同的作用&#xff0c;主要体现在它们的显示方式、尺寸控制、以及与其他元素的交互…...

JAVA安全—Shiro反序列化DNS利用链CC利用链AES动态调试

前言 讲了FastJson反序列化的原理和利用链&#xff0c;今天讲一下Shiro的反序列化利用&#xff0c;这个也是目前比较热门的。 原生态反序列化 我们先来复习一下原生态的反序列化&#xff0c;之前也是讲过的&#xff0c;打开我们写过的serialization_demo。代码也很简单&…...

什么是信息熵

信息熵 公式 一个离散随机变量 X X X的可能取值为 X x 1 , x 2 , . . . , x n Xx_1,x_2,...,x_n Xx1​,x2​,...,xn​&#xff0c;而对应的概率为 p i p ( X x i ) p_ip(Xx_i) pi​p(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 xn​p( x …...

使用API有效率地管理Dynadot域名,清除某一文件夹中域名的默认DNS设置

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…...

2.11 sqlite3数据库【数据库的相关操作指令、函数】

练习&#xff1a; 将 epoll 服务器 客户端拿来用 客户端&#xff1a;写一个界面&#xff0c;里面有注册登录 服务器&#xff1a;处理注册和登录逻辑&#xff0c;注册的话将注册的账号密码写入数据库&#xff0c;登录的话查询数据库中是否存在账号&#xff0c;并验证密码是否正确…...

当 LSTM 遇上 ARIMA!!

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

kali连接xshell

1.先保证宿主机&#xff1a;以太网适配器 VMware Network Adapter VMnet8 和kali&#xff08;net 模式&#xff09;在同一个网段 windows VMnet8开启 查看是否是自动获取ip ipv4 和ipv6一样的 查看 windows VMnet8的IPv4的地址 查看 kali 的IP地址 window ping的结果&#xf…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;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:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; 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日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

网络编程(UDP编程)

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