非易失性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日志发送备机了。

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付 9.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值