非易失性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來傳入。

非易失性WAL buffer實現解析(一)


本文主要介紹日誌刷新時的改造。由函數XLogFlush完成,該函數完成的功能是,將指定位置record的lsn前的所有日誌都刷新到磁盤,對應NVM新硬件是將該lsn之前所有的日誌都持久化到NVM上。主要步驟:

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

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日誌發送備機了。

非易失性WAL buffer實現解析(一)



分享到:


相關文章: