PostgreSQL WAL replay 加速(datapage preload) - 恢复加速, 备库延迟优化-阿里云开发者社区

开发者社区> 德哥> 正文

PostgreSQL WAL replay 加速(datapage preload) - 恢复加速, 备库延迟优化

简介:
+关注继续查看

标签

PostgreSQL , replace , standby , recovery , preload , 预加载


背景

PostgreSQL 数据库恢复时,读取wal,如果当前wal page不是full page,则从这笔wal record对应的data file中拿到datapage,与wal record合并,覆盖对应data page。持续读取wal 实现恢复的目的。

需要注意wal是顺序读写,而data file可能是离散读写(大部分oltp业务都是如此),WAL的目的就是要将离散的DATA FILE写变成顺序的IO。

那么问题来了,恢复时,data file就变成了离散的读操作。

在主库WAL产生量非常巨大时,standby recovery(replay)将会导致与主库的延迟,通常wal write不会有大的延迟(因为WAL是顺序写),replay的延迟主要是recovery时data file的离散读导致。

如何降低离散读呢?

DBAs struggling with replication lag is nothing new. A large volume of data or write IO comes into the system and the followers struggle to keep up. pg_prefaulter was written to eliminate replication lag on followers and also improves database startup times.

If your database is under 24/7 write workload, has periodic replication lag that is unacceptable, or want to reduce the startup time of PostgreSQL, pg_prefaulter will help all three of these scenarios.

At Joyent we use PostgreSQL as the metadata tier for our object storage system, Manta. This talk chronicles how we identified our source of replication lag and why we found it necessary to write pgprefaulter. pgprefaulter is a sidecar process for PostgreSQL written in Go that pre-fetches pages from disk and loads them into the operating system's filesystem cache before PostgreSQL requests them during the startup and application of WAL records.

Additionally, this talk also discusses:

the design considerations that went into writing pg_prefaulter
the various forms of "replication lag" in PostgreSQL (WAL receive lag, WAL apply lag, and checkpoint lag)
pathologies that came from deploying pg_prefaulter
why we now consider pg_prefaulter mission critical software for our production databases
tips for deploying pg_prefaulter

优化方法

在备库接收到WAL后,解析WAL,并提前将需要用到的DATA FILE PAGE加载到OS PAGE CACHE中,在postgresql startup process replay wal时,读取需要的data page时,从os cache读取,从而降低replay时因为读取data page带来的IO等待。

patch:

http://www.postgresql-archive.org/WAL-prefetch-td6024900.html

参考

pg_prefaulter: Scaling WAL Performance (application/pdf - 2.6 MB)

http://www.postgresql-archive.org/WAL-prefetch-td6024900.html

http://www.pgcon.org/2018/schedule/events/1204.en.html

https://github.com/joyent/pg_prefaulter

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
使用ehcache缓存页面、ExpiresFilter添加Expires头,大幅提升网站性能
使用ehcache缓存页面、ExpiresFilter添加Expires头,大幅提升网站性能
5 0
一个用于 Angular 开发的 Chrome 扩展 - Angular Dev Tools
一个用于 Angular 开发的 Chrome 扩展 - Angular Dev Tools
4 0
DataTables的服务器端(SpringMVC)分页模式(2)
DataTables的服务器端(SpringMVC)分页模式
4 0
Chrome 开发者工具 Initiator 面板单击后看不到 JavaScript 源代码的解决方法
Chrome 开发者工具 Initiator 面板单击后看不到 JavaScript 源代码的解决方法
4 0
Java 的核心目的和并发编程
Java 的核心目的和并发编程
6 0
Chrome Elements 标签页 和 View Source 的显示为什么有差异
Chrome Elements 标签页 和 View Source 的显示为什么有差异
5 0
重学Java(五):操作符
重学Java(五):操作符
7 0
推荐,Java Emoji Converter(Emoji表情转换工具)
推荐,Java Emoji Converter(Emoji表情转换工具)
4 0
mysql innodb引擎下的行锁由于意外没有被释放,导致后面的请求无法继续,怎么办?
mysql innodb引擎下的行锁由于意外没有被释放,导致后面的请求无法继续,怎么办?
4 0
+关注
德哥
公益是一辈子的事, I'm digoal, just do it.
2153
文章
245
问答
来源圈子
更多
阿里云数据库:帮用户承担一切数据库风险,给您何止是安心!支持关系型数据库:MySQL、SQL Server、PostgreSQL、PPAS(完美兼容Oracle)、自研PB级数据存储的分布式数据库Petadata、自研金融级云数据库OceanBase支持NoSQL数据库:MongoDB、Redis、Memcache更有褚霸、丁奇、德哥、彭立勋、玄惭、叶翔等顶尖数据库专家服务。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载