PostgreSQL技术内幕21:SysLogger日志收集器的工作原理

0.简介

在前面文章中介绍了事务模块用到的事务日志结构和其工作原理,本文将介绍日志的另一个部分,操作日志,主要去描述SysLogger日志的工作原理,流程以及其中关键的实现:日志轮转,刷盘性能问题等,同时基于这个实现考虑统一日志的设计方法(可以借鉴的思想)。

1.开启和使用方式

开启SysLogger进程需要在postgresql.conf中,设置日志收集器辅助进程选项logging_collector的值为on,其默认为off,即关闭的。在配置文件postgresql.conf中还有很多日志相关的选项,以log开头,此处不再详细一一列举,只描述日志辅助进程开启方式。

2.整体进程结构

对于后台进程和SysLogger进程关系如下:

3.启动流程

启动流程其实就是postmaster进程去fork出syslogger子进程,子进程执行SysLoggerMain函数,其中会循环处理等待消息,接受和写入流程。

4.通信协议

其中后台进程和SysLogger通信协议格式如下:

cpp 复制代码
typedef struct
{
  char    nuls[2];    /* always \0\0 */
  uint16    len;      /* size of this chunk (counts data only) */
  int32    pid;      /* writer's pid */
  char is_last;    /* last chunk of message*/
  char    data[FLEXIBLE_ARRAY_MEMBER];  /* data payload starts here */
} PipeProtoHeader;

其中总是以两个\0\0开头;len用来记录当前chunk的长度;pid用于记录发送的进程id(用来做分组);is_last标识切割成多个包的日志当前是否是最好一个,syslogger接收后统一写入日志文件;data用来记录信息。

一次完成接收日志过程为:syslogger 在接收到日志消息后,将其按照 pid 进行分组,相同的 pid 说明日志消息来源于同一进程,将其组装起来,当收到包含 is_last 标记的最后一个 chunk 后,将整条日志消息打印到日志文件。

5.关键实现

5.1 日志轮转

日志轮转,通俗的说就是不想写当前日志文件了,需要找一个新的文件去写,这部分通过四个参数来判断需不需要新的文件以及其命名规则。

1)log_filename :指定日志文件的格式,假如指定的格式为test_%d_%h,那么x月1 日 1点的日志文件名就是 test_1_1.log。

2)log_rotation_age:指定超时时间,超过的话就新开一个日志文件。

3)log_rotation_size:指定限制大小,超过的话就新开一个日志文件。

4)log_truncate_on_rotation:指定是否按时间轮转后做截断。即如果下一个日志同名文件已经存在,是否直接清空该文件并从头开始写。

5.2 刷盘策略

PG 的日志在刷盘时的默认策略为:_IOLBF(行缓冲刷盘)即行满即刷盘,虽然可以保证日志尽可能不丢失,但是如果数据多的话会影响性能,linux三种刷盘方式如下,PG采用第二种:

1)_IOFBF:全缓冲模式,缓冲区写满后才刷盘

2)_IOLBF:行缓冲模式,一行写满就刷盘

3)_IONBF:不缓冲,直接刷

6.关于统一日志输出格式的思考

现在的日志系统大都要求要统一格式方便去做归档或者入库,对于老的系统,很多模块的日志格式并不统一,最简单想到的方式是去每个模块修改其日志格式;但还有一种可以借鉴PG SysLogger的思想,将不同模块的输出全部输出给一个独立的模块(进程),它内部负责解析不同格式并将其以统一格式输出,也就是统一处理和适配的思路。

相关推荐
Hello.Reader1 小时前
Redis 延迟排查与优化全攻略
数据库·redis·缓存
简佐义的博客2 小时前
破解非模式物种GO/KEGG注释难题
开发语言·数据库·后端·oracle·golang
爬山算法2 小时前
MySQL(116)如何监控负载均衡状态?
数据库·mysql·负载均衡
老纪的技术唠嗑局4 小时前
OceanBase PoC 经验总结(二)—— AP 业务
数据库
阿里云大数据AI技术5 小时前
OpenSearch 视频 RAG 实践
数据库·人工智能·llm
m0_623955667 小时前
Oracle使用SQL一次性向表中插入多行数据
数据库·sql·oracle
阿蒙Amon8 小时前
C#读写文件:多种方式详解
开发语言·数据库·c#
东窗西篱梦8 小时前
Redis集群部署指南:高可用与分布式实践
数据库·redis·分布式
就是有点傻9 小时前
C#如何实现中英文快速切换
数据库·c#
1024小神9 小时前
hono框架绑定cloudflare的d1数据库操作步骤
数据库