背景:Redis作為一款簡潔、高效的開源K/V資料庫,可以被用於記憶體快取、持久化儲存等不同場景,大量服務於各類網際網路應用。同時也提供了豐富的功能配置,客戶可以根據各自業務需求,在讀寫效能、快取容量、資料可靠性等方面作出靈活的選擇。
Redis提供了RDB和AOF兩種持久化方式供選擇,4.0中更是引入了RDB-AOF混合持久化的方式,整合RDB和AOF的優勢,提供更實時的資料持久化保證、更快的恢復速度和更緊湊的空間使用。針對AOF的寫入,Redis提供了兩種選項供選擇:
- Always:Aoflog實時寫入落盤,保證寫入資料的安全性,但寫入效能下降嚴重。
- Everysec:Buffer寫入Aoflog,後臺定期刷盤,可以很好的保證寫入效能,但在failure場景下,需要承擔秒級新寫入資料丟失的風險。
這兩種樣式需要使用者在效能和資料安全性之間做出取捨,魚和熊掌無法兼得。對一些對資料安全性有更高要求的場景,需要應用層協同來保證資料安全,會給系統設計和實現帶來一定的複雜度。另一方面,在Redis發生failover的時候,會有一個快取預熱重建的過程,期間對應用會有一個可感知的不可服務時間、以及訪問延時抖動。
關於上述問題,很重要的一個原因在於目前DRAM和SSD(請忽略HDD)之間巨大的效能鴻溝。近幾年,備受學術界和工業界關註的NVM(Non-volatile Memory) 技術,給這類問題的解決帶來了新的機遇。
圖1:NVM產品的儲存層次結構
目前已有的NVM產品,對上層應用提供DIMM形態的訪問介面。作為一種NVM裝置,相比於DRAM具備掉電不丟資料的特性,容量上也會比DRAM高出一個數量級,成本優勢明顯。相比於傳統SSD,不但讀寫速度更快(百ns量級),而且具備位元組定址的能力。同時也要看到,NVM產品仍然存在讀寫不對稱、順序和隨機訪問不對稱等特徵。
從應用場景上來看,NVM產品可以定位於替代部分DRAM功能,支撐持久Memory或In-Memory應用。具體來說可被應用在如下場景:
- 持久化記憶體:作為資料持久層,對資料一致性要求很高的持久化系統,同時兼顧資料可靠性和資料讀寫效能。
- 記憶體資料庫:作為資料In Place空間,提供資料執行和持久化儲存空間。
- 系統日誌捲:作為日誌捲,例如,在HPC系統中通常採用Checkpointing實現對計算中間狀態進行持久化儲存,這是一個耗時、耗系統吞吐量的過程。
基於NVM產品提供的位元組定址、持久化、高效能的能力,以及考慮到其讀寫、順序和隨機訪問不對稱等特性,對Redis作了細緻的設計和深度的定製化改造,針對上面幾個問題取得非常好的測試效果。
效能分析:前面提到Redis的always樣式透過實時flush操作確保AOF檔案的實時持久化,但這會導致效能大幅下降。Everysec樣式透過大幅減少Flush操作的頻率,基於page cache緩衝對裝置的讀寫訪問大幅提升QPS效能,但是這會引入秒級的資料丟失風險。而基於NVM產品提供的持久化能力可以非常優雅地解決這個問題,兼顧效能和可靠性。整個的資料流圖如下:
圖2: 基於NVM產品的資料讀寫流程
首先將AOF檔案直接放在基於NVM產品的PMEM-aware filesystem上(比如EXT4 DAX樣式),透過mmap將AOF檔案對映到使用者態地址空間,之後對AOF的訪問操作就變成了非常輕量的直接Load/Store方式,而且要確保資料持久化也僅需要在使用者態執行Persist操作(主要是Cache flush)。可見,基於NVM產品的AOF持久化機制相比傳統的IO棧要輕量的多:
Bypass整個傳統IO棧(Block層->裝置驅動等),實現直接load/store操作。透過cache flush操作即可實現持久化,取代了Flush系統呼叫。
AOF機制的另一個問題是AOF檔案的持續增大會造成巨大的空間浪費,所以阿裡雲Redis團隊透過後臺執行緒的方式按照一定的策略(考慮吞吐和資源佔用量等)對AOF檔案進行replay操作。即根據AOF命令在NVM產品上構造持久化的KV資料結構,然後完成回放的AOF檔案就可以刪除,從而解決了AOF佔用空間的問題。
之所以選擇後臺執行緒非同步Replay的方式在NVM上構建持久化資料結構,是因為該過程需要透過事務操作來保證寫操作的原子性和資料結構的一致性,耗時較大,所以資料先寫到DDR的方式可以保證客戶端寫操作的QPS不下降。
考慮到NVM擁有出色的讀效能,資料非同步replay到NVM之後,會根據資料冷熱和記憶體佔用量釋放部分value比較大的記憶體副本,轉而直接基於NVM提供讀服務。所以DRAM逐漸演變為NVM的寫cache和熱資料的讀cache,以充分發揮NVM的讀效能和成本優勢,同時規避NVM寫效能(相對)的短板問題。
在兩臺96核/384GB神龍伺服器上,實測string資料結構的SET操作,從結果資料來看幾乎與everysec樣式的效能持平,同時兼顧了always樣式的資料安全性和everysec樣式的高效能。
圖3:Redis寫入效能對比
Redis在重啟時需要進行資料恢復操作。原生Redis重啟後都需要從RDB和AOF中載入資料到記憶體,完成載入後才可以正常提供服務。經過實測,10GB左右資料的RDB載入時間大概為53秒左右,這段時間內Redis服務處於不可用狀態。而在基於NVM的方案中,Redis重啟後可以先基於NVM的持久化資料結構直接提供讀服務,DRAM資料結構重建完成後即可提供完整的讀寫服務。
同樣針對10GB左右的資料集,系統shutdown save後重啟,實測1秒內可以提供只讀服務,35秒內可以提供完整讀寫服務,整個資料恢復時間大幅下降。如下圖所示:
圖4: Redis recovery時間對比
另外,原生Redis透過fork一個子行程來儲存全量DB資料到RDB或AOF檔案,即使相比上次儲存的資料僅有一個key的變更,也依然會全量儲存整個DB,顯然這不是一種高效的實現方式。並且該過程會對Redis帶來較大的效能抖動。而基於NVM的方案是一種持續增量持久化的方式,更加高效和平滑,這點對於線上服務來說至關重要。
NVM相比DRAM能提供更高的儲存密度和更大容量的資料儲存空間,因此可以有效降低單位資料儲存成本。基於NVM的位元組定址能力和與DRAM的速度差異,我們設計了NVM非易失性記憶體和DRAM易失性記憶體間的資料換入與換出策略,能在不影響Redis基本效能的前提下,提高資料的儲存容量並節約成本。
結束語:整個方案中,充分發揮了NVM的位元組定址、持久化等能力,藉助DRAM做cache來彌補NVM讀寫不對稱的問題,從而實現了高可靠、高效能、低成本的Redis資料庫,從測試資料可以看出NVM對Redis在持久化以及其他效能方面提升效果非常顯著。
除此之外,NVM相比DRAM能提供更高的儲存密度和更大容量的資料儲存空間,因此可以有效降低單位資料儲存成本。在不影響Redis基本讀寫效能的前提下,基於NVM和DRAM的動態資料輸入換出,是我們下一步工作的方向之一。
當然,目前方案仍存在一些待最佳化的點,比如:對於高寫入場景,Replay效能跟不上DRAM寫入速度;Failover時候,需要等DRAM重建完成才能提供寫服務等。後續會繼續跟進這些問題,結合技術和產品來一起合理改進。
關於SCM技術,目前已經在各個行業得到廣泛使用,為了讓更多儲存相關從業者全面瞭解和掌握SCM,筆者已經把SCM相關知識做了梳理和總結(詳解SCM/NVM技術現狀和研究方向),目錄如下:
1 、SCM技術發展和背景 1
1.1 為什麼要引入新型記憶體 3
1.2 SCM具備哪些特點 6
1.3 SCM與DRAM的關係 7
1.4 混合記憶體架構的機遇與挑戰 8
2 、關於SCM(Storage Class Memory) 9
2.1 目前的記憶體子系統特點 9
2.2 新型記憶體子系統特點 9
2.3 外儲存系統特點 9
2.4 儲存領域發展趨勢 10
2.5 新型儲存器的誕生 10
3 、什麼是相變儲存器PCM 11
3.1 相變儲存器儲存介質 11
3.2 相變儲存技術基本原理 12
3.2.1 寫操作(Program) 13
3.2.2 讀操作(Read) 14
3.3 多層(MLC)儲存PCM 14
3.4 PCM和FLASH的異同點對比 15
3.5 PCM和DRAM的異同點對比 16
3.6 PCM在儲存系統中的應用 17
3.6.1 在技術學術界 17
3.6.2 在商品產業界 18
3.7 PCM 在儲存系統中的位置 18
3.7.1 PCM被用作Cache 19
3.7.2 PCM結合DRAM作為混合記憶體 19
3.7.3 PCM結合Flash作為混合外存 20
3.8 PCM研究現狀及發展前景 20
3.8.1 晶片級別研究方向 20
3.8.2 儲存介質研究方向 21
3.8.3 儲存系統的研究方向 22
3.9 幾種主要新型儲存器 22
4、 MRAM磁性儲存器 23
4.1 MRAM實現原理 23
4.2 MRAM儲存特性 23
5、 STT-RAM自旋轉移力矩儲存器 28
6、 FeRAM鐵電儲存器 28
6.1 工作原理 28
6.2 儲存特點 28
7、 RRAM阻變式儲存器 29
8、 PFRAM聚合物儲存器 29
9、 其它新型儲存器件 29
10、 3D XPoint非易失性快閃記憶體技術 31
10.1 Post-NAND後快閃記憶體時代 31
10.2 3D Xpoint技術概述 31
10.3 Apache Pass(AEP)和Clodstream 32
10.4 Cache加速和Cache記憶體應用 35
11、 PowerMax針對SCM的計劃 38
11.1 SCM加密和雙埠技術 39
11.2 Optane DIMM支援 40
11.3 中檔產品對SCM支援 40
12、 Netapp儲存NVMe&SCM;技術 41
12.1 NetApp在NVMe&SCM;佈局歷程 41
12.2 NetApp在NVMe&SCM;的戰略 42
12.3 NetApp在NVMe&SCM;的技術亮點 43
12.4 NetApp技術總結 44
13 、SCM關鍵技術和效能最佳化 44
13.1 SCM有哪些主要特性 45
13.2 永續性記憶體主要特點 46
13.3 SCM硬碟主要特點 46
13.4 Linux的I/O儲存棧 48
13.5 驅動程式和塊裝置驅動 48
13.6 檔案使用樣式 49
13.7 I/O處理過程 50
13.8 傳統儲存棧特點 50
13.9 存取和使用樣式的效能 51
13.9.1 PCM和 Flash效能對比 51
13.9.2 PCM和eMMC效能對比 51
13.10 透過NVMe簡化儲存棧 53
13.10.1 多核系統中的I/O排程最佳化 53
13.10.2 檔案系統最佳化 54
13.10.3 作業系統最佳化 55
13.10.4 新操作語意 55
13.10.5 新程式設計樣式 57
14、 SCM系統面臨的問題和思考 57
14.1 軟體堆疊時延 57
14.2 網路帶來時延 58
14.3 系統崩潰一致性 58
14.4 訪存重排引入崩潰一致性 59
14.5 如何應對這些挑戰 59
14.5.1 應對軟體棧時延的挑戰 59
14.5.2 應對崩潰一致性的挑戰 59
14.5.3 應對網路時延的挑戰 59
14.6 挑戰和應對方案總結 60
15 、SCM技術線路研究方向 60
15.1 SCM的儲存系統的組織結構 61
15.2 SCM的儲存系統的訪問方法 61
15.3 SCM的儲存系統資料可靠性 62
15.4 SCM的儲存系統資料安全性保障 63
15.5 SCM的儲存系統軟體最佳化 63
15.6 SCM的儲存硬體原型系統 64
15.7 SCM的事務性儲存系統 64
15.8 SCM的上層應用 65
15.9 SCM研究路線總結 65
16、 深度分析Intel AEP關鍵知識點 66
16.1 AEP的特點 66
16.2 AEP與DRAM的簡單對比 66
16.3 AEP與儲存(SSD+HDD)的對比 67
16.4 AEP應用場景場景的思考 67
16.5 從Intel Optane SSD到Intel DIMM 67
16.5.1 軟硬體開銷的變化 67
16.5.2 AEP的訪問模型 68
17、 SCM相關文章附錄 69
17.1 SCM相關的開源專案 69
17.2 常用資源網址 69
朋友會在“發現-看一看”看到你“在看”的內容