PG14 监控和日志功能提升

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 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/

                    相关实践学习
                    日志服务之使用Nginx模式采集日志
                    本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
                    目录
                    相关文章
                    |
                    1月前
                    |
                    Rust 前端开发 JavaScript
                    Tauri 开发实践 — Tauri 日志记录功能开发
                    本文介绍了如何为 Tauri 应用配置日志记录。Tauri 是一个利用 Web 技术构建桌面应用的框架。文章详细说明了如何在 Rust 和 JavaScript 代码中设置和集成日志记录,并控制日志输出。通过添加 `log` crate 和 Tauri 日志插件,可以轻松实现多平台日志记录,包括控制台输出、Webview 控制台和日志文件。文章还展示了如何调整日志级别以优化输出内容。配置完成后,日志记录功能将显著提升开发体验和程序稳定性。
                    68 1
                    Tauri 开发实践 — Tauri 日志记录功能开发
                    |
                    1月前
                    |
                    存储 监控 固态存储
                    如何监控和优化 WAL 日志文件的存储空间使用?
                    如何监控和优化 WAL 日志文件的存储空间使用?
                    |
                    1月前
                    |
                    监控 网络协议 CDN
                    阿里云国际监控查询流量、用量查询流量与日志统计流量有差异?
                    阿里云国际监控查询流量、用量查询流量与日志统计流量有差异?
                    |
                    2月前
                    |
                    存储 监控 数据可视化
                    SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
                    【9月更文挑战第2天】SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
                    152 9
                    |
                    2月前
                    |
                    运维 Kubernetes 监控
                    Loki+Promtail+Grafana监控K8s日志
                    综上,Loki+Promtail+Grafana 监控组合对于在 K8s 环境中优化日志管理至关重要,它不仅提供了强大且易于扩展的日志收集与汇总工具,还有可视化这些日志的能力。通过有效地使用这套工具,可以显著地提高对应用的运维监控能力和故障诊断效率。
                    294 0
                    |
                    3月前
                    |
                    SQL 数据库 Java
                    Hibernate 日志记录竟藏着这些秘密?快来一探究竟,解锁调试与监控最佳实践
                    【8月更文挑战第31天】在软件开发中,日志记录对调试和监控至关重要。使用持久化框架 Hibernate 时,合理配置日志可帮助理解其内部机制并优化性能。首先,需选择合适的日志框架,如 Log4j 或 Logback,并配置日志级别;理解 Hibernate 的多级日志,如 DEBUG 和 ERROR,以适应不同开发阶段需求;利用 Hibernate 统计功能监测数据库交互情况;记录自定义日志以跟踪业务逻辑;定期审查和清理日志避免占用过多磁盘空间。综上,有效日志记录能显著提升 Hibernate 应用的性能和稳定性。
                    50 0
                    |
                    3月前
                    |
                    开发者 前端开发 编解码
                    Vaadin解锁移动适配新境界:一招制胜,让你的应用征服所有屏幕!
                    【8月更文挑战第31天】在移动互联网时代,跨平台应用开发备受青睐。作为一款基于Java的Web应用框架,Vaadin凭借其组件化设计和强大的服务器端渲染能力,助力开发者轻松构建多设备适应的Web应用。本文探讨Vaadin与移动设备的适配策略,包括响应式布局、CSS媒体查询、TouchKit插件及服务器端优化,帮助开发者打造美观且实用的移动端体验。通过这些工具和策略的应用,可有效应对屏幕尺寸、分辨率及操作系统的多样性挑战,满足广大移动用户的使用需求。
                    66 0
                    |
                    3月前
                    |
                    存储 运维 监控
                    Entity Framework Core 实现审计日志记录超棒!多种方法助你跟踪数据变化、监控操作,超实用!
                    【8月更文挑战第31天】在软件开发中,审计日志记录对于跟踪数据变化、监控用户操作及故障排查至关重要。Entity Framework Core (EF Core) 作为强大的对象关系映射框架,提供了多种实现审计日志记录的方法。例如,可以使用 EF Core 的拦截器在数据库操作前后执行自定义逻辑,记录操作类型、时间和执行用户等信息。此外,也可通过在实体类中添加审计属性(如 `CreatedBy`、`CreatedDate` 等),并在保存实体时更新这些属性来记录审计信息。这两种方法都能有效帮助我们追踪数据变更并满足合规性和安全性需求。
                    78 0
                    |
                    3月前
                    |
                    存储 JSON 监控
                    FastAPI日志之谜:如何揭开Web应用监控与调试的面纱?
                    【8月更文挑战第31天】在现代Web开发中,日志记录对于监控应用状态、诊断问题和了解用户行为至关重要。FastAPI框架提供了强大的日志功能,使开发者能轻松集成日志记录。本文将详细介绍如何在FastAPI中设置和利用日志,包括基础配置、请求响应日志、错误处理和结构化日志等内容,帮助提升应用的可维护性和性能。
                    137 0
                    |
                    3月前
                    |
                    消息中间件 Prometheus 监控
                    Producer的监控与日志记录最佳实践
                    【8月更文第29天】在分布式系统中,消息队列作为关键组件之一,其稳定性和性能至关重要。生产者(Producer)负责生成并发送消息到消息队列中,因此确保生产者的健康运行是非常重要的。本文将探讨如何为生产者设置监控和日志记录,以跟踪其健康状况和性能指标。
                    62 0