[翻译]PostgreSQL中的WAL压缩以及版本15中的改进

news2024/11/27 7:31:56

[翻译]PostgreSQL中的WAL压缩以及版本15中的改进

从以开始就一直在尝试对WAL进行不同级别的压缩。自2016年以来内置功能(wal_compression)就一直存在,几乎所有备份工具都会在传递到备机前对WAL进行压缩。但现在是时候再看看内置的wal_compression功能了。因为PG15提供了更多功能。如果我们将其与PG15中WAL归档的其他重大改进相结合,将会有相当大的收益,如之前贴子PG15中的新WAL归档模块/库:

https://www.percona.com/blog/new-wal-archive-module-library-in-postgresql-15/

以及PG15中的WAL归档加速:

https://www.percona.com/blog/speed-up-of-the-wal-archiving-in-postgresql-15/

这里并不打算通过备份工具查看WAL段文件压缩,因为它是一个PG外部工具,主要是备份工具的一个功能,即使我们不使用专门的备份工具,我们仍然可以将WAL段文件作为归档的一部分进行压缩,这可以获得很大回报。

先看下PG内部为WAL压缩提供了什么。在将整页写入WAL时启动WAL压缩功能,这将节省大量IO开箱。减小WAL段文件大小在复制和备份方面有进一步的好处,毕竟需要传输的数据更少了嘛。

什么是全页写?

新手用户可能想了解啥是“Full Page Writes”,PG默认使用8KB页面。

postgres=# show block_size ;
block_size
------------
8192
(1 row)

但是主机可能正在处理更小的页面,比如 4k 页面。

$ getconf PAGESIZE
4096

PG将8KB页作为读写的“原子单位”来处理。但由于主机的页面较小,它会拆分8KB页面,并将每个OS页面视为一个原子单位。如果突然中断,会导致问题:8KB页面的一部分可能已保存,而另一部分可能会丢失。因为主机可能不会将后者视为原始部分的一部分。这就是通常说的“部分页面写入”或“撕裂页面”。

从数据库的角度来看,这种“损坏的页面”是损坏的。如果存在具有这种撕裂页面的数据文件,PG将失去页面的一致性。当然,这不仅仅是PG的问题,每个数据库软件都需要处理整个问题。例如MySQL/InnoDB使用doublewrite缓冲区处理此问题,恢复时从doublewrite恢复未损坏页面的副本。PG解决这个问题的方法略有不同。该副本在检查点后首次修改时,PG将完整页面的副本写入WAL有日志中。由于WAL周期性同步,并且PG也可以决定在哪个点进行恢复,因此WAL是一个安全的地方用于保存“整页”副本。

全页写的性能损失

如上所述,当数据库页面在检查点之后第一次被修改时,需要将其安全地写入 WAL。因此在崩溃恢复期间,PostgreSQL 可以安全地应用来自 WAL 日志的一致页面。但这会带来相当大的性能影响。

现在我们知道在一个检查点之后很有可能会立即进行过多的整页写入。这将在 PostgreSQL性能基准测试中清晰可见,作为Vadim 在他的测试中观察到的“锯齿波”模式:

ccba247b7b9fab1073339a8055639894.png

正如我们所看到的,由于大量 WAL 写入,吞吐量在每个检查点之后突然下降,然后逐渐回升,直到下一个检查点。

全页压缩和改进

PG14及其之前的版本全页更大并且包含所有内容。允许在写入WAL段文件之前压缩那些完整的页面。这个特性在PG9.5就出现了,使用内置的LZ压缩实现,通常称为“pglz”。但由于CPU开销,并不受欢迎。所以并不建议使用。可以使用如下命令启用:

ALTER SYSTEM SET wal_compression=ON;
SELECT pg_reload_conf();

现在的压缩算法开始提供更好的压缩,同时占用更少的CPU周期。Lz4就是一个很好的例子。PG15针对wal_compression增加了枚举值:pglz、lz4、zstd。以及向后兼容的on和off。on,true,yes和1等布尔等效于“pglz”。

与 PostgreSQL中内置的压缩库 pglz 不同,新的压缩功能由外部库提供。因此需要在编译时启用它们。配置标志–with-lz4和–with-zstd分别用于 lz4 和 zstd。

对于repositories中安装的预编译安装包,可以使用下面命令来检查:

/usr/pgsql-15/bin/pg_config | grep "zstd\|lz4"
CONFIGURE = '--enable-rpath' '--prefix=/usr/pgsql-15' '--includedir=/usr/pgsql-15/include' '--mandir=/usr/pgsql-15/share/man' '--datadir=/usr/pgsql-15/share' '--libdir=/usr/pgsql-15/lib' '--with-lz4' '--with-extra-version= - Percona Distribution' '--with-zstd' '--with-icu' '--with-llvm' '--with-perl' '--with-python' '--with-tcl' '--with-tclconfig=/usr/lib64' '--with-openssl' '--with-pam' '--with-gssapi' '--with-includes=/usr/include' '--with-libraries=/usr/lib64' '--enable-nls' '--enable-dtrace' '--with-uuid=e2fs' '--with-libxml' '--with-libxslt' '--with-ldap' '--with-selinux' '--with-systemd' '--with-system-tzdata=/usr/share/zoneinfo' '--sysconfdir=/etc/sysconfig/pgsql' '--docdir=/usr/pgsql-15/doc' '--htmldir=/usr/pgsql-15/doc/html' 'CFLAGS=-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection' 'LDFLAGS=-Wl,--as-needed' 'LLVM_CONFIG=/usr/bin/llvm-config' 'CLANG=/usr/bin/clang' 'PKG_CONFIG_PATH=:/usr/lib64/pkgconfig:/usr/share/pkgconfig' 'PYTHON=/usr/bin/python3'
LIBS = -lpgcommon -lpgport -lselinux -lzstd -llz4 -lxslt -lxml2 -lpam -lssl -lcrypto -lgssapi_krb5 -lz -lreadline -lpthread -lrt -ldl -lm

为什么仅压缩全页写?

各个进程产生WAL记录,延迟对于事务来说非常重要。因此压缩所有WAL可能不会增加太多价值。但是如果将来包含这样的功能,那么索引或者批量加载数据等领域可能会从WAL压缩中获得收益。

压缩选项

当谈到压缩时,自然而然地,问题将是关于 I/O 的节省。众所周知,压缩是以 CPU 使用为代价的。我的目标是快速检查当 CPU 利用率已经很高时是否有任何好处,以及是否对整体 TPS 有任何不利(负面)影响。

如果有大量整页写入,则可以节省相当多的钱。我可以人为触发检查点以查看对总 WAL 生成的最终影响。

fbfff7085dcfe4ec9429e99cedffd7d5.png

Lz4以更少的CPU成本提供与默认pglz相当的压缩。Zstd可以提供最高的压缩率(比 lz4 多 30%)。

在一个已经处于生成过多WAL边缘的系统中,未压缩的WAL可以触发更多的检查点,从而导致生成更多的WAL。

总结

1)老版本中的pglz压缩方法并不高效。使用更多CPU在指定工作负载和机器配置下影响TPS。

2)现在的压缩算法和库非常优秀,相比pglz可以做更多的工作。

3)测试中看不出对TPS有啥不利影响,相反,启用压缩后,观察到有10-15%的提升,可能因为更少的IO wait。

4)如果数据库负载的瓶颈是CPU,那么建议使用lz4,因为该算法相对使用较少的CPU。压缩效果接近gplz但不会造成较高的CPU消耗

5)如果服务器负载不受限制,可以使用zstd,可以以更多的CPU利用率为代价,为我们提供更好的压缩

6)WAL压缩的一个间接好处是减少了由生成WAL量(max_wal_size)触发checkpoint的几率

压缩的实际好处取决于许多因素。配置的检查点频率、WAL 生成触发检查点的机会、存储性能、可接受的 CPU 开销、CPU 架构类型以及许多其他因素。随着新选项的引入,进入壁垒显着降低。

原文

https://www.percona.com/blog/wal-compression-in-postgresql-and-recent-improvements-in-version-15/

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

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

相关文章

呦~,这不 SVG 映射反爬么,这你都会?厉害厉害 | 案例 25

在正式学习本篇博客前,先要了解一下什么是 SVG(Scalable Vector Graphics),它是一种矢量图形格式,可以用来在网页上创建可伸缩的图形。 使用 SVG 技术实现反爬虫的方法有以下几种: 验证码:使用…

imx6ull Linux使用设备树配置LED

我们基于寄存器的方式已经编写了LED驱动,实现点亮/熄灭LED,但是你有没有发现一个问题,就是假设LED修改了一个GPIO,那么需要对应的修改寄存器代码,非常繁琐,而且随着改板次数增加,那么会带来一个…

从零开始的数模(五)插值与拟合

目录 一、概念 二、 插值 2.1方法 2.2MATLAB实现 例题1 ​编辑例题2 2.3python实现 2.3.1例题一的python解法 2.3.2二维网格节点插值 例题四 三、拟合篇: 3.1MATLAB实现 3.2python实现 一、概念 二、 插值 2.1方法 2.2MATLAB实现 在MATLAB中提供了一些…

带滤波器的PID控制仿真-2(M语言)

被控对象为三阶传递函数:低通滤波器为:采样时间为1ms,噪声信号加在对象的输出端。分三种情况进行:M1 时,为未加噪声信号;M2时,为加噪声信号未加滤波;M3时,为加噪声信号加滤波。阶跃响应结果如图1&#xff5…

【论文精读】KD-MVS

今天读的是发表在ECCV2022上的自监督MVS文章,作者来自于旷视科技和清华大学。 文章链接:arxiv 代码链接:https://github.com/megvii-research/KD-MVS 目录Abstract1. Introduction2. Related work3. Methodology3.1 Self-supervised Teacher …

51单片机七人多数表决器仿真设计( proteus仿真+程序+报告+讲解视频)

51单片机七人多数表决器仿真设计( proteus仿真程序报告讲解视频) 仿真图proteus 7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0033 51单片机七人多数表决器仿真设计视频讲解1.主要功能:2.仿真3.…

Java:Mybatis的使用

一、Mybatis的概述 MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发。 MyBatis中文官网:https://mybatis.org/mybatis-3/zh/getting-started.html 二、Mybatis快速入门 1、创建user表,添加数据 create database mybatis; use mybati…

英语语法大全

文章目录一、主语1、名词、代词和动词做主语2、主语从句做主语,谓语动词用单数3、主语从句练习二、谓语动词1、谓语动词种类2、主谓一致三、宾语1、单宾语2、双宾语3、复合宾语4、宾语从句四、定语1、定语从句2、定语从句的翻译五、状语1、分词做状语2、独立主格结构…

42.Isaac教程--超像素

超像素 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 超像素是一组外观相似的相连像素。 超像素分割将图像分成数百个不重叠的超像素(而不是数千或数百万个单独的像素)。通过使用超像素,您可以在更有意义的区…

ESP-C3入门2. Clion+IDF 开发环境搭建

ESP-C3入门2. ClionIDF 开发环境搭建一、准备工作二、Clion配置过程1. 使用idf.py命令创建一个范例工程2. 使用Clion打开项目,修改CMakeLists.txt3. 设置交叉编译工具链4. 设置CMake5. 对cmake一些路径进行修改。三、编译及烧录1. 编译2. 烧录3. 查看输出一、准备工…

审核中台业务数据进审升级之路

本文字数:3850字预计阅读时间:15 分钟目录1.背景1.1. 相关名词介绍1.2. 审核中台介绍1.3. 业务痛点介绍2. 规范化改造2.1 规范通讯协议2.2 规范处理流程3. 自动化改造3.1 业务接入检测器3.2 数据自动化流转3.3 源码示例4. 总结1.背景1.1 相关名词介绍1.1…

计算机图形学基础教程(Visual C++版)习题解答与编程实践(第2版)孔令德1-到第3章的直线扫描转换

1-到第3章的直线扫描转换(没更新完)习题1知识积累习题2知识点映射模式使用GDI对象习题3知识积累直线的中点Bresenham算法习题1 1.计算机图形学的定义是什么?说明计算机图形学、图像处理和模式识别之间的关系。 答: CG是计算机图形学的缩写。…

实验一、旅馆客户服务呼叫显示系统

实验一 旅馆客户服务呼叫显示系统 实验目的 综合应用数字电子技术知识,按照要求设计并完成一个小规模的数字电路系统。进行硬件线路的设计、仿真、焊接、调试与实现。使系统实现一种用于旅馆客户服务呼叫显示系统的实用电路。在呼叫过程中,当8位旅客有…

Spark Core ---- RDD持久化

RDD的数据是过程数据 RDD之间进行相互迭代计算(Transformation的转换),当执行开启后,新RDD的生成,代表老RDD的消失 RDD的数据是过程数据,只在处理的过程中存在,一旦处理完成,就不见…

【数据结构和算法】实现带头双向循环链表(最复杂的链表)

前文,我们实现了认识了链表这一结构,并实现了无头单向非循环链表,接下来我们实现另一种常用的链表结构,带头双向循环链表。如有仍不了解单向链表的,请看这一篇文章(7条消息) 【数据结构和算法】认识线性表中的链表&…

Spring Boot之SpringSecurity学习

文章目录一 SpringSecurity简介二 实战演示0. 环境 介绍1. 新建一个初始的springboot项目2. 导入thymeleaf依赖3. 导入静态资源4. 编写controller跳转5. 认证和授权6. 权限控制和注销7. 记住登录8. 定制登录页面三 完整代码3.1 pom配置文件3.2 RouterController.java3.3 Securi…

那些面试官口中常常提到b树(MySQL索引底层数据结构)

各种常见树1.树的基本概念2.二叉树3.b树4.b树5.b树与b树的对比5.MySQL索引底层数据结构1.树的基本概念 树的特点:有一个树根,树根上又有很多枝干,枝干上又有很多树枝,树枝上又有很多叶子 树最为一种数据结构也有相似特点 树是一个…

【计算机网络(考研版)】第二站:物理层(一)

前言 如下图所示,这是我们之前所说的数据流动示意图 我们将按照从下向上的结构进行学习。这一讲学习第一层物理层。物理层关注在一条通信信道上传输原始比特,即无论面对什么样的传输介质(有线或者无线)都可以传输比特流,物理层的作用正是要尽…

Python3 函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。 函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户…

Node require 正解

require 实现原理 流程概述 步骤1:尝试执行代码require("./1"). 开始调用方法require.步骤2:此时会得到filename,根据filename 会判断缓存中是否已经加载模块,如果加载完毕直接返回,反之继续执行步骤3&…