当前位置: 首页 > news >正文

WAL 模式(PostgreSQL 14 Internals翻译版)

性能

当服务器正常运行时,WAL文件不断被写入磁盘。但是,这些写操作是顺序的:几乎没有随机访问,因此即使是HDD也可以处理这个任务。由于这种类型的加载与典型的数据文件访问非常不同,因此有必要为WAL文件设置一个单独的物理存储,并用一个指向已挂载文件系统中的目录的符号链接替换PGDATA/pg_wal编录。

有几种情况下,必须同时写入和读取WAL文件。第一个是明显的崩溃恢复案例;第二个是流复制。walsender进程直接从文件中读取WAL条目。因此,如果副本没有接收到WAL条目,而所需的页面仍在主服务器的操作系统缓冲区中,则必须从磁盘读取数据。但是访问仍然是顺序的,而不是随机的。

WAL条目可以用以下一种方式写入:

  • 同步模式禁止任何进一步的操作,直到事务提交将所有相关的WAL条目保存到磁盘。
  • 异步模式意味着即时事务提交,稍后在后台将WAL条目写入磁盘。

当前模式由synchronous_commit参数定义。

同步模式。 为了可靠地注册提交的事实,仅仅将WAL条目传递给操作系统是不够的;您必须确保磁盘同步已成功完成。由于同步意味着实际的I/O操作(相当慢),因此尽可能少地执行它是有益的。

为此,完成事务并将WAL条目写入磁盘的后端可以执行一个由commit_delay参数定义的小暂停。但是,只有当系统中至少有5个commit_sibling活动事务时才会发生这种情况:在此暂停期间,其中一些事务可能会完成,服务器将设法一次性同步所有WAL条目。这很像扶着电梯门让别人冲进来。

缺省情况下,没有暂停。只有对执行大量短OLTP事务的系统修改commit_delay参数才有意义。

在可能的暂停之后,完成事务的进程将所有累积的WAL条目刷新到磁盘并执行同步(保存提交条目和与此事务相关的所有先前条目非常重要;其余部分之所以被编写,只是因为它不会增加成本)。

从这个时候开始,ACID的持久性需求得到了保证——事务被认为是可靠地提交了。这就是为什么同步模式是默认的。

同步通信的缺点是较长的延迟(COMMIT命令在同步结束之前不会返回控制)和较低的系统吞吐量,特别是对于OLTP负载。

异步模式。 要启用异步提交,必须关闭synchronous_commit参数。在异步模式下,walwriter进程将WAL条目写入磁盘,该进程在工作和睡眠之间交替进行。暂停的持续时间由wal_writer_delay值定义。

从暂停中唤醒,进程检查缓存中是否有新的完全填满的WAL页面。如果出现任何这样的页面,进程将它们写到磁盘,跳过当前页面。否则,它将写入当前的半空页面,因为它已经唤醒了。

该算法的目的是避免多次刷新同一个页面,这为具有大量数据更改的工作负载带来了明显的性能提升。

虽然WAL缓存被用作环形缓冲区,但是walwriter在到达缓存的最后一页时停止;暂停后,下一个写作周期从第一页开始。因此,在最坏的情况下,walwriter需要运行三次才能到达特定的WAL条目:首先,它将写入位于缓存末尾的所有完整页面,然后它将返回到开头,最后,它将处理包含条目的未填充页面。但在大多数情况下,这需要一到两个周期。

每次写入wal_writer_flush_after数据量时执行同步,并在写入周期结束时再次执行同步。

异步提交比同步提交快,因为它们不需要等待物理写入磁盘。但是可靠性会受到影响:您可能会丢失在故障之前3×wal_writer_delay时间范围内提交的数据(默认情况下为0.6秒)。

在现实世界中,这两种模式相辅相成。在同步模式下,与长事务相关的WAL条目仍然可以异步写入空闲的WAL缓冲区。反之亦然,即使在异步模式下,与即将从缓冲区缓存中驱逐的页面相关的WAL条目也会立即刷新到磁盘中,否则无法继续操作。

在大多数情况下,系统设计师必须在性能和耐用性之间做出艰难的选择。

还可以为特定事务设置synchronous_commit参数。如果可以在应用程序级别将所有事务分类为绝对关键(例如处理财务数据)或不太重要,则可以提高性能,同时承担只丢失非关键事务的风险。

为了了解异步提交的潜在性能增益,让我们使用pgbench测试比较两种模式下的延迟和吞吐量。

首先,初始化所需的表:

在这里插入图片描述
以同步模式启动一个30秒的测试:

在这里插入图片描述
现在在异步模式下运行相同的测试:

在这里插入图片描述

在异步模式下,这个简单的基准测试显示出更低的延迟和更高的吞吐量(TPS)。当然,每个特定系统都有自己的数据,具体取决于当前负载,但很明显,对短OLTP事务的影响是非常明显的。

让我们恢复默认设置:

在这里插入图片描述

相关文章:

WAL 模式(PostgreSQL 14 Internals翻译版)

性能 当服务器正常运行时,WAL文件不断被写入磁盘。但是,这些写操作是顺序的:几乎没有随机访问,因此即使是HDD也可以处理这个任务。由于这种类型的加载与典型的数据文件访问非常不同,因此有必要为WAL文件设置一个单独的物理存储&a…...

2023年信息科学与工程学院学生科协第二次软件培训

2023年信息科学与工程学院学生科协第二次软件培训 文章目录 2023年信息科学与工程学院学生科协第二次软件培训一维数组数组的概念定义格式一维数组的访问例题:练习题: 数组元素数量一维数组的初始化 二维数组定义格式二维数组的访问二维数组的存储结构二…...

渗透测试tomcat错误信息泄露解决办法

解决方法&#xff1a; 1、使用tomcat8.5.16&#xff0c;会重定向非法url到登录url 2、配置server.xml&#xff0c;加上 <Valve className"org.apache.catalina.valves.ErrorReportValve" showReport"false" showServerInfo"false" />配置…...

notes_NLP

RNN > LSTM, GRU model特点RNNLSTMinputforgetputput&#xff1b;GRUresetupdate&#xff1b;参数比LSTM少&#xff0c;计算效率更高&#xff1b; 循环神经网络&#xff08;RNN/LSTM/GRU&#xff09; 人人都能看懂的GRU transformer > self-attention 根据Query和Key计…...

内存分段、分页

大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识&#xff0c;还有日常折腾的经验&#xff0c;欢迎大家访问。 前言 每个进程都有一套自己的虚拟地址&#xff0c;尽管进程可能有相同的虚拟地址&#xff0c;…...

Python-pptx教程之一从零开始生成PPT文件

简介 python-pptx是一个用于创建、读取和更新PowerPoint&#xff08;.pptx&#xff09;文件的python库。 典型的用途是根据动态内容&#xff08;如数据库查询、分析数据等&#xff09;&#xff0c;将这些内容自动化生成PowerPoint演示文稿&#xff0c;将数据可视化&#xff0c…...

k8s 使用ingress-nginx访问集群内部应用

k8s搭建和部署应用完成后&#xff0c;可以通过NodePort&#xff0c;Loadbalancer&#xff0c;Ingress方式将应用端口暴露到集群外部&#xff0c;提供外部访问。 缺点&#xff1a; NodePort占用端口&#xff0c;大量暴露端口非常不安全&#xff0c;并且有端口数量限制【不推荐】…...

企业数据泄露怎么办?

随着数字化时代的到来&#xff0c;威胁企业数据安全的因素越来越多。一旦机密数据泄露&#xff0c;不仅会对企业造成巨大的经济损失&#xff0c;还会对企业的声誉和客户信任度造成严重影响。发生数据泄露情况时&#xff0c;企业该怎样应对&#xff1f; 1.确认数据泄露 确认是…...

GoLong的学习之路(一)语法之变量与常量

目录 GoLang变量批量声明变量的初始化类型推导短变量声明匿名变量 常量iota&#xff08;特殊&#xff09;&#xff08;需要重点记忆&#xff09; GoLang go的诞生为了解决在21世纪多核和网络化环境越来越复杂的变成问题而发明的Go语言。 go语言是从Ken Thomepson发明的B语言和…...

Go-Python-Java-C-LeetCode高分解法-第十一周合集

前言 本题解Go语言部分基于 LeetCode-Go 其他部分基于本人实践学习 个人题解GitHub连接&#xff1a;LeetCode-Go-Python-Java-C 欢迎订阅CSDN专栏&#xff0c;每日一题&#xff0c;和博主一起进步 LeetCode专栏 我搜集到了50道精选题&#xff0c;适合速成概览大部分常用算法 突…...

封装axios的两种方式

作为前端工程师&#xff0c;经常需要对axios进行封装以满足复用的目的。在不同的前端项目中使用相同的axios封装有利于保持一致性&#xff0c;有利于数据之间的传递和处理。本文提供两种对axios进行封装的思路。 1. 将请求方式作为调用参数传递进来 首先导入了axios, AxiosIn…...

【自然语言处理】NLTK库的概念和作用

文章目录 一、NLTK库介绍二、NLTK库的使用2.1 初级使用2.2 中级使用 参考资料 一、NLTK库介绍 Natural Language Toolkit (NLTK)是一个广泛使用的Python自然语言处理工具库&#xff0c;由Steven Bird、Edward Loper和Ewan Klein于2001年发起开发。NLTK的目的是为自然语言处理&…...

Python爬虫如何解决提交参数js加密

注意&#xff01;&#xff01;&#xff01;&#xff01; 仅做知识储备莫拿去违法乱纪&#xff0c;有问题指出来&#xff0c;纯做笔记记录 由于&#xffe5;%…………&&%#%** 所以&#xff01;#&#xffe5;……&*……* 啥也不说直接上代码 import execjs js_ji…...

云数据库及RDS数据库介绍

1.云数据库概念 云数据库是指被优化或部署到一个虚拟计算环境中的数据库&#xff0c;具有按需付费、按需扩展、高可用性以及存储整合等能力。 2.云数据库特性 云数据库的特性有&#xff1a;实例创建快速、支持只读实例、读写分离、故障自动切换、数据备份、Binlog备份、SQL审…...

c语言进阶部分详解(详细解析自定义类型——枚举,联合(共用体))

上篇文章介绍了结构体相关的内容&#xff0c;大家可以点击链接进行浏览&#xff1a;c语言进阶部分详解&#xff08;详细解析自定义类型——结构体&#xff0c;内存对齐&#xff0c;位段&#xff09;-CSDN博客 各种源码大家可以去我的gitee主页进行查找&#xff1a;唔姆 (Nerow…...

使用 Requests 库和 PHP 的下载

以下是一个使用 Requests 库和 PHP 的下载器程序&#xff0c;用于从 www.people.com.cn 下载音频。此程序使用了 https://www.duoip.cn/get_proxy 这段代码。 import requests from bs4 import BeautifulSoup import pafy import timedef get_proxy():url "https://www.…...

ConcurrentHashMap底层具体实现知道吗?实现原理是什么

从这三个方面来回答&#xff1a; ConcurrentHashMap 的整体架构 ConcurrentHashMap 的基本功能 ConcurrentHashMap 在性能方面的优化 ConcurrentHashMap 的整体架构 这个是 ConcurrentHashMap 在 JDK1.8 中的存储结构&#xff0c;它是由数组、单向链表、红黑树组成. 当我们初始…...

Go语言“Go语言:掌握未来编程的利器“

Go语音的发展史可以追溯到2009年&#xff0c;当时谷歌公司推出了一款名为“Google Assistant”的智能助手&#xff0c;它使用自然语言处理技术来与用户进行交互。随后&#xff0c;Go语音逐渐发展成为一种广泛使用的语音技术&#xff0c;其发展历程如下&#xff1a; 起步阶段&a…...

达梦管理工具报错“结果集不可更新,请确认查询列是否出自同一张表,并且包含值唯一的列。”

在使用达梦数据库管理工具时&#xff0c;我们测试过程中时常需要更新表数据&#xff0c;有时为了便捷&#xff0c;会直接使用管理工具修改表数据的值&#xff0c;但偶尔会遇到“结果集不可更新&#xff0c;请确认查询列是否出自同一张表&#xff0c;并且包含值唯一的列。”的报…...

TensorFlow2从磁盘读取图片数据集的示例(tf.keras.utils.image_dataset_from_directory)

import os import warnings warnings.filterwarnings("ignore") import tensorflow as tf from tensorflow.keras.optimizers import Adam from tensorflow.keras.applications.resnet import ResNet50#数据所在文件夹 base_dir ./data/cats_and_dogs train_dir os…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...