监控复制:PG_STAT_REPLICATION

简介: 监控复制:PG_STAT_REPLICATION

监控复制:PG_STAT_REPLICATION


PG复制(同步和异步复制)是数据库社区最普遍的功能之一。现在用户通过高可用集群或者使用复制建立只读副本来分散工作负载。这里需要注意,如果使用复制,则必须确保集群受到正确监控。本文目的解释一些基本原理,以帮助集群健壮。


pg_stat_replication:检查当前状态


pg_stat_replication是监控复制状态的方法,该视图:

    test=# \d pg_stat_replication
    View "pg_catalog.pg_stat_replication"
    Column           | Type                    | Collation | Nullable | Default
    -----------------+-------------------------+-----------+----------+---------
    pid              | integer                 |           |          |
    usesysid         | oid                     |           |          |
    usename          | name                    |           |          |
    application_name | text                    |           |          |
    client_addr      | inet                    |           |          |
    client_hostname  | text                    |           |          |
    client_port      | integer                 |           |          |
    backend_start    | timestamp with time zone|           |          |
    backend_xmin     | xid                     |           |          |
    state            | text                    |           |          |
    sent_lsn         | pg_lsn                  |           |          |
    write_lsn        | pg_lsn                  |           |          |
    flush_lsn        | pg_lsn                  |           |          |
    replay_lsn       | pg_lsn                  |           |          |
    write_lag        | interval                |           |          |
    flush_lag        | interval                |           |          |
    replay_lag       | interval                |           |          |
    sync_priority    | integer                 |           |          |
    sync_state       | text                    |           |          |
    reply_time       | timestamp with time zone|           |          |

    视图中列数不断在增加,下面先讨论下基本原理。


    pg_stat_replication:WAL发送信息


    用户通常认为pg_stat_replication在主上,这是不太准确的。这个视图是关于wal_sender进程的信息。换句话说,如果在部署级联复制,备也会显示向下一个备进行复制的信息,如下图:

     

    abd9a27473446143d41e12afe12ccd9f.png

    每个WAL sender进程,对应一个元祖。重要的是,每个服务器只会看到链中下一个服务器,不会跳过一节点看到下下个节点。也就是说,级联复制中,必须要求每个sending服务器获得下一个信息。但是还有更多问题,通常用户必须确定一个备是否是最新的,这里有相关信息:

    sent_lsn:该网络已经发送了多少WAL了

    write_lsn:写到操作系统多少WAL,还没flush

    flush_lsn:有多少WAL刷写到了磁盘

    replay_lsn:WAL回放了多少

     

    PG中提供pg_lsn这个特殊的数据类型表示这些数据,可以标记当前WAL的位置:


    test=# SELECT pg_current_wal_lsn();
    pg_current_wal_lsn
    --------------------
    3/DA06D240
    (1 row)

    可通过下面计算:

      test=# SELECT pg_current_wal_lsn() - '3/B549A845'::pg_lsn;
      ?column?
      -----------
      616376827
      (1 row)

      PG提供各种操作符做这些计算,非常方便计算备机落后了多少。


      flush_lsn vs replay_lsn


      WAL从主到备时,首先通过网络发送,然后发送到操作系统,最后刷写到磁盘。Flush_lsn表示刷到磁盘的最新WAL位置。问题是,数据刷新后就可见吗?当然不是。可能有复制冲突的现象。WAL可能已经在备上持久化了,但是有冲突,所以不能回放,也就是备机上数据还没有回放就可以被终端用户访问了。

      如果看到下面信息,就表示有复制冲突了:

      ERROR: canceling statement due to conflict with recovery

      DETAIL: User query might have needed to see row versions that must be removed.

      有时候非常必要了解复制落后了多少秒,看到两个服务器之间相差多少字节。如果需要量化这个延迟,查看_lag列。这些列数据类型是整型,可以看到延迟的秒数甚至分钟数。如果复制正常,延迟通常非常小(毫秒级),但是仍需要监控。

      注意:如果正在运行诸如vacuum类型的操作,很容易发生磁盘吞吐高于网络带宽的情况。这种情况下,slave可能会落后master。必须容忍这种情况,并确保警报不会过早启动。


      pgwatch2: Ready made tooling


      还有许多现有工具来监控复制,推荐pgwatch2,可以作为一个容器下载。Pgwatch2地址:

      https://www.cybertec-postgresql.com/en/products/pgwatch/


      原文


      https://www.cybertec-postgresql.com/en/monitoring-replication-pg_stat_replication/

      目录
      相关文章
      |
      canal 关系型数据库 MySQL
      Canal需要执行 `show master status` 命令来获取主库的binlog文件名和位置
      Canal需要执行 `show master status` 命令来获取主库的binlog文件名和位置
      433 1
      |
      SQL 存储 关系型数据库
      [译]Postgres15-新特性-利用pg_walinspect对WAL事件进行debug
      [译]Postgres15-新特性-利用pg_walinspect对WAL事件进行debug
      173 0
      |
      关系型数据库
      PG修改数据页页头等信息时是否会产生WAL?
      PG修改数据页页头等信息时是否会产生WAL?
      69 0
      |
      关系型数据库 网络安全 数据库
      PGPool-II+PG流复制实现HA主备切换
      基于PG的流复制能实现热备切换,但是是要手动建立触发文件实现,对于一些HA场景来说,需要当主机down了后,备机自动切换,经查询资料知道pgpool-II可以实现这种功能。
      3034 0
      |
      SQL 弹性计算 关系型数据库
      为什么pg_basebackup或pg_start_backup好像hang住确没有开始拷贝文件 - checkpoint 的几种调度(checkpoint_completion_target)
      标签 PostgreSQL , checkpoint , 调度 , lazy , immediate , pg_start_backup , pg_basebackup 背景 PostgreSQL支持在线全量备份与增量归档备份。在线全量备份实际上就是拷贝文件,增量备份则分为两种,一种是基于BLOCK lsn变化的BLOCK即增量备份,另一种是基于WAL的持续归档文件备份。 全量备份通常
      1593 0
      |
      搜索推荐 关系型数据库 分布式数据库
      【DB吐槽大会】第7期 - PG slot 无failover
      大家好,这里是DB吐槽大会,第7期 - PG slot 无failover
      |
      SQL Oracle 关系型数据库
      xDB Replication Server - PostgreSQL, Oracle, SQL Server, PPAS 全量、增量(redo log based, or trigger based)同步(支持single-master, mult-master同步, 支持DDL)
      xDB Replication Server - PostgreSQL, Oracle, SQL Server, PPAS 全量、增量(redo log based, or trigger based)同步(支持single-master, mult-master同步, 支持DDL)
      886 0
      |
      SQL 关系型数据库 MySQL
      MySQL:slave_skip_errors参数对MGR可用性的影响
      整个问题提出和测试由 @gc @甘露寺的姑子@乙酉 完成,文档记录由@gc @乙酉完成。 我只是进行了问题分析和文档整理 欢迎关注我的《深入理解MySQL主从原理 32讲 》,如下: 一、案例描述 MGR在遇到表不存在的情况下,节点没有退出节点而是爆出一个警告,并且节点状态也正常,警告如下: 2019-10-17T21:16:11.
      1245 0