天天看點

配置記憶體中OLTP檔案組提高性能

在今天的文章裡,我想談下使用記憶體中OLTP的記憶體優化檔案組來獲得持久性,還有如何配置它來獲得高性能。在進入正題前,我想簡單介紹下使用你資料庫裡這個特定檔案組,記憶體OLTP是如何獲得持久性的。

記憶體中OLTP的持久性

早些天對記憶體中OLTP(代号Hekaton)的一個大誤解是,人們認為記憶體中OLTP是不具有ACID屬性的——隻有ACI屬性,沒有D屬性(Durability)。但這不是真的,因為在記憶體中OLTP裡,每個在記憶體中的操作都是完全日志的。如果你的資料庫崩潰,記憶體中OLTP可以将你的資料庫和記憶體優化表在崩潰發生前恢複常态。記憶體中OLTP記錄每個操作到傳統SQL Server的事務日志。因為在非持久性記憶體裡發生的一切都是基于MVCC原則,記憶體中OLTP隻記錄重做(redo)日志記錄,任何時間都沒有撤銷(undo)日志,因為用記憶體中OLTP在故障恢複期間從不會有撤銷操作發生。對進行中的事務進行復原操作,隻有前版本才是可以的。

當事務的送出時,重做(redo)日志才會寫入。另外所謂的離線檢查點工作者(Offline Checkpoint Worker)将成功送出的事務從事務填入一對所謂的資料和Delta檔案(Data and Delta Files),來自記憶體中OLTP的資料和Delta檔案會加速故障恢複。故障恢複重建你的記憶體優化表初始于資料和Delta檔案對,然後自上個檢查發生的所有改變從事務日志裡應用。我們來看下這個概念。

配置記憶體中OLTP檔案組提高性能

因為在記憶體OLTP裡一切都是和高性能有關,資料和Delta檔案SQL Server隻用順序讀寫(sequential I/O)。不會涉及到随機讀寫(random I/O),因為這會殺死性能。現在的問題是,什麼資訊會寫入資料和Delta檔案對?記憶體中OLTP資料檔案包含插入到記憶體優化表的記錄。因為插入隻發生在檔案末尾,順序讀寫很容易實作。當你在記憶體優化表删除指定記錄時,記錄隻在對應的Delta檔案邏輯上标記為删除。這個資訊也是加在Delta檔案末尾,這樣又是真正的在存儲裡順序讀寫。UPDATE語句隻是新記錄和老記錄副本INSERT語句和DELETE語句的組合。很簡單,是不是?下圖展示了這個重要概念。

配置記憶體中OLTP檔案組提高性能

如果你想進一步了解記憶體中OLTP如何實作持久性的,我強烈推薦Tony Rogerson寫的文章How Hekaton (XTP) achieves Durability for “Memory Optimised” Tables。

配置記憶體中OLTP檔案組

記憶體優化表的故障恢複以你資料和Delta檔案對存儲的速度進行。是以當你建立資料庫,當考慮并決定配置存儲檔案對的記憶體中OLTL檔案組,仔細對待就非常重要。首先你要包含記憶體優化資料的存儲增加檔案組,如下代碼所示: 

-- Add a new memory optimized file group
ALTER DATABASE InMemoryOLTP
ADD FILEGROUP InMemoryOLTPFileGroup CONTAINS MEMORY_OPTIMIZED_DATA
GO      

在記憶體優化檔案組建立後(在傳統FILESTREAM檔案組覆寫下),你可以添加存儲容器(storage container)到檔案組。這裡你可以使用ADD FILE指令,如下代碼所示:

1 -- Add a new storage container
2 ALTER DATABASE InMemoryOLTP ADD FILE
3 (
4     NAME = N'InMemoryOLTPContainer', 
5     FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL12.SQL2014\MSSQL\DATA\InMemoryOLTPContainer'
6 )
7 TO FILEGROUP [InMemoryOLTPFileGroup]
8 GO      

估計你現在網上看到的所有文章裡都隻介紹增加1個存儲容器——這會大大傷及你的性能!原因很簡單:

  • 資料和Delta檔案對存儲在同個實體硬碟
  • 寫資料和Delta檔案對在同個實體硬碟導緻随機讀寫(random I/O)
  • 故障恢複隻能和一個實體硬碟那麼塊,那裡存儲這資料和Delta檔案 

為了克服這些限制,你可以添加多個屬于記憶體優化檔案的存儲容器在不同的“實體”硬碟上。這樣的話,資料和Delta檔案在多個存儲容器間會以循環(round-robin)樣式配置設定。假設配置2個存儲容器會發生什麼:

  • 第1個資料檔案存入第1個存儲容器
  • 第1個Delta檔案存入第2個存儲容器
  • 第2個資料檔案存入第1個存儲容器
  • 第2個Delta檔案存入第2個存儲容器

下圖給你具體示範了這個概念。

配置記憶體中OLTP檔案組提高性能

但是隻使用2個存儲容器并不解決你的磁盤瓶頸問題,因為隻有2個容器,所有的資料檔案存儲在第1個容器,所有的Delta檔案存儲在第2個容器。一般來說,你的資料檔案比你的Delta檔案會多很多,這就是說在不同實體硬碟上的2個存儲容器之間的讀寫很不平衡。存儲你所有資料檔案的第1個存儲容器比存儲你所有Delta檔案的第2個容器需要更多的IOPS。

為了多個實體硬碟之間IOPS平均分布與平衡。對于你的記憶體優化檔案組,微軟推薦至少4個存儲容器。當你有4個存儲容器時,想象下會發生什麼,如下圖所示:

配置記憶體中OLTP檔案組提高性能

如果你使用這個配置,在第1個實體硬碟上你有第1個檔案對(資料和Delta檔案),在第2個實體存儲上你有第2個檔案對(資料和Delta檔案),在第1個實體硬碟上你有第3個檔案對(資料和Delta檔案),以此類推。最後你在多個實體硬碟鍵平均散布了你的讀寫請求,這會加速你的故障恢複程序,因為故障恢複可以在存儲容器裡并行,這會加速你資料庫聯機。

小結

在這個檔案裡你看到對于記憶體中OLTP,存儲速度和吞吐量還是非常重要的。在存儲裡,你的資料必須是實體永駐的,不然當你的SQL Server崩潰或重新開機時,你的資料就會丢失。你記憶體優化檔案組配置會大大影響檔案組給你的吞吐量。如果你在生産環境運作記憶體中OLTP,你應該至少配置4個存儲容器分布在2個實體硬碟。在性能要求更高的場景,你甚至可以增加超過2個實體硬碟的更多存儲容器。正如微軟說的:“記憶體中OLTP的故障恢複是以你存儲速度進行的”。

感謝關注!

參考文章:

https://www.sqlpassion.at/archive/2014/06/16/configuring-the-in-memory-oltp-file-group-for-high-performance/

注:此文章為

WoodyTu

學習MS SQL技術,收集整理相關文檔撰寫,歡迎轉載,請在文章頁面明顯位置給出此文連結!

若您覺得這篇文章還不錯請點選下右下角的推薦,有了您的支援才能激發作者更大的寫作熱情,非常感謝!

繼續閱讀