WAL机制
持久性指事务提交后对系统的影响必须是永久的,即使系统意外宕机,也必须确保事务修改的数据已真正永久写入到永久存储中。
最简单的实现方法,是在事务提交后立即将修改的数据写到磁盘。但磁盘和内存之间的IO操作是最影响数据库性能的。
WAL(Write Ahead Logging),预写日志,即在数据修改后写到磁盘前,先把日志写到磁盘。确保重做日志时可以恢复事务的一致性状态,而不会有部分执行的事务状态。
WAL机制的引入,即保证了事务持久性和数据完整性,又尽量地避免了频繁IO对性能的影响。
使用WAL可以显著地减少写磁盘的次数,因为只需要把日志文件刷新到磁盘就可以保证事务被提交,而不需要把事务修改的数据立即写入磁盘。
日志文件是连续写的,所以同步log的花销远小于刷新数据页的花销。
当服务器在处理大量并行小事务时,log文件一次fsync就可以提交多个事务。
postgresql数据库可以通过调整WAL参数控制日志写入磁盘的先后顺序。先将日志写入磁盘能够完全保证数据的完整性,在崩溃时可以恢复最近的事务;后写入磁盘,很难保证在崩溃时事务能够得到恢复,数据的结果也很难保证是真实正确的。
因为WAL可以在宕机后恢复数据库文件内容,JFS(journaled file systems)对于数据文件或WAL文件的可靠存储就不是必要的了。JFS甚至会影响系统性能,尤其当它要把文件系统数据刷新到磁盘时。
WAL日志文件
http://www.postgres.cn/news/viewone/1/96
WAL日志文件在pg_wal(PG10,默认为/var/lib/pgsql/10/data/pg_wal/)目录下,一般情况下,每个文件为16M大小。
文件名称为16进制的24个字符组成,每8个字符一组,格式timeline+logId+logSeg,每组的意义如下:
00000001 00000000 000000BC
-------- -------- --------
时间线 LogId LogSeg
时间线:英文为timeline,是以1开始的递增数字,如1,2,3...
LogId:32bit长的一个数字,是以0开始递增的数字,如0,1,2,3...
LogSeg:32bit长的一个数字,是以0开始递增的数字,如0,1,2,3...
PostgreSQL中会用两个十六进制的数字中间用斜杠“/”分隔表示WAL日志位置,即表示LSN(WAL日志的位置,即Log Sequence Number)
WAL写放大
PostgreSQL在写入频繁的场景中,可能会产生大量的WAL日志,而且WAL日志量远远超过实际更新的数据量,这种现象叫做“WAL写放大”。
造成WAL写放大的主要原因有2点。
在checkpoint之后第一次修改页面,需要在WAL中输出整个page,即全页写(full page writes)。全页写的目的是防止在意外宕机时出现的数据块部分写导致数据库无法恢复。
更新记录时如果新记录位置(ctid)发生变更,索引记录也要相应变更,这个变更也要记入WAL。更严重的是索引记录的变更又有可能导致索引页的全页写,进一步加剧了WAL写放大。
过量的WAL输出会对系统资源造成很大的消耗,因此需要进行适当的优化。
磁盘IO:WAL写入是顺序写,通常情况下硬盘对付WAL的顺序写入是绰绰有余的。所以一般可以忽略。
网络IO:对局域网内的复制估计还不算问题,远程复制就难说了。
磁盘空间:如果做WAL归档,需要的磁盘空间也是巨大的。
WAL记录的构成
主要占空间是"block data"。一条WAL记录可能不涉及数据块,也可能涉及多个数据块。
"block data"的内容可能是下面几种情况之一
full page image
如果是checkpoint之后第一次修改页面,则输出整个page的内容(即full page image,简称FPI)。但是page中没有数据的hole部分会被排除,如果设置了wal_compression = on还会对这page上的数据进行压缩。
buffer data
不需要输出FPI时,就只输出page中指定的数据。
full page image + buffer data
逻辑复制时,即使输出了FPI,也要输出指定的数据
WAL日志解析
查看日志命令
/usr/pgsql-10/bin/pg_waldump /var/lib/pgsql/10/data/pg_wal/00000001000000280000005F -b
......
rmgr: Heap len (rec/tot): 68/ 68, tx: 103824377, lsn: 28/5F4CBB38, prev 28/5F4CBAF0, desc: HOT_UPDATE off 24 xmax 103824377 ; new off 43 xmax 0
blkref #0: rel 1663/26173/27777 fork main blk 968682
......
解释如下:
rmgr: Heap
PostgreSQL内部将WAL日志归类到20多种不同的资源管理器。这条WAL记录所属资源管理器为Heap,即堆表。除了Heap还有Btree,Transaction等。
len (rec/tot): 68/ 68
WAL记录的总长度是68字节,其中main data部分是68字节(只计数main data可能并不合理,本文的后面会有说明)。
tx: 103824377,事务号
lsn: 28/5F4CBB38,本WAL记录的LSN
prev 28/5F4CBAF0,上条WAL记录的LSN
desc: HOT_UPDATE off 24 xmax 103824377 ; new off 43 xmax 0
这是一条UPDATE类型的记录(每个资源管理器最多包含16种不同的WAL记录类型),旧tuple在page中的位置为24(即ctid的后半部分),新tuple在page中的位置为43。
blkref #0: rel 1663/26173/27777 fork main blk 968682
引用的第一个page(新tuple所在page)所属的堆表文件为1663/26173/27777,968682(即ctid的前半部分)。通过oid2name可以查到是哪个堆表(需要按照postgresql10-contrib postgresql10-docs)。
-bash-4.1$ /usr/pgsql-10/bin/oid2name -f 968682
From database "postgres":
Filenode Table Name
----------------------------
968682 pgbench_accounts
分享到:
相关推荐
Postgres运算子 Postgres Operator在由支持的Kubernetes(K8s)上提供了易于运行的高可用性集群。 仅通过Postgres清单(CRD)对其进行配置,以简化与自动CI / CD管道的集成,而无需直接访问...S3 WAL存档中的备用群集
WAL-G是Postgres(MySQL,MariaDB和MongoDB的beta版)的档案恢复工具 WAL-G是WAL-E的继任者,但有许多关键区别。 WAL-G对Postgres使用LZ4,LZMA或Brotli压缩,多个处理器和非排他的基本备份。 有关WAL-G设计和实现...
Postgres WAL-E 副本 这个 docker 镜像结合了 WAL-E 和 Postgres 9.3 来创建一个能够从 WAL-E 备份中恢复的 Docker 镜像。 这可以用于几件事: 开发人员可以使用它从备份创建本地副本 它可用于测试备份的完整性 它...
**wal-e:Postgres的连续归档** 在PostgreSQL数据库管理中,数据安全性和高可用性是至关重要的。为了确保数据的完整性,Postgres提供了一种称为“Write-Ahead Log”(WAL)的日志记录机制,它允许在发生故障时进行...
用于安装 wal-e 的厨师食谱(postgres 连续归档到 s3) 这个秘籍自动化了这篇优秀文章中的许多步骤: : 查看示例用法: 要求 本说明书仅在 ubuntu 服务器上开发和测试 包裹 postgresql - 可选择使用包含 ...
WAL-E Postgres 的连续归档 WAL-E 是一个程序,旨在执行 PostgreSQL WAL 文件和基本备份的连续归档。 要就使用 WAL-E 进行通信或合作开发,请不要犹豫,将邮件发送到 wal-e@googlegroups.com(存档和订阅设置)的...
Postgres-密件抄送 使用获取有关PostgreSQL低级信息的脚本集。 到目前为止,该项目是试验性的,因此请谨慎使用。 经过相对较旧Linux内核版本(4.14、4.15)和最新的PostgreSQL 11、12devel测试。 大多数脚本都已与...
WAL-G WAL-G是Postgres(MySQL,MongoDB和Redis的beta)的档案恢复工具WAL-G是WAL-E的后继产品,但有许多关键区别。 WAL-G使用LZ4,LZMA或Brotli压缩,多个处理器,WAL-G WAL-G是Postgres(MySQL,MariaDB,MongoDB...
为什么要使用逻辑复制逻辑复制是从Postgres数据库流式传输WAL日志的一种选择。 它允许以可以在其他应用程序中解析和使用的格式输出数据。 例如, 此设置中的lambda将输出如下的json文件: { " changes " : [ { " ...
而 `wal2json` 是一个专门针对 PostgreSQL WAL 日志的解析工具,它将复杂的二进制 WAL 记录转换为易于理解和处理的 JSON 格式。 `wal2json` 的核心功能在于其能够将 PostgreSQL 的原始 WAL 信息转换为结构化的 JSON...
WAL-E角色使用envdir安装并配置WAL-E以存储配置。 设置一个crontab条目以执行基本备份。要求您仍然需要手动/单独配置Postgres以存档WAL文件。 默认情况下使用用户postgres ,该用户应先前创建,即在此角色之前运行...
### Postgres 主从配置详解 #### 一、概述 PostgreSQL 是一款强大的开源关系型数据库管理系统,被广泛应用于各类业务场景之中。为了提高系统的可用性和数据的安全性,通常会搭建主从架构,即一个主数据库负责写...
这些选项以前只在Postgres Pro Enterprise中可用。 与普通PostgreSQL相比,优化了每个数组元素在选择性估计期间的内存消耗。 修复了在运行pg_pathman时执行查询或使用规划器时可能出现的分段错误。pg_pathman没有...
PostgreSQL,通常简称Postgres,是一种功能强大的开源关系型数据库管理系统。在本文中,我们将深入探讨如何在CentOS 7系统上配置Postgres的主从复制,实现读写分离,以提高数据库系统的可用性和性能。 首先,我们来...
postgresql数据库日志解析插件
逻辑复制的工作原理是,master 节点将其更改记录写入到 WAL(Write-Ahead Log)日志中,然后发送到 slave 节点,slave 节点将其应用于本地数据库中。 2. 分区语法(Partitioning Syntax) Postgres 10 引入了分区...
`wal2json`扩展可方便地将WAL日志转换为JSON格式,用于云存储和远程复制。 八、扩展与功能 Postgres允许开发和使用自定义函数、类型和操作符。例如,`hstore`扩展提供键值对存储,`pg_stat_statements`监控查询性能...
1. WAL 日志优化:WAL(Write Ahead Log)日志是Postgres数据库的关键组件,用于确保数据库的事务完整性。使用PM可以将WAL日志写入到持久内存中,从而提高数据库的写入性能。 2. 表空间优化:Postgres数据库的表...
wal2json是一款针对PostgreSQL数据库的插件,其主要功能是将数据库的写前日志(Write-Ahead Log,简称WAL)转换为JSON格式的数据流,以便于进行数据复制和实时同步。这款插件在分布式数据库系统、数据仓库、实时分析...
该微服务在Realm云和Hasura上的Postgres之间(通过HasuraDB)同步数据。 先决条件 领域云实例或自托管领域。 您可以找到设置说明 在Hasura集群上运行的hasura项目。 您可以按照说明在进行设置 设置 在Postgres上启用...