首页 > 数据库 >Postgresql 如何降低 wal 占用磁盘空间,降低磁盘存储成本

Postgresql 如何降低 wal 占用磁盘空间,降低磁盘存储成本

时间:2023-06-22 13:02:14浏览次数:47  
标签:wal Postgresql full 磁盘空间 WAL POSTGRESQL 日志 page


Postgresql   如何降低 wal  占用磁盘空间,降低磁盘存储成本_redis

POSTGRESQL WAL 的存储一直是一个值得讨论的问题,到底一个POSTGRESQL 在极端的情况下,可以用多少的空间来存储WAL 日志。这里不是要讨论逻辑复制槽,也不是讨论ARCHIVE ,这里要讨论是一种极端的方法,尝试将POSTGRESQL WAL占用的磁盘空间最小化。

这里主要针对的对象是,单机的POSTGRESQL ,不想通过专业的人员来进行维护的场景,如果说目前的方案需要一个场景,这就是这篇文字要面对的场景。这个场景主要面对的是一些,线下的场景,这些场景中的POSTGRESQL 并没有专业的维护人员,更不要提DBA ,这些系统可能和一些应用系统统一安装,并且可能长时间无法进行维护。

这个方案中需要一个基准,就是系统在采用方法后,产生的WAL 日志的数量和不使用这样的方案产生的数量的差异,来对比实际上我们的方案后的效果。

这里我们在测试前,可以看到我们有 20 个文件,然后我们在对这个系统进行压测,并查看产生多少wal 日志。

Postgresql   如何降低 wal  占用磁盘空间,降低磁盘存储成本_大数据_02

首先在测试前记录日志的起点  然后在测试后,记录压测后的WAL 的记录点

Postgresql   如何降低 wal  占用磁盘空间,降低磁盘存储成本_数据库_03

Postgresql   如何降低 wal  占用磁盘空间,降低磁盘存储成本_redis_04

同时通过命令我们对刚才压测期间的日志进行分析,查看整体日志记录的内容和消耗。

Postgresql   如何降低 wal  占用磁盘空间,降低磁盘存储成本_python_05

准备工作完毕后,我们开始降低POSTGRESQL 日志的方法的讨论。

1  full page 

众所周知,在POSTGRESQL WAL 为了保证日志的在系统crash后,有最后一次checkpoint 前的数据的完整的页面,需要在必要的时刻,在数据页面未写入完全的时候,通过日志来先还原最后checkpoint前的页面。那么我们将这个部分观点后,看看,WAL 能节省多少。

先说一下测试的流程

1  产生新的wal log

2  记录 wal log lsn 号

3  对数据库进行压测

4  记录产生的新的记录号

5  对于整体的日志产生进行分析。

Postgresql   如何降低 wal  占用磁盘空间,降低磁盘存储成本_python_06

在测试完毕后,我们对比,单纯打开和关闭 full page 的产生的 wal  日志的总量。  这里注意有一种重要的指标 FPI ,FPI 就是  full page  insert 的意思,这里可以看到,整体的日志量的产生,主要在 fpi ,产生的日志量占总体的wal 日志的 96%.

那么此时第一个问题 full page  关闭后,对日志的影响的大概,大家心里也会有数,full page 的确是wal 日志中记录的数据的大头。

2  延长checkpoint 的时间的方法

这个想法是基于减少checkpint 中full page 的原因,如果减少了checkpoint 那么自然full page 的量也会减少。

我们调整两个参数,尝试降低checkpoint的 次数,影响checkpoint的次数的主要有两个部分 1  checkpoint  timeout  2  max_wal_size 

调整 上面两个参数变小,max_wal_size 为设置的wal size 的两倍,时间为1分钟

Postgresql   如何降低 wal  占用磁盘空间,降低磁盘存储成本_大数据_07

调整上面的参数变大, max_wal_size 为 80G ,时间为 5分钟

Postgresql   如何降低 wal  占用磁盘空间,降低磁盘存储成本_数据库_08

从上图可以看到, xlog type 中的 record size 为  0 ,相对调整变小的的两个参数,xlog 的 record size为 114 。

3  提高 hot update 的几率

hot update 如果还有不清楚的可以看下面的文字,里面有详细的介绍什么hot update, 相关的优点等等

https://www.cybertec-postgresql.com/en/hot-updates-in-postgresql-for-better-performance/

提高hot update 的几率有助于减少页面分割,以及由于页面分割减少或索引减少重写的问题后,整体的WAL 日志也会减少相关的日志量,尤其针对UPDATE 逻辑较多的业务。 如何提高 HOT UPDATE的几率 

1  提高填充因子,在经常UPDATE 表的百分比,这里测试表的填充因子是 100%, 针对表可以调整到90%  ,85% ,极端的可以调整到70%。具体看业务和业务中对UPDATE 的使用率。

Postgresql   如何降低 wal  占用磁盘空间,降低磁盘存储成本_python_09

2  修改值,也即使UPDATE 的值,不能是索引本身

4  注意 wal_keep_segments 

一般这样的情况下,需要查看wal_keep_segemnts ,主要还是为了保证物理复制时,出现网络或主机故障时,能保留足够的 wal  日志,这里可以将这个位置直接写入 0 ,不进行任何保留。

Postgresql   如何降低 wal  占用磁盘空间,降低磁盘存储成本_数据库_10

5  直接将wal_level 变更为minimal 

Postgresql   如何降低 wal  占用磁盘空间,降低磁盘存储成本_redis_11

我们可以看看在修改为这样的方式后,可以减少多少的日志量,下图可以对比上面的同样的图,下面图中第一个是 minimal  第二个是 logical 的方式,可以看到两个record size 的区别,明显差了一个位数。

Postgresql   如何降低 wal  占用磁盘空间,降低磁盘存储成本_java_12

6   消减已经存在的WAL 日志的方法,可以通过 select pg_switch_wal() 来完成。

Postgresql   如何降低 wal  占用磁盘空间,降低磁盘存储成本_python_13

以上为总结的可以快速的减少单机的POSTGRESQL 的WAL 日志的方法,注意这里仅仅是为单机设置,如果是用作服务器的方式,还是老老实实将需要打开的参数打开。

Postgresql   如何降低 wal  占用磁盘空间,降低磁盘存储成本_数据库_14

标签:wal,Postgresql,full,磁盘空间,WAL,POSTGRESQL,日志,page
From: https://blog.51cto.com/u_14150796/6534691

相关文章

  • POSTGRESQL 存储过程--如何写出新版本PG的存储过程的小案例
    随着问问题的同学越来越多,公众号内部私信回答问题已经很困难了,所以建立了一个群,关于各种数据库的问题都可以,目前主要是POSTGRESQL,MYSQL,MONGODB,POLARDB,REDIS,SQLSERVER等,期待你的加入,最近在开始研究POSTGRESQL的存储过程,主要的原因有以下几个1因为要开发适合目前公司中......
  • POSTGRESQL 提高POSTGRESQL性能的一些习惯 (3)
    随着问问题的同学越来越多,公众号内部私信回答问题已经很困难了,所以建立了一个群,关于各种数据库的问题都可以,目前主要是POSTGRESQL,MYSQL,MONGODB,POLARDB,REDIS,SQLSERVER等,期待你的加入这个系列写到第三期了,实际上POSTGRESQL的优化和一个核心之一,这就是VACUUM,一个弄不清vac......
  • POSTGRESQL 统计信息与数据查询的准确性与多种统计信息类型
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。自己做了一个统计分析有关的,思维导图之前有一期说过,对于一些特殊的查询中的优化,可以在不建立索引和SQL优化的情况下,我们通过统计......
  • POSTGRESQL vacuum_freeze系列中 三个参数与 vacuum的关系
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql ,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。最近在整理VACUUM相关知识的时候,发现一个问题对于vacuum_freeze的3个参数的概念掌握的不牢固,那么只能进行恶补了。本次的三个......
  • PostgreSQL 从熊灿灿一个获取固定字符的SQL 分析巧妙之处
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。某天群里一个同学抛出一个问题,关于获取字段类型中的设置的值,随即熊老师在群里抛出以下的一个SQL (秒抛)SELECTCASEatttypid......
  • POSTGRESQL SQL 语句案例,一场由LIMIT 1 引发的“奇怪异像”
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。最近一段工作很少优化SQL,实际上7-8年前的确有一段疯狂优化的“美好时光”。 最近一个同事提出一个问题,他的一个POSTGRESQL的SQ......
  • PostgreSQL 15 stats collector 在取消后是如何实现的原有功能的
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。在POSTGRESQL15有一个重要的功能去掉了statscollector在说为什么去掉这个statscollector的问题前,我们先得弄清出statscoll......
  • POSTGRESQL 和 MYSQL 到底应该不应该控制活跃连接
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql ,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。最近群里某个同学的提问,引起的本篇文章,关于数据库连接的部分,没有废话,我们先针对MYSQL来说说数据库连接的部分。首先MYSQL的客......
  • POSTGRESQL 自动搜索所有逻辑库中的无用索引自动化脚本实现
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。前两天腾出点时间,打算整理一下POSTGRESQL公司的数据库的无用的索引的问题,写了一个SQL通过SQL来获取这些数据库的无用索引,但头......
  • PostgreSQL 15 让多年被DISS的PG 安全画上圆满的句号
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。提起POSTGRESQL中的安全问题其中最容易被人Diss的最大BUG并不是autovacuum 之类的部分,排在首位的被DISS的最大的问题是安全的......