PostgreSQL 可观测性最佳实践

简介

软件简述

PostgreSQL 是一种开源的关系型数据库管理系统 (RDBMS),它提供了许多可观测性选项,以确保数据库的稳定性和可靠性。

可观测性

可观测性(Observability)是指对数据库状态和操作进行监控和记录,以便在系统出现问题时能够快速诊断和修复。

数据采集

观测云提供了一套简单且高效的 PostgreSQL 观测方案,帮助客户快速定位及解决数据库相关问题。

DataKit 是观测云开发的一款开源、一体式的数据采集 Agent,它提供全平台操作系统支持,拥有全面数据采集能力,涵盖主机、容器、中间件、链路、日志以及安全等各种场景。通过其采集 PostgreSQL 数据只需要两步:

  • 第一步:安装 DataKit 数据采集器
  • 第二步:通过 DataKit 内置的 Postgresql 插件采集数据

配置示例:

[[inputs.postgresql]]address = "postgres://postgres@localhost/test?sslmode=disable"interval = "60s"[[inputs.postgresql.relations]]relation_regex = "test*"schemas = ["public"]relkind = ["r", "p"][inputs.postgresql.log]files = ["/var/log/pgsql/*.log""]pipeline = "postgresql.p"

指标详解

PostgreSQL 拥有众多的监控指标,通过 SQL 命令可以查看系统变量、系统函数和系统视图等信息。观测云已经把这些 SQL 编写成内置的指标集形式,开箱即用。

1.pg_stat_database (datakit postgresql)

示例语句:

postgres=# select * from pg_stat_database where datname='postgres';
-[ RECORD 1 ]------------+------------------------------
datid                    | 14486
datname                  | postgres
numbackends              | 2
xact_commit              | 1406600
xact_rollback            | 20720
blks_read                | 1558
blks_hit                 | 48043798
tup_returned             | 289085449
tup_fetched              | 21237763
tup_inserted             | 174
tup_updated              | 5
tup_deleted              | 41
conflicts                | 0
temp_files               | 0
temp_bytes               | 0
deadlocks                | 0
checksum_failures        |
checksum_last_failure    |
blk_read_time            | 0
blk_write_time           | 0
session_time             | 1030041341.636
active_time              | 1740209.944
idle_in_transaction_time | 879253.682
sessions                 | 15950
sessions_abandoned       | 2
sessions_fatal           | 0
sessions_killed          | 4
stats_reset              | 2023-04-06 11:04:11.693074+08

通过 pg_stat_database 可以基本了解数据库的整体运行情况。

  • 当 tup_returned 值远大于 tup_fetched,说明数据库历史执行的 sql 很多都是全表扫描,存在很多没有走索引的 sql,这时候可以结合 pg_stat_statments 来查找慢 sql,也可以通过 pg_stat_user_tables 找到全表扫描次数和行数最多的表。
  • 当 tup_updated 很高说明数据库有很频繁的更新,这个时候就需要关注一下 vacuum 相关的指标和长事务,如果没有及时进行垃圾回收会造成数据膨胀的比较厉害,一定程度会响应表查询效率。
  • 当 temp_files 的数值比较大时,说明存在很多的排序 hash,或者聚合操作,可以通过增大 work_mem 减少临时文件的产生,并且同时这些操作的性能也会有较大的提升。

2.pg_stat_user_tables (datakit postgresql_stat)

示例语句:

select * from pg_stat_user_tables where relname='test';
-[ RECORD 1 ]-------+--------
relid               | 16455
schemaname          | public
relname             | test
seq_scan            | 1
seq_tup_read        | 0
idx_scan            | 0
idx_tup_fetch       | 0
n_tup_ins           | 7
n_tup_upd           | 0
n_tup_del           | 0
n_tup_hot_upd       | 0
n_live_tup          | 7
n_dead_tup          | 0
n_mod_since_analyze | 7
n_ins_since_vacuum  | 7
last_vacuum         |
last_autovacuum     |
last_analyze        |
last_autoanalyze    |
vacuum_count        | 0
autovacuum_count    | 0
analyze_count       | 0
autoanalyze_count   | 0

通过 pg_stat_user_tables ,可以知道当前数据库下哪些表发生全表扫描频繁,哪些表变更比较频繁,对于变更较频繁的表可多关注其 vacuum 相关的指标,避免表膨胀。

3.pg_stat_user_indexes (datakit postgresql_index)

示例语句:

select * from pg_stat_user_indexes where relname='test';
-[ RECORD 1 ]-+-------------
relid         | 16455
indexrelid    | 16460
schemaname    | public
relname       | test
indexrelname  | test_pkey
idx_scan      | 0
idx_tup_read  | 0
idx_tup_fetch | 0

通过 pg_stat_user_indexes 可以查看对应索引的使用情况,协助我们判断哪些索引当前基本不使用,对这些无效的冗余索引,可进行删除。

4.pg_statio_user_tables (datakit postgresql_statio)

示例语句:

select * from pg_statio_user_tables where relname='test';
-[ RECORD 1 ]---+--------
relid           | 16455
schemaname      | public
relname         | test
heap_blks_read  | 1
heap_blks_hit   | 6
idx_blks_read   | 2
idx_blks_hit    | 8
toast_blks_read | 0
toast_blks_hit  | 0
tidx_blks_read  | 0
tidx_blks_hit   | 0

通过对 pg_statio_user_tables 的查询,如果 heap_blks_read,idx_blks_read 很高说明 shared_buffer 较小,存在频繁需要从磁盘或者 page cache 读取到 shared_buffer 中。

5.pg_stat_bgwriter (datakit postgresql_bgwriter)

示例语句:

select * from pg_stat_bgwriter;
-[ RECORD 1 ]---------+------------------------------
checkpoints_timed     | 14438
checkpoints_req       | 14
checkpoint_write_time | 64064
checkpoint_sync_time  | 83
buffers_checkpoint    | 656
buffers_clean         | 0
maxwritten_clean      | 0
buffers_backend       | 220
buffers_backend_fsync | 0
buffers_alloc         | 4674
stats_reset           | 2023-04-06 11:00:39.227749+08

通过对 pg_stat_bgwriter 的查询,可以查看后端写进程活动的统计信息。bgwriter、checkpointer 和 backend 都可能把脏数据回写到存储上。正常情况下,我们希望大部分的脏数据都是 bgwriter 写回存储的,少量的脏数据是 checkpoint 写入的,更少的数据是 backend 写入的。因为 backend 写入数据是十分高成本的,不过好像事实上并非如此,backend 写入的比例很高。

6.pg_stat_replication (datakit postgresql_replication)

示例语句:

select * from pg_stat_replication;
-[ RECORD 1 ]----+-----------------------------
pid              | 1492
usesysid         | 12849
usename          | guance
application_name | walreceiver
client_addr      | 192.168.0.187
client_hostname  |
client_port      | 41760
backend_start    | 2023-05-12 16:41:09.54947+08
backend_xmin     |
state            | streaming
sent_lsn         | 2/100001B0
write_lsn        | 2/100001B0
flush_lsn        | 2/100001B0
replay_lsn       | 2/100001B0
write_lag        |
flush_lag        |
replay_lag       |
sync_priority    | 0
sync_state       | async

pg_stat_replication 仅仅在主从架构下才会显示相关数据,根据对 pg_stat_replication 表的查询可以查看当前复制的模式、复制配置信息、复制位点信息等。
例如 sync_state 可以分为 :

  • async:表示备库为异步同步模式
  • potential :表示备库当前为异步同步模式,如果当前的同步备库宕机,异步备库可升级成为同步备库
  • sync : 表示当前备库为同步模式
  • quorum :表示备库为 quorumstandbys 的候选

日志相关

PostgreSQL 有 3 种日志,分别是:

日志目录作用可读性默认状态
pg_log数据库运行日志内容可读默认关闭,需要设置参数启动
pg_xlogWAL 日志,即重做日志内容一般不具有可读性强制开启
pg_clog事务提交日志,记录的是事务的元数据内容一般不具有可读性强制开启

日志路径

pg_xlog 和 pg_clog 一般是在 postgresql 安装目录的文件夹下。
pg_log 默认路径是 postgresql 安装目录下的 pg_log,实际路径可以在 postgresql.conf 文件中设置。

日志解析

1.pg_log

这个日志一般是记录服务器与 DB 的状态,比如各种 Error 信息,定位慢查询 SQL,数据库的启动关闭信息,发生 checkpoint 过于频繁等的告警信息,诸如此类。该日志有 .csv 格式和 .log。建议使用 .csv 格式,因为它一般会按大小和时间自动切割,毕竟查看一个巨大的日志文件比查看不同时间段的多个日志要难得多。

清理原则:pg_log 是可以被 清理删除,压缩打包或者转移,同时并 不影响 数据库的正常运行。

2.pg_xlog

这个日志是记录的 Postgresql 的 WAL 信息,也就是一些事务日志信息 (transaction log)。这种日志形如 ‘00000001000000000000008E’,包含的是最近失误的数据镜像,这些日志会在定时回滚恢复(PITR),流复制(Replication Stream)以及归档时能被用到。

当你的归档或者流复制发生异常的时候,事务日志会不断地生成,有可能会造成你的磁盘空间被塞满,最终导致数据库挂掉或者起不来。遇到这种情况不用慌,可以先关闭归档或者流复制功能,备份 pg_xlog 日志到其他地方,但不要删除,然后删除较早时间的的 pg_xlog,有一定空间后再试着启动 Postgresql。

清理原则:这些日志 非常重要 ,记录着数据库发生的各种事务信息,不得随意删除 或者移动这类日志文件,不然你的数据库会有 无法恢复 的风险。

什么是 WAL ?

PostgreSQL 在将缓存的数据刷入到磁盘之前,先写日志,这就是PostgreSQL WAL ( Write-Ahead Log ) 方式,也就是预写日志方式 。

3.pg_clog

pg_clog 这个文件也是事务日志文件,但与 pg_xlog 不同的是它记录的是事务的元数据 (metadata),这个日志告诉我们哪些事务完成了,哪些没有完成。

清理原则:这个日志文件一般非常小,但是 重要性 也是相当高,不得随意删除 或者对其更改信息。

日志配置

可以通过配置文件 postgresql.conf 进行设置

主要参数说明:

  • logging_collector = on/off
    是否将日志重定向至文件中,默认是 off。
  • log_directory = pg_log
    日志文件目录,默认是 pgdata 的相对路径,即 pgdata 的相对路径,即 {pgdata}/pg_log,也可以改为绝对路径。日志文件可能会非常多,建议将日志重定向到其他目录或分区。将此配置修改其他目录时,必须先创建此目录,并修改权限,使得 postgres 用户对该目录有写权限。
  • log_filename = postgresql-%Y-%m-%d*%H%M%S.log
    日志文件命名形式,使用默认即可
  • log_rotation_age = 1d
    单个日志文件的生存期,默认 1 天,在日志文件大小没有达到 log_rotation_size 时,一天只生成一个日志文件。
  • log_rotation_size = 10MB
    单个日志文件的大小,如果时间没有超过 log_rotation_age,一个日志文件最大只能到 10M,否则将新生成一个日志文件。
  • log_truncate_on_rotation = off
    当日志文件已存在时,该配置如果为 off,新生成的日志将在文件尾部追加,如果为 on,则会覆盖原来的日志。
  • log_lock_waits = off
    控制当一个会话等待时间超过 deadlock_timeout 而被锁时是否产生一个日志信息。在判断一个锁等待是否会影响性能时是有用的,缺省是 off。
  • log_statement = none # none, ddl, mod, all
    控制记录哪些 SQL 语句。none 不记录,ddl 记录所有数据定义命令,比如 CREATE,ALTER 和 DROP 语句。mod 记录所有 ddl 语句,加上数据修改语句 INSERT,UPDATE 等。all 记录所有执行的语句,将此配置设置为 all 可跟踪整个数据库执行的 SQL 语句。
  • log_duration = off
    记录每条 SQL 语句执行完成消耗的时间,将此配置设置为 on ,用于统计哪些 SQL 语句耗时较长。
  • log_min_duration_statement = -1
    -1 表示关闭记录。0 表示记录所有 statements 的执行时间按,若为>0(单位为 ms)的一个值,则记录执行时间大于该值的 statements。可以使用该配置来跟踪那些耗时较长,可能存在性能问题的 SQL 语句。虽然使用 log_statement 和 log_duration 也能够统计 SQL 语句及耗时,但是 SQL 语句和耗时统计结果可能相差很多行,或在不同的文件中,但是 log_min_duration_statement 会将 SQL 语句和耗时在同一行记录,更方便阅读。
  • log_connections = off
    是否记录连接日志
  • log_disconnections = off
    是否记录连接断开日志
  • log_line_prefix = %m %p %u %d %r
    日志输出格式(%m,%p 实际意义配置文件中有解释),可根据自己需要设置(能够记录时间,用户名称,数据库名称,客户端 IP 和端口,方便定位问题)。
  • log_timezone = Asia/Shanghai
    日志时区,最好和服务器设置同一个时区,方便问题定位

场景视图

观测云已经内置了 PostgreSQL 的场景视图,直接使用即可,用户也可以自定义修改任何想要的指标视图。

添加方式

登录「观测云控制台」-「场景」-「仪表板」-「新建仪表板」-「系统视图」,搜索“PostgreSQL”,添加即可。

效果展示

若想要在此基础上自定义图表,可以参考《观测云文档:可视化图表》。


 


 


 


 

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

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

相关文章

Linux操作系统——进程(四)进程切换与命令行参数

进程切换 概念引入 下面我们先了解几个概念: 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级 独立性: 多进程…

[论文阅读笔记28] 对比学习在多目标跟踪中的应用

这次做一篇2D多目标跟踪中使用对比学习的一些方法. 对比学习通过以最大化正负样本特征距离, 最小化正样本特征距离的方式来实现半监督或无监督训练. 这可以给训练MOT的外观特征网络提供一些启示. 使用对比学习做MOT的鼻祖应该是QDTrack, 本篇博客对QDTrack及其后续工作做一个总…

Linux OpenEuler(欧拉系统)无公网ip实现SSH远程连接

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,…

研究生可以直接当教师吗

在教育领域,教师岗位的竞争日益激烈。许多即将毕业的研究生,尤其是教育学专业的,都怀揣着一个共同的疑问:我能不能一出校门就直接当教师? 成为教师并不只是有个学历那么简单。它需要具备扎实的教育学基础、良好的教学技…

Matlab:解非线性方程组

1、基于问题求解非线性方程组 例: xoptimvar(x,2); %将x定义为一个二元素优化变量 eq1exp(-exp(-(x(1)x(2))))x(2)*(1x(1)^2); %创建第一个方程作为优化等式表达式 eq2x(1)*cos(x(2))x(2)*sin(x(1))1/2; %创建第二个方程作为优化等式表达式 probe…

【数据结构和算法】找到最高海拔

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 前缀和的解题模板 2.1.1 最长递增子序列长度 2.1.2 寻找数组中第 k 大的元素 2.1.3 最长公共子序列…

fpga verilog rs232 发送模块实现

RS-232是一种串行通信协议,用于在计算机和其他外部设备之间进行数据传输。RS-232定义了电气特性、信号级别、机械特性和传输速率等规范,为串行通信提供了一种标准化的接口。 RS-232通常使用DB9连接器,用于传输和接收数据、控制信号以及地线连…

12月25日作业

串口发送控制命令&#xff0c;实现一些外设LED 风扇 uart4.c #include "uart4.h"void uart4_config() {//1.使能GPIOB\GPIOG\UART4外设时钟RCC->MP_AHB4ENSETR | (0x1 << 1);RCC->MP_AHB4ENSETR | (0x1 << 6);RCC->MP_APB1ENSETR | (0x1 <…

边缘计算云边端全览—边缘计算系统设计与实践【文末送书-10】

文章目录 一.边缘计算1.1边缘计算的典型应用 二.边缘计算 VS 云计算三.边缘计算系统设计与实践【文末送书-10】3.1 粉丝福利&#xff1a;文末推荐与福利免费包邮送书&#xff01; 一.边缘计算 边缘计算是指在靠近物或数据源头的一侧&#xff0c;采用网络、计算、存储、应用核心…

STM32CubeIDE在使用freertos的情况下空间占用情况

因为STM32F103C8T6芯片的存储空间太小了&#xff0c;只有64K&#xff0c;在使用STM32CubeIDE的freertos情况下空间占用情况做个简单的测试&#xff1a; 不使用程序优化&#xff1a; 空间占用情况&#xff1a; 如果使用浮点运算功能的printf&#xff1a; 这个使用空间占用更大…

Isaac Sim 仿真机器人urdf文件导入

本教程展示如何在 Omniverse Isaac Sim 中导入 urdf 一. 使用内置插件导入urdf 安装urdf 插件 方法是转到“window”->“Extensions” 搜索框中输入urdf, 并启用 通过转至Isaac Utils -> Workflows -> URDF Importer菜单来访问 urdf 扩展。 表格中的 1,2,3 对应着…

利用MATLAB设计一个(2,1,7)卷积码编译码器

1、条件&#xff1a; 输入数字信号&#xff0c;可以随机产生&#xff0c;也可手动输入 2、要求&#xff1a; &#xff08;1&#xff09;能显示编码树、网格图或状态转移图三者之一&#xff1b; &#xff08;2&#xff09;根据输入数字信号编码生成卷积码并显示&#xf…

堡垒机的演变过程

堡垒机的概念源自跳板机&#xff08;前置机&#xff09;。早在20世纪90年代末21世纪初期&#xff0c;部分中大型企业为了能对运维人员的远程登录进行集中管理&#xff0c;会在机房部署一台跳板机。跳板机其实就是一台unix/windows操作系统的服务器。并且所有运维人员都需要先远…

疯狂刷屏的“小作文”事件,看到Agent智能体成释放生产力与创新力必然

最近&#xff0c;东方甄选“连续剧”迎来了“圆满”结局。“流量密码”董宇辉新身份连跳三级&#xff0c;被任命为新东方教育科技集团董事长文化助理、兼任新东方文旅集团副总裁&#xff0c;此前&#xff0c;发布18日俞敏洪和董宇辉直播预告海报&#xff0c;董已升为东方甄选高…

Floyd(弗洛伊德)算法总结

知识概览 Floyd算法适合解决多源汇最短路问题&#xff0c;其中源点是起点&#xff0c;汇点是终点。时间复杂度是。 例题展示 题目链接 活动 - AcWing 系统讲解常用算法与数据结构&#xff0c;给出相应代码模板&#xff0c;并会布置、讲解相应的基础算法题目。https://www.acw…

Spring高手之路-Spring初了解

目录 什么是Spring Spring 框架的主要功能 Spring体系结构 核心容器&#xff08;Core Container&#xff09; 数据访问与集成&#xff08;Data Access/Integration&#xff09; Web 层&#xff08;Web Layer&#xff09; AOP 与功能扩展&#xff08;AOP and Instrumenta…

pake协议传输文件magic-wormhole

pake协议传输文件magic-wormhole 1 magic-wormhole简介其他介绍 2 安装magic-wormhole3 使用示范发送文件指定虫洞码长度 接收文件 1 magic-wormhole简介 16.7k star 强推&#xff0c;丝滑、简洁、安全的开源工具——magic-wormhole 项目地址&#xff1a;https://github.com/…

Latex正文引用公式编号,以防公式调整,正文编号对应错误

一、背景 最近在改论文时&#xff0c;需要调整某些公式顺序或添加新的公式&#xff0c;导致正文中的公式引用序号错误。 这里特记录解决方法&#xff0c;即在\begin{eqnarray}后添加lable标签&#xff0c;正文不再是手动输入序号&#xff0c;而是使用命令\eqref{}。 具体如下…

Flink 输出至 Redis

【1】引入第三方Bahir提供的Flink-redis相关依赖包 <!-- https://mvnrepository.com/artifact/org.apache.bahir/flink-connector-redis --> <dependency><groupId>org.apache.bahir</groupId><artifactId>flink-connector-redis_2.11</arti…