PG14 监控和日志功能提升

简介: PG14 监控和日志功能提升

PG14 监控和日志功能提升


PostgreSQL 14与2021年9月发布,其中包括很多性能改进和功能增强,包括监控方面的功能提升。下面是一些关键内容。


查询标识符


查询标识符用于标识查询,可以在各个扩展之中交叉使用。PG14之前,扩展需要使用一个算法计算query_id。通常情况下使用同一个算法计算,但任何扩展都可以使用自己的算法。现在PG14提供在内核中计算query_id。现主PG的监控工具比如pg_stat_activity、explain、pg_stat_statments使用这个query_id,不再使用算法进行计算。指定log_line_prefix后,旧会在csvlog中看到query_id。在用户角度,有2个好处:

1) 所有工具/扩展都使用内核中计算的query_id,为工具/扩展交叉使用提供便利。之前的版本需要使用同样的算法计算才能达到这样的功能。

2) 扩展/工具使用这个query_id,无需再重复计算,这是一个性能提升。

PG引入了一个新的GUC控制参数compute_query_id来启用这个特性,默认是开启状态。可以在postgresql.conf中设置也可以使用SET命令。


pg_stat_activity


SET compute_query_id=off;

    SELECT datname, query, query_id FROM pg_stat_activity;
     datname  |                                 query                                 | query_id
    ----------+-----------------------------------------------------------------------+----------
     postgres | select datname, query, query_id from pg_stat_activity;                |         
     postgres | UPDATE pgbench_branches SET bbalance = bbalance + 2361 WHERE bid = 1; |

    SET compute_query_id=on;

      SELECT datname, query, query_id FROM pg_stat_activity;
       datname  |                                 query                                 |      query_id       
      ----------+-----------------------------------------------------------------------+---------------------
       postgres | select datname, query, query_id from pg_stat_activity;                |  846165942585941982
       postgres | UPDATE pgbench_tellers SET tbalance = tbalance + 3001 WHERE tid = 44; | 3354982309855590749

      Log

      之前版本中,内核中没有机制计算query_id。在log file中query_id非常有用。需要配置log_line_prefix启用这项功能。query_id中加了“%Q”:


      log_line_prefix = 'query_id = [%Q] -> '
      query_id = [0] -> LOG:  statement: CREATE PROCEDURE ptestx(OUT a int) LANGUAGE SQL AS $$ INSERT INTO cp_test VALUES (1, 'a') $$;
      query_id = [-6788509697256188685] -> ERROR:  return type mismatch in function declared to return record
      query_id = [-6788509697256188685] -> DETAIL:  Function's final statement must be SELECT or INSERT/UPDATE/DELETE RETURNING.
      query_id = [-6788509697256188685] -> CONTEXT:  SQL function "ptestx"
      query_id = [-6788509697256188685] -> STATEMENT:  CREATE PROCEDURE ptestx(OUT a int) LANGUAGE SQL AS $$ INSERT INTO cp_test VALUES (1, 'a') $$;

      Explain


      如果compute_query_id为true,则EXPLAIN VERBOSE会显示query_id。

      SET compute_query_id=off;

        EXPLAIN VERBOSE SELECT * FROM foo;
                                  QUERY PLAN                          
        --------------------------------------------------------------
         Seq Scan on public.foo  (cost=0.00..15.01 rows=1001 width=4)
           Output: a
        (2 rows)

        SET compute_query_id=on;

          EXPLAIN VERBOSE SELECT * FROM foo;
                                    QUERY PLAN                          
          --------------------------------------------------------------
           Seq Scan on public.foo  (cost=0.00..15.01 rows=1001 width=4)
             Output: a
           Query Identifier: 3480779799680626233
          (3 rows)

          自动vacuum和自动analyze 日志改进


          PG14改进了auto-vacuum和auto-analyze的logging功能。现在日志中看下IO时间,显示读写花费了多少时间:

            automatic vacuum of table "postgres.pg_catalog.pg_depend": index scans: 1
            pages: 0 removed, 67 remain, 0 skipped due to pins, 0 skipped frozen
            tuples: 89 removed, 8873 remain, 0 are dead but not yet removable, oldest xmin: 210871
            index scan needed: 2 pages from table (2.99% of total) had 341 dead item identifiers removed
            index "pg_depend_depender_index": pages: 39 in total, 0 newly deleted, 0 currently deleted, 0 reusable
            index "pg_depend_reference_index": pages: 41 in total, 0 newly deleted, 0 currently deleted, 0 reusable
            I/O timings: read: 44.254 ms, write: 0.531 ms
            avg read rate: 13.191 MB/s, avg write rate: 8.794 MB/s
            buffer usage: 167 hits, 126 misses, 84 dirtied
            WAL usage: 85 records, 15 full page images, 78064 bytes
            system usage: CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.07 s


            track_io_timing启动时,才能显示这样的日志。


            连接日志


            log_connections/log_disconnections开启时,会记录connection/disconnection到日志中。因此会记录真实用户名。若使用其他认证插件以及pg_ident.conf中映射,定位真实用户名就会很困难。PG14之前,仅能看到映射用户。


            pg_ident.conf


              # MAPNAME       SYSTEM-USERNAME         PG-USERNAME
              pg              vagrant                 postgres

              pg_hba.conf

                # TYPE  DATABASE     USER        ADDRESS         METHOD
                # "local" is for Unix domain socket connections only
                local   all         all                         peer map=pg

                PG 14之前

                  LOG:  database system was shut down at 2021-11-19 11:24:30 UTC
                  LOG:  database system is ready to accept connections
                  LOG:  connection received: host=[local]
                  LOG:  connection authorized: user=postgres database=postgres application_name=psql

                  PG14

                    LOG:  database system is ready to accept connections
                    LOG:  connection received: host=[local]
                    LOG:  connection authenticated: identity="vagrant" method=peer (/usr/local/pgsql.14/bin/data/pg_hba.conf:89)
                    LOG:  connection authorized: user=postgres database=postgres application_name=psql

                    总结


                    PG的每个大版本都会有重大改进,PG14也不例外。监控是数据库管理系统关键特性。PG不断升级其功能以改进日志记录和监控功能。通过这些新增的功能,可以对连接有更多了解,可以轻松跟踪查询和观察性能,并确定vacuum在读写中花费多少时间。可以极大版版主更好配置vacuum参数。


                    原文

                    https://www.percona.com/blog/postgresql-14-database-monitoring-and-logging-enhancements/

                    相关实践学习
                    通过日志服务实现云资源OSS的安全审计
                    本实验介绍如何通过日志服务实现云资源OSS的安全审计。
                    目录
                    相关文章
                    |
                    6月前
                    |
                    Prometheus 监控 Cloud Native
                    基于docker搭建监控系统&日志收集
                    Prometheus 是一款由 SoundCloud 开发的开源监控报警系统及时序数据库(TSDB),支持多维数据模型和灵活查询语言,适用于大规模集群监控。它通过 HTTP 拉取数据,支持服务发现、多种图表展示(如 Grafana),并可结合 Loki 实现日志聚合。本文介绍其架构、部署及与 Docker 集成的监控方案。
                    600 122
                    基于docker搭建监控系统&日志收集
                    |
                    6月前
                    |
                    Prometheus 监控 Java
                    日志收集和Spring 微服务监控的最佳实践
                    在微服务架构中,日志记录与监控对系统稳定性、问题排查和性能优化至关重要。本文介绍了在 Spring 微服务中实现高效日志记录与监控的最佳实践,涵盖日志级别选择、结构化日志、集中记录、服务ID跟踪、上下文信息添加、日志轮转,以及使用 Spring Boot Actuator、Micrometer、Prometheus、Grafana、ELK 堆栈等工具进行监控与可视化。通过这些方法,可提升系统的可观测性与运维效率。
                    629 1
                    日志收集和Spring 微服务监控的最佳实践
                    |
                    6月前
                    |
                    存储 缓存 监控
                    用 C++ 红黑树给公司电脑监控软件的日志快速排序的方法
                    本文介绍基于C++红黑树算法实现公司监控电脑软件的日志高效管理,利用其自平衡特性提升日志排序、检索与动态更新效率,并结合实际场景提出优化方向,增强系统性能与稳定性。
                    191 4
                    |
                    11月前
                    |
                    监控 测试技术 Go
                    告别传统Log追踪!GOAT如何用HTTP接口重塑代码监控
                    本文介绍了GOAT(Golang Application Tracing)工具的使用方法,通过一个Echo问答服务实例,详细展示了代码埋点与追踪技术的应用。内容涵盖初始化配置、自动埋点、手动调整埋点、数据监控及清理埋点等核心功能。GOAT适用于灰度发布、功能验证、性能分析、Bug排查和代码重构等场景,助力Go项目质量保障与平稳发布。工具以轻量高效的特点,为开发团队提供数据支持,优化决策流程。
                    687 90
                    |
                    11月前
                    |
                    消息中间件 运维 监控
                    智能运维,由你定义:SAE自定义日志与监控解决方案
                    通过引入 Sidecar 容器的技术,SAE 为用户提供了更强大的自定义日志与监控解决方案,帮助用户轻松实现日志采集、监控指标收集等功能。未来,SAE 将会支持 istio 多租场景,帮助用户更高效地部署和管理服务网格。
                    640 52
                    |
                    12月前
                    |
                    数据采集 运维 监控
                    数据采集监控与告警:错误重试、日志分析与自动化运维
                    本文探讨了数据采集技术从“简单采集”到自动化运维的演进。传统方式因反爬策略和网络波动常导致数据丢失,而引入错误重试、日志分析与自动化告警机制可显著提升系统稳定性与时效性。正方强调健全监控体系的重要性,反方则担忧复杂化带来的成本与安全风险。未来,结合AI与大数据技术,数据采集将向智能化、全自动方向发展,实现动态调整与智能识别反爬策略,降低人工干预需求。附带的Python示例展示了如何通过代理IP、重试策略及日志记录实现高效的数据采集程序。
                    548 7
                    数据采集监控与告警:错误重试、日志分析与自动化运维
                    |
                    12月前
                    |
                    存储 监控 算法
                    基于 PHP 语言的滑动窗口频率统计算法在公司局域网监控电脑日志分析中的应用研究
                    在当代企业网络架构中,公司局域网监控电脑系统需实时处理海量终端设备产生的连接日志。每台设备平均每分钟生成 3 至 5 条网络请求记录,这对监控系统的数据处理能力提出了极高要求。传统关系型数据库在应对这种高频写入场景时,性能往往难以令人满意。故而,引入特定的内存数据结构与优化算法成为必然选择。
                    315 3
                    |
                    消息中间件 运维 监控
                    智能运维,由你定义:SAE自定义日志与监控解决方案
                    SAE(Serverless应用引擎)是阿里云推出的全托管PaaS平台,致力于简化微服务应用开发与管理。为满足用户对可观测性和运维能力的更高需求,SAE引入Sidecar容器技术,实现日志采集、监控指标收集等功能扩展,且无需修改主应用代码。通过共享资源模式和独立资源模式,SAE平衡了资源灵活性与隔离性。同时,提供全链路运维能力,确保应用稳定性。未来,SAE将持续优化,支持更多场景,助力用户高效用云。
                    |
                    运维 监控 虚拟化
                    除了实时性能监控,Hyper-V还支持日志记录和警报功能你知道吗?
                    Hyper-V不仅支持实时性能监控,还具备强大的日志记录和警报功能。通过事件查看器可访问详细的日志文件,涵盖虚拟机管理、配置及Hypervisor事件,帮助故障排查和性能分析。警报功能支持预定义和自定义规则,可通过多种方式通知管理员,确保及时响应问题,保障虚拟化环境的稳定运行。