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

server/2024/12/24 22:08:16/

0.简介

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

1.开启和使用方式

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

2.整体进程结构

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

在这里插入图片描述

3.启动流程

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

在这里插入图片描述

4.通信协议

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

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的思想,将不同模块的输出全部输出给一个独立的模块(进程),它内部负责解析不同格式并将其以统一格式输出,也就是统一处理和适配的思路。


http://www.ppmy.cn/server/152881.html

相关文章

16×16LED点阵字符滚动显示-基于译码器与移位寄存器(设计报告+仿真+单片机源程序)

资料下载地址:​1616LED点阵字符滚动显示-基于译码器与移位寄存器(设计报告仿真单片机源程序)​ 1、功能介绍 设计1616点阵LED显示器的驱动电路,并编写程序实现在1616点阵LED显示器上的字符滚动显示。1616点阵LED显示器可由4块88点阵LED显示器构成。可采…

1387. 将整数按权重排序 中等

我们将整数 x 的 权重 定义为按照下述规则将 x 变成 1 所需要的步数: 如果 x 是偶数,那么 x x / 2如果 x 是奇数,那么 x 3 * x 1 比方说,x3 的权重为 7 。因为 3 需要 7 步变成 1 (3 --> 10 --> 5 --> 1…

PSO求解函数最小值的MATLAB例程|MATLAB源代码

本篇文章适合PSO入门,进阶的可能会觉得太简单的。 目录 PSO例程作用运行结果代码函数解释 例程修改tips完整代码: PSO Particle Swarm Optimization,粒子群优化算法,通过模拟鸟群或鱼群的行为来寻找最优解。在计算时通过对一群粒…

代理IP与科技创新:算力资源的灵活调度与高效利用

目录 一、代理IP的基本原理 二、代理IP在算力资源调度中的优势 流量管理与优化 提高访问速度 三、代理IP在AI算力集群中的应用 四、具体案例 电商领域 金融领域 制造业 媒体与娱乐 五、代理IP与AI技术的融合 六、面临的挑战与解决方案 七、结论 在数字化时代&…

【WRF教程第3.3期】预处理系统 WPS 详解:以4.5版本为例

预处理系统 WPS 详解:以4.5版本为例 非等压气象数据集(Using Non-isobaric Meteorological Data Sets)湖泊SST初始化(Alternative Initialization of Lake SSTs)WPS并行化(Parallelism in the WPS&#xff…

Golang中的Goroutine调度策略

Golang中的Goroutine调度策略是其并发编程模型的核心之一,它使得Go语言能够有效地利用硬件资源,处理大量的并发任务。以下是对Golang中Goroutine调度策略的详细叙述: 一、调度器模型 Golang的调度器采用M:N调度模型,其中M代表用…

密码生成器:随机密码在线生成,保障您的数字安全

问:什么是密码生成器? 答:密码生成器是一种工具或软件,专门用于创建复杂且随机的密码。这些密码通常包含大小写字母、数字、特殊字符等多种元素,旨在提高账户的安全性,防止密码被破解或猜测。 问&#xf…

验证码机制

偶然间看到了验证码机制,顺便总结一下: 首先,验证码是从后端生成的,随机生成; 【后端永远认为前端有可能会被伪造】 1.后端调用相关的绘图第三方类库,或是(平台PHP、.NET、java)系…