Write-Ahead Logging (WAL)相关参数配置

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Write-Ahead Logging (WAL)是保证数据完整性的标准方法,在大多数关于事务处理的书中都可以找到详细的描述。 简单的说,WAL的核心思想是确保数据文件的更改必须在这些更改被写入日志之后才能进行。

Write-Ahead Logging (WAL)是保证数据完整性的标准方法,在大多数关于事务处理的书中都可以找到详细的描述。

简单的说,WAL的核心思想是确保数据文件的更改必须在这些更改被写入日志之后才能进行。
遵循这个原则,就不需要在每个事物中将数据刷新到磁盘提交。因为在发生崩溃时,我们能够使用日志,将没有写入到磁盘的任何更改从日志记录中重新执行(这是前滚恢复,也称为重做)。

PG数据库中有很多WAL相关的参数,通过正确的配置能够提高数据库的性能。

检查点

检查点与WAL有密不可分的联系。

检查点是事务序列中的点,在这些事务序列中,需要保证表和索引数据文件已经使用检查点之前的所有信息进行了更新。

在检查点发生时,将所有脏数据页刷新到磁盘,并将一个特殊的检查点记录写入日志文件。(更改记录以前被刷新到WAL文件中。)

min_wal_size、max_wal_size

在PostgreSQL 10以前版本中存在的checkpoint_segments参数已经消失,原意是指在日志文件段数量达到设置的最大值时,触发检查点。

原来是通过参数checkpoint_segments来直接指定的,而现在通过如下方式计算。(来自网络)

target = (double) max_wal_size / (2.0 + CheckPointCompletionTarget);

    /* round down */
    CheckPointSegments = (int) target;

    if (CheckPointSegments < 1)
        CheckPointSegments = 1;

CheckPoint_Completion_Target 取值范围是 (0.0,1.0)
所以最终CheckPoint_Segments得到的值范围是 max_wal_size 的 1/3 ~ 1/2

现在CheckPoint_Segments已经不存在,但是通过两个参数计算的结果可以得出,在pg_wal文件数量超过max_wal_size 1/3~1/2的时候,仍然会触发检查点。

触发检查点的方式

服务器的checkpointer进程会自动执行检查点。

  • checkpoint_timeout,当达到该参数的时间时,自动触发检查点
  • max_wal_size,当数据量将超过该参数配置的最大值时,自动触发检查点
  • 当pg_wal目录下日志文件段的数量超过一定数量时
  • 手工执行CHECKPOINT命令

checkpoint_timeout,max_wal_size两个参数的默认配置分别是5分钟和1GB。哪个先满足条件,先触发执行检查点。

降低checkpoint_timeout或者max_wal_size的大小,会使检查点执行的频率更高。

检查点的执行对数据库来说是“相当昂贵”的,首先是因为写出当前所有脏缓冲区会对IO造成冲击。其次,如果配置了参数full_page_writes ,它们会导致额外WAL读写压力。

full_page_writes (boolean)

当启用此参数时,PostgreSQL服务器将在检查点之后第一次修改该页时将每个磁盘页的全部内容写入WAL.

有时这是必需的,因为在操作系统崩溃期间正在进行的读写操作可能只完成了部分,从而导致磁盘上的页面包含新旧数据的混合。

通常存储在WAL中的行级更改数据不足以在崩溃后完全恢复,存储完整的页面镜像可以确保这点;

但这是以增加写入WAL的数据量为代价的。

checkpoint_warning

当检查点过于频繁,两个检查点的时间间隔少于参数checkpoint_warning设置的时间时,则会向服务器日志输出一条消息,建议增加max_wal_size。

2019-07-23 04:55:45.818 UTC [2185] LOG:  checkpoints are occurring too frequently (24 seconds apart)
2019-07-23 04:55:45.818 UTC [2185] HINT:  Consider increasing the configuration parameter "max_wal_size".

checkpoint_completion_target

为了避免大量的页面写操作增加IO负载,检查点期间写脏缓冲区的操作要分散在一段时间内。这个周期由checkpoint_completion_target参数控制。

场景1:

•checkpoint_completion_target=0.5

•checkpoint_timeout = 5min

•00G数据(需要刷进磁盘的数据量)

•1G/s

•100/(0.5*5*60)*1024≈670M/s (数据写入速度)

场景2

•checkpoint_completion_target=0.9

•checkpoint_timeout = 5min

•100G数据

•1G/s

•100/(0.9560)*1024≈380M/s

一般服务器写入速度为500M/s-1200M/s,checkpoint_completion_target设置的越高的情况下,写入速度越低,对整体性能的影响越小。反之,较低的值可能会引起I/O峰值,导致“卡死”的现象。

在同一时间通过检查点,将所有脏数据页刷新到磁盘,会导致显著增加I/O的负载。因此,对检查点活动进行节流,确保I/O从检查点从开始到完成是在下一个检查点开始前。这将有效改善检查点期间的性能下降。

wal_segment_size 日志文件段的大小

pg_wal目录下的文件大小,由该参数决定。该参数只能在initdb时指定

默认值为16MB

pg_wal目录中wal段文件的个数

pg_wal目录中的WAL段文件的数量取决于min_wal_size、max_wal_size和以前检查点周期中生成的WAL的数量。

可以简单理解为,当服务器不繁忙时,文件个数处于一定个数,并循环使用。
即便使用 select pg_switch_wal();命令,也不会增加文件的个数。

但是当存在大量插入操作的时候,由于没有及时触发检查点,会导致wal段文件迅速增长,直到触发检查点后重复使用文件,或在转为不繁忙时,定期删除不用的wal文件段。

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
机器学习/深度学习 Web App开发 算法
如何寻找论文及其相关代码?
如何寻找论文及其相关代码?
1380 1
|
11月前
|
Java 关系型数据库 开发工具
idea创建不了spring2.X版本,无法使用JDK8,最低支持JDK17 , 如何用idea创建spring2.X版本,使用JDK8解决方案
本文提供了解决方案,如何在IDEA中创建Spring 2.X版本的项目并使用JDK8,尽管Spring 2.X已停止维护且IDEA不再直接支持,通过修改pom.xml或使用阿里云的国内源来创建项目。
1029 0
idea创建不了spring2.X版本,无法使用JDK8,最低支持JDK17 , 如何用idea创建spring2.X版本,使用JDK8解决方案
|
12月前
|
运维 Devops 应用服务中间件
DevOps实践:使用Ansible进行自动化部署
【9月更文挑战第28天】在当今快节奏的软件开发环境中,DevOps的实践已成为提升效率和可靠性的关键。本文将探讨如何利用Ansible这一强大的自动化工具来简化部署流程。通过实际示例,我们将展示如何配置Ansible playbook,实现代码的自动部署和服务器管理任务的自动化,从而帮助团队减少人为错误,加快发布周期,确保软件交付的一致性和可预测性。
|
存储 Java Maven
使用 nohup 部署和后台运行Java 项目
使用 nohup 部署和后台运行Java 项目
687 1
使用 nohup 部署和后台运行Java 项目
|
机器学习/深度学习 人工智能 自然语言处理
软件测试中的人工智能应用
本文探讨了人工智能在软件测试中的应用,包括自动化测试、缺陷预测和测试用例生成等方面。通过实际案例分析,展示了如何利用AI技术提高软件测试的效率和准确性,并讨论了未来的发展趋势。
276 0
|
存储 数据可视化 安全
Java全套智慧校园系统源码springboot+elmentui +Quartz可视化校园管理平台系统源码 建设智慧校园的5大关键技术
智慧校园指的是以物联网为基础的智慧化的校园工作、学习和生活一体化环境,这个一体化环境以各种应用服务系统为载体,将教学、科研、管理和校园生活进行充分融合。无处不在的网络学习、融合创新的网络科研、透明高效的校务治理、丰富多彩的校园文化、方便周到的校园生活。简而言之,“要做一个安全、稳定、环保、节能的校园。
338 6
|
安全 前端开发 JavaScript
什么是同源策略?
什么是同源策略?
449 1
|
设计模式 Java 数据库连接
Spring 中经典的 9 种设计模式
Spring 中经典的 9 种设计模式
176 2
|
缓存 负载均衡 网络协议
【亮剑】一次完整的HTTP请求的重要性和详细过程
【4月更文挑战第30天】本文介绍了HTTP请求的重要性和详细过程。首先,DNS解析将域名转换为IP地址,通过递归和迭代查询找到目标服务器。接着,TCP三次握手建立连接。然后,客户端发送HTTP请求,服务器处理请求并返回响应。最后,理解这个过程有助于优化网站性能,如使用DNS缓存、HTTP/2、Keep-Alive、CDN和负载均衡等实践建议。
532 0
|
Java Apache 数据安全/隐私保护
Java RPC调用: 远程过程调用的实现与应用
Java RPC调用: 远程过程调用的实现与应用