监控复制:PG_STAT_REPLICATION

yzsDBA
关注

监控复制:PG_STAT_REPLICATION

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

pg_stat_replication:检查当前状态

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

test=# d pg_stat_replicationView "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进程的信息。换句话说,如果在部署级联复制,备也会显示向下一个备进行复制的信息,如下图:

每个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,可以作为一个容器下载。

声明: 本文由入驻OFweek维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。
侵权投诉

下载OFweek,一手掌握高科技全行业资讯

还不是OFweek会员,马上注册
打开app,查看更多精彩资讯 >
  • 长按识别二维码
  • 进入OFweek阅读全文
长按图片进行保存