专栏首页PostgreSQL研究与原理解析非易失性WAL buffer实现解析(一)

非易失性WAL buffer实现解析(一)

前文简要介绍了非易失性WAL buffer的PostgreSQL email,本文开始主要介绍其实现机制。

non-volatile WAL buffer同样是结合interl开发的pmdk库进行适配NVM。在启动时在函数XLOGShememInit中通过调用MapNonVolatileXLogBuffer在NVM介质上创建WAL BUFFER文件并映射到内存,这个动作由pmdk函数pmem_map_file完成。其中,NvwalPath为文件路径,NvwalSize为WAL buffer大小,这两个函数入参由新增的参数nvwal_path和nvwal_size来传入。

本文主要介绍日志刷新时的改造。由函数XLogFlush完成,该函数完成的功能是,将指定位置record的lsn前的所有日志都刷新到磁盘,对应NVM新硬件是将该lsn之前所有的日志都持久化到NVM上。主要步骤:

1)XLogCtl->persistentUpTo表示已经持久化NVM的lsn位置,record<XLogCtl->persistentUpTo表示要求的位置已经都持久化到NVM了,不需要再进行持久化,直接退出。

2)record-XLogCtl->persistentUpTo > NvwalSize表示需要持久化的WAL充满了整个WAL BUFFER,所以直接调用nv_flush将整个NVM WAL BUFFER刷到NVM,整个动作最终由pmdk函数pmem_flush完成,表示将CPU CACHE的刷到NVM。

3)record-XLogCtl->persistentUpTo < NvwalSize则需要分情况。因为NVM WAL buffer大小固定,而WAL日志是不断增长的,所以NVM WAL BUFFER循环使用。那么将分为两种情况:uptopos > frompos和uptopos < frompos。如下图所示,分别将红色区间部分通过nv_flush即pmem_flush函数刷到NVM。然后,由于CPU CACHE刷的无序性,需要调用nv_drain即pmdk函数pmem_drain确保CPU CACHE所有的东西都刷到NVM,本质上是个内存屏障。

4)最后需要通知WAL sender进程有新WAL日志了,可以将这些WAL日志发送备机了。

本文分享自微信公众号 - yanzongshuaiDBA(gh_c4ea334d373f),作者:yzshover

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 非易失性WAL buffer实现解析(二)

    1、XLogInsert函数改造:将日志写入NVM,此时不确定CPU CACHE何时刷以及顺序

    yzsDBA
  • postgresql email列表对NVM WAL BUFFER的讨论

    本文介绍NVM WAL BUFFER的email list,详细了解开发者对此的讨论,以此深入

    yzsDBA
  • 非易失性WAL buffer

    今天看到PG邮件列表里有非易失性内存在PG应用的讨论,做下记录,接着学习其补丁,如何将WAL buffer改造成非易失性buffer,以及和之前有和区别。该补丁...

    yzsDBA
  • 微信小程序的生命周期学习笔记-应用篇

    在我们学习微信小程序的过程当中,我们会参考很多资料。在这些资料中,我们经常能够看到“生命周期”四个字,在前面的课程中也提到过。在这里做一个说明。

    面向对象思考
  • 微信小程序云开发

    微信小程序有一个云开发的功能,可以省去很多的后台开发的任务。不过,使用小程序云开发需要注册的小程序appid,测试和游客没有云开发功能的。如果你还没有注册小程序...

    xiangzhihong
  • 微信小程序云开发

    微信小程序有一个云开发的功能,可以省去很多的后台开发的任务。不过,使用小程序云开发需要注册的小程序appid,测试和游客没有云开发功能的。如果你还没有注册小程序...

    xiangzhihong
  • Linux搭建Postfix邮件服务器

    CentOs7默认有postfix服务,如果没有,通过 yum install postfix -y 安装即可

    对弈
  • [PHP] PHP 7.4.5的错误修复

    PHP 7.4.5的错误修复 修复了错误#79364(复制空数组时,未指定下一个键)。 修复了错误#78210(无效的指针地址)。 curl: 修复了错误#79...

    陶士涵
  • 专访 MSRA 副院长周明:中国 NLP 如何跻身世界顶尖水平?

    AI 科技评论按:近期中国计算机学会(CCF)举办的第六届自然语言处理及中文计算大会(NLPCC 2017)在大连成功举办。作为国内 NLP 领域首个面向国际的...

    AI科技评论
  • 重学Javascript之类型转换

    这是因为,浏览器会把第一个{} 作为一个空的代码块解析,因此上面的两个分别就等价于: + {} ,  + [] 因此,得到上面相应的结果。

    行百里者半九十

扫码关注云+社区

领取腾讯云代金券