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

目录
相关文章
|
10月前
|
内存技术
非易失性WAL buffer实现解析(五)
非易失性WAL buffer实现解析(五)
36 0
|
10月前
非易失性WAL buffer实现解析(三)
非易失性WAL buffer实现解析(三)
33 0
|
10月前
|
内存技术
非易失性WAL buffer实现解析(二)
非易失性WAL buffer实现解析(二)
28 0
|
10月前
|
存储 关系型数据库 PostgreSQL
PostgreSQL WAL解析:构建WAL记录准备
PostgreSQL WAL解析:构建WAL记录准备
95 0
|
关系型数据库 PostgreSQL
postgresql 的WAL日志解析工具 pg_waldump
postgresql 的WAL日志解析工具 pg_waldump
1287 0
postgresql 的WAL日志解析工具 pg_waldump
|
设计模式 缓存 Java
NIO中Buffer的重要属性关系解析
NIO中Buffer的重要属性关系解析
159 0
|
5天前
|
XML 人工智能 Java
Spring Bean名称生成规则(含源码解析、自定义Spring Bean名称方式)
Spring Bean名称生成规则(含源码解析、自定义Spring Bean名称方式)
|
14天前
yolo-world 源码解析(六)(2)
yolo-world 源码解析(六)
44 0
|
14天前
yolo-world 源码解析(六)(1)
yolo-world 源码解析(六)
43 0
|
14天前
yolo-world 源码解析(五)(4)
yolo-world 源码解析(五)
47 0

推荐镜像

更多