pg运维之checkpoint

How PostgreSQL writes data

在我们更详细地讨论检查点之前,了解PostgreSQL如何写数据是很重要的。让我们看一下下面的图片。
在这里插入图片描述

最重要的是,我们必须假设崩溃可能在任何时候发生。为什么会有这样的关系?嗯,我们要确保你的数据库永远不会被破坏。其后果是,我们不能直接向数据文件写数据。这是为什么呢?假设我们想写 "1234 "到数据文件。如果我们在 "12 "之后崩溃了怎么办?其结果将是在表的某个地方出现断裂的行。也许索引项会丢失,等等–我们必须不惜一切代价来防止这种情况。

因此,有必要采用更复杂的方式来写入数据。它是如何工作的呢?PostgreSQL做的第一件事就是把数据发送到WAL(=Write Ahead Log)。WAL就像一个偏执的顺序磁带,包含二进制变化。如果增加了一行,WAL可能包含一条记录,表明数据文件中的一行必须被改变,它可能包含几条指令来改变索引条目,也许需要写一个额外的块,等等。它只是包含一个变化的流。

一旦数据被发送到WAL,PostgreSQL将对共享缓冲区中的块的缓存版本进行修改。注意,数据仍然不在数据文件中。我们现在有了WAL条目以及对共享缓冲区的修改。如果一个读取请求进来,它无论如何也不会进入数据文件–因为数据是在缓冲区中找到的。

在某些时候,这些修改过的内存页面会被后台写程序写入磁盘。这里重要的是,数据可能会被写错顺序,这没有问题。请记住,如果用户想读取数据,PostgreSQL会在向操作系统索取数据块之前检查共享缓冲区。因此,脏块的写入顺序并不那么相关。甚至晚一点写数据也是有意义的,这样可以增加在一次I/O请求中向磁盘发送许多变化的几率。

Getting rid of WAL

然而,我们不能无限期地将数据写入WAL中。在某些时候,空间必须被回收。这正是检查点的作用。

检查点的目的是确保到某一时刻为止创建的所有脏缓冲区都被写到磁盘上,这样到该时刻为止的WAL就可以被回收了。PostgreSQL的方法是启动一个检查点进程,将那些可能丢失的变化(还是share buffers)写到磁盘上。然而,这个进程并没有尽可能快地将数据发送到磁盘。原因是我们想把I/O曲线拉平,以保证稳定的响应时间。

在这里插入图片描述

test=# SHOW checkpoint_completion_target;
checkpoint_completion_target
------------------------------
0.5
(1 row)

这个参数的意思是:一个检查点完成一半后,下一个检查点才有望启动。
在生产中,0.7 - 0.9的值似乎是大多数工作负载的最佳选择,但可以试验一下。

注意:在PostgreSQL 14中,这个参数很可能不再存在了。硬编码的值将是0.9,
这将使终端用户更容易接受。

下一个重要问题是:检查点何时真正启动?有一些参数可以控制这种行为。

test=# SHOW checkpoint_timeout;
checkpoint_timeout
--------------------
5min
(1 row)
test=# SHOW max_wal_size;
max_wal_size
--------------
1GB
(1 row)

如果你的系统的负载很低,检查点会在一定时间后发生。默认值是5分钟。然而,我们建议增加这个值以优化写入性能。

max_wal_size是一个比较棘手的问题:首先,这是一个软限制–不是一个硬限制。所以,要做好准备。WAL的数量可以超过这个数字。这个参数的意思是告诉PostgreSQL它可能积累多少WAL,并相应地调整检查点。一般的规则是:增加这个值会导致更多的空间消耗,但同时也会提高写入性能。

那么,为什么不直接将max_wal_size设置为无穷大呢?第一个原因很明显:你将需要大量的空间。然而,还有更多的原因–在你的数据库崩溃的情况下,PostgreSQL必须重复上次检查点以来的所有变化。换句话说,在崩溃之后,你的数据库可能需要更长的时间来恢复–由于自上次检查点以来积累了大量的WAL。从正面看,如果增加检查点的距离,性能确实有所提高–但是,可以做的和实现的东西是有限的。在某些时候,在问题上投入更多的存储并不能改变什么。

background writer正在向磁盘写入一些脏块。然而,在许多情况下,更多的工作是由检查点进程本身完成的。因此,把注意力放在检查点上比放在优化后台写程序上更有意义。

min_wal_size: The mysterious parameter

人们经常询问min_wal_size和max_wal_size的含义。关于这两个参数,外面有很多混乱的说法。让我试着解释一下这里发生了什么。如前所述,PostgreSQL会自行调整其检查点距离。它试图使WAL保持在max_wal_size以下。然而,如果你的系统是空闲的,PostgreSQL将逐渐减少WAL的数量,再次一直减少到min_wal_size。这不是一个快速的过程–它是逐渐发生的,在很长的一段时间内。

让我们假设一个简单的场景来说明这个情况。假设你有一个系统,在一周内有很大的写入负荷,但在周末闲置。周五下午,WAL的大小因此很大。然而,在周末,PostgreSQL会逐渐减少WAL的大小。当周一负载再次增加时,那些丢失的WAL文件将被重新创建(从性能上讲,这可能是一个问题)。

因此,不要把min_wal_size设置得太低(与max_wal_size相比),以减少在负载再次增加时创建新的WAL文件的需要,可能是一个好主意。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信聚合聊天,自动回复

微信,这款融合通讯、社交、娱乐、小程序于一体的平台,已经深深融入我们的日常生活。作为我们日常生活中不可或缺的社交工具,尤其在工作中,我们需要通过微信来沟通客户,这个时候我们就会希望有快速回复客户的方式秒回客…

Shopee个人能入驻开店吗?Shopee一个站点可以开几个店铺?

Shopee允许每个用户在同一个站点上开设多个店铺,这为商家提供了更多的经营灵活性和选择。同时,Shopee也鼓励个人用户入驻开店,提供便捷的入驻方式和丰富的支持工具。下面来看看具体介绍。 shopee个人能入驻开店吗 与许多电子商务平台相比&a…

Linux C 编程入门 (GCC 和 Makefile的使用和编写)

Linux C 编程入门 在 Windows 下我们可以使用各种各样的 IDE 进行编程,比如强大的 Visual Studio。Ubuntu 下也有一些可以进行编程的工具,但是大多都只是编辑器,也就是只能进行代码编辑,如果要编译的话就需要用到 GCC 编译器&…

手机,蓝牙开发板,TTL/USB模块,电脑四者之间的通讯

一,意图 通过手机蓝牙连接WeMosD1R32开发板,开发板又通过TTL转USB与电脑连接.手机通过蓝牙控制开发板上的LED灯的开,关,闪等动作,在电脑上打开串口监视工具观察其状态.也可以通过电脑上的串口监视工具来控制开发板上LED灯的动作,而在手机蓝牙监测工具中显示灯的状态. 二,原料…

推荐一份适合所有人做的副业,尤其是程序员!

我建议每个人都去尝试一下网上接单,这是一个门槛低、类型多样的方式,尤其适合程序员! 在接单平台上,你可以看到各种类型的兼职。以freelancer为例,你可以在这里找到技术、设计、写作等类型的兼职,只要发挥…

MongoDB(一):CentOS7离线安装MongoDB单机版与简单使用

CentOS7离线安装MongoDB单机版与简单使用 1、概述2、安装社区版2.1、前置条件2.2、下载.tgz文件2.3、解压文件2.4、安装MongoDB Shell 3、运行MongoDB服务端3.1、关于ulimit3.2、目录设置3.3、创建mongod.conf3.4、运行MongoDB3.5、检查MongoDB是否已运行 4、使用MongoDB4.1、操…

算不上最全,但都是必备——Spring这些不会不行啊

Spring 篇 Spring框架中的单例bean是线程安全的吗? 不是线程安全的 Spring bean并没有可变的状态(比如Service类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的。 Spring框架中有一个Scope注解,默认的值就是singleton&#xff0…

Java基础(第七期):Java面向对象和类 类的封装 Java构造器 JavaBean标准

Java基础专栏 Java基础(第七期) 面相对象 面向对象(Object-oriented)是一种编程思想和方法,它将程序的设计和组织建立在对象的概念上。在Java中,每个对象都是类的一个实例,而类定义了相同类型对…

博流BL602芯片 - 烧录配置

硬件介绍 淘宝上买的核心板,大概结构如上。 直接插入电脑usb,即可实现供电、下载(控制BOOT/EN)、串口通讯 固件包 1、环境配置 1.1串口 开发板使用了 CH340G 的 USB 转串口芯片,自行安装CH340串口驱动。 1.2编译环境…

mysql之搭建MMM架构实现高可用

实验目的 解决mysql的主从服务器单点故障问题,实现高可用 实验思路 实验条件: 主机名 作用 IP地址 组件 mysql1 master01 20.0.0.13 mysql服务、mysql-mmm mysql2 masert02 20.0.0.23 mysql服务、mysql-mmm mysql3 slave01 20.0.0.33 …

WorkPlus AI助理知识问答机器人,助力企业级私有化AI构建

ChatGPT以及其他大语言模型展现了令人惊叹的广博知识、语义理解能力与创造能力。它们能够在会话中承认自身错误并进行改正,还能进行一定程度的逻辑推理,具备多语种翻译与多语言编程等"超能力",可胜任多种自然语言处理任务。 然而&…

小黑完成了最后一节健身课,顺利完成了跳绳比赛,乘飞机到达南京准备第二天领物资和南京城内闲逛的leetcode之旅:215. 数组中的第K个最大元素

小黑代码 class Solution:def findKthLargest(self, nums: List[int], k: int) -> int:# 数组长度n len(nums)nums list(map(lambda x:-x, nums))q []for i in range(n):heapq.heappush(q, nums[i])# 出堆target -1for i in range(k):target heapq.heappop(q)return -…

【Python+selenium】自动化生成测试报告

批量执行完用例后,生成的测试报告是文本形式的,不够直观,为了更好的展示测试报告,最好是生成HTML格式的。 unittest里面是不能生成html格式报告的,需要导入一个第三方的模块:HTMLTestRunner 一、入HTMLTe…

jQuery 【关于jQuery 、 jQuery简介、基础选择器、属性选择器、jQuery扩展】(一)-全面详解(学习总结---从入门到深化)

目录 关于jQuery jQuery简介 选择器之基础选择器(一) 选择器之基础选择器(二) 选择器之属性选择器(一) 选择器之属性选择器(二) 选择器之jQuery扩展(一) 选择器之jQuery扩展(二) 关于jQuery 现在是否还需要学习jQuery,毫无疑问到目前为止,我们仍然…

CentOS to KeyarchOS 系统迁移体验

1. KOS(KeyarchOS)——云峦操作系统简介 KeyarchOS 即云峦操作系统(简称 KOS)是浪潮信息基于 Linux 内核、龙蜥等开源技术自主研发的一款服务器操作系统,支持x86、ARM 等主流架构处理器,广泛兼容传统 CentOS 生态产品和创新技术产品,可为用户…

【Docker】实现JMeter分布式压测

一个JMeter实例可能无法产生足够的负载来对你的应用程序进行压力测试。如本网站所示,一个JMeter实例将能够控制许多其他的远程JMeter实例,并对你的应用程序产生更大的负载。JMeter使用Java RMI[远程方法调用]来与分布式网络中的对象进行交互。JMeter主站…

python socket编程2 - socket创建发送方所需参数的获得

使用socket进行进程间通信或者跨网络的计算机间通讯,有点类似日常生活中的发送快递。 根据发送方的需要,选择不同的物流公司: 在选择适合的公司和运输方式后,需要在app上做出选择,并根据要求填写一些信息。app会根据…

tsmc12 nm boundary cell注意事项

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 往期文章导读: boundary cell添加失败问题整理 注意N/P的区别 针对上下两边的boundary cell,有N/P类型的区别,看版图衬底形状上下是不对称的,而且P

Mac M3 芯片安装 Nginx

Mac M3 芯片安装 Nginx 一、使用 brew 安装 未安装 brew 的可以参考 【Mac 安装 Homebrew】 或者 【Mac M2/M3 芯片环境配置以及常用软件安装-前端】 二、查看 nginx 信息 通过命令行查看 brew info nginx可以看到 nginx 还未在本地安装,显示 Not installed …