依靠內存來存儲數據的資料庫管理系統,也稱為內存資料庫,成為了解決高並發、低時延數據管理需求的技術路線。近年來,隨著動態隨機存儲器(DRAM)容量的上升和單位價格的下降,使大量數據在內存中的存儲和處理成為可能,Redis、Memcached等內存資料庫管理軟體逐漸成熟,應用範圍越來越廣。
未來幾年,隨著非易失性存儲器件(NVM)逐步投入商用,新硬體將會給內存資料庫帶來更大的發展機遇。
本白皮書闡述了內存資料庫的概念,梳理了內存資料庫的發展歷史和核心屬性,分析了在電商、直播和電信行業的典型應用場景,並對主流的內存資料庫進行了介紹和對比,從技術和管理兩個角度提出了產品選型和硬體選型建議,並總結了內存資料庫的發展趨勢:
內存資料庫又稱主存資料庫(In-memory或main memory database),是一種主要依靠內存來存儲數據的資料庫管理系統。
在資料庫技術中,有一類內存優化技術,是在傳統的磁碟資料庫中,增加內存緩衝池,也就是常說的共享內存技術,其主要目的是最小化磁碟訪問。
而內存資料庫技術,幾乎把整個資料庫放進了內存中,相較於傳統資料庫使用的磁碟讀寫機制,內存具備更極致的讀寫速度,性能會比傳統的磁碟資料庫有數量級的提升。因此內存資料庫通常被用於對性能要求較高的場景中。
1.內存技術的成熟
內存器件的容量密度在快速上升。最早期的內存和今天常見的內存條不同,是直接焊接在主板上的內存晶元,容量普遍在64KB以下。
- 1982年之後,隨著80286晶元的推出,開始出現30線(Pin)256KB的SIMM內存條,被認為是內存領域的開山鼻祖;
- 在80年代末,386和486時代的PC向16位發展,出現了72線的SIMM內存,單條容量可達512KB-2MB;90年代初,EDODRAM開始盛行,單條容量在4MB-16MB;
- 在1995年,計算機系統進入圖形界面時代,內存技術也發生了重要變革,支持64位的SDRAM成為一代經典,在性能上有極大提升,容量也達到了64MB;
- 隨後的十幾年,內存容量開始穩定地遵循摩爾定律翻倍,持續到2019年,DDR3內存的容量已經可以達到16GB。
內存器件的單位價格也在逐年快速下降。從1970年代至今,內存每兆位元組的價格下降了近9個數量級,根據2019年最新的統計數據,平均花費3-5美元就可以購買到1GB的內存。內存容量的持續上漲以及價格的下降,使大量數據在內存中進行存儲和操作成為可能。

2.內存技術的瓶頸與突破
過去幾十年,計算機系統的存儲體系結構被設計成如圖2的金字塔形模型。這樣的存儲結構利用局部性原理盡量將熱數據存儲在靠近CPU的地方。在傳統模式中,內存資料庫的所有數據都保存在DRAM介質中。
雖然DRAM的價格已經大幅下降,但在海量數據存儲的需求下,內存的成本依然是很大的問題;另外由於DRAM屬於易失性介質,掉電後所有數據都會丟失,需要額外考慮數據持久化的方案,會極大的限制內存資料庫的性能和使用場景。

針對DRAM現存的一些硬體瓶頸,業界已經研發出了持久型內存(PM,Persistent Memory),學術名為存儲級內存(SCM,Storage ClassMemory),和DRAM一樣,都是安裝在機器主板的內存槽介面中。
參考圖2,DDRDRAM及以上的易失性存儲CPU可以通過load/store指令直接訪問,而NANDSSD及以下的非易失性存儲CPU無法直接訪問,需要先載入到易失性存儲中,可以看出DRAM與SSD之間存在巨大的性能鴻溝,在訪問時延上出現了跳變。
而持久型內存位於DRAM與SSD之間,以load/store指令的方式訪問並支持數據的持久化,也填補了DRAM與SSD在時延上存在的鴻溝。相比DRAM,持久型內存在性能上處於劣勢,但容量和價格均佔據優勢;相比NANDSSD,持久型內存在性能上處於優勢,但容量和價值處於劣勢。
3.內存資料庫的發展歷程
內存資料庫的發展主要經歷了雛形期、理論成熟期、市場成長期及高速發展期四個階段。

4.內存資料庫的優勢與挑戰
內存資料庫在提供高性能讀寫能力的同時,也存在由於器件導致的數據易失問題,需要在應用中引起注意。
1).優勢:高性能讀寫
由於省去了磁碟I/O的開銷,在數據訪問的時延上內存型資料庫可以達到傳統關係型資料庫無法達到的微秒級別,單機內存資料庫的QPS也可以達到10萬以上,配合上用戶態協議棧、內存大頁等技術之後,更是可以輕鬆達到幾十萬QPS的量級,這是傳統的關係型資料庫很難做到的。
2).挑戰:內存數據易失
內存資料庫當前主要使用DRAM作為存儲介質,DRAM屬於掉電易失性介質,為了保證數據的可靠性,內存資料庫需要考慮持久化方案。現階段主流的鍵值對內存資料庫對於持久化的支持較為薄弱,持久化性能也不如傳統資料庫。
內存型資料庫中克服掉電易失性來保障數據可靠性的方法主要是以下兩種:
- 一是每次操作都進行數據持久化,這種方式勢必會大幅降低內存資料庫的性能;
- 二是按照一定的策略進行操作的持久化,這樣可以達到一定程度的優化和緩解,但極端情況下數據丟失的情況仍不可避免。
現階段新型的非易失性存儲器件已經發布但尚未規模化商用。相信解決了存儲易失性的難題後,內存資料庫會具備更多的應用。
5.內存資料庫的分類
主流的內存資料庫可分為鍵值對內存資料庫、關係型內存資料庫以及其他資料庫,用戶可根據自身的業務需求選擇適合自己的內存資料庫類型。
1).鍵值對內存資料庫
鍵值對(KV, Key-Value)內存資料庫指的是一種以鍵值對為主要存儲結構的內存資料庫。鍵值對內存資料庫通常按鍵進行數據存取操作,值通常支持各種數據類型,使用鍵值存儲的數據模型相對簡單,更適合要求性能高、計算簡單的一些場景。鍵值對內存資料庫的典型代表為 Redis、Memcached 和 Aerospike。
2).關係型內存資料庫
關係型內存資料庫是一種基於數據關係模型的內存資料庫。關係型內存資料庫將傳統的關係型資料庫表搬到內存中,支持通過 SQL語句的方式實現對內存數據的訪問,在實現複雜分析功能的同時,提升數據訪問速度。關係型內存資料庫的典型代表軟體為 Oracle TimesTen、SAP HANA、MemSQL 和 SQLite。
3).其他類型的內存資料庫
除鍵值對內存資料庫、關係型內存資料庫之外,其他比較小眾的內存資料庫稱為其他內存資料庫,比如圖內存資料庫 RedisGraph 等。
6.內存資料庫產品現狀
DB-Engines Ranking 是公認較權威的資料庫排行,我們選取了其中最為活躍的 10 款典型內存資料庫進行對比。開源產品中,Redis 和 Memcached 是最受歡迎的兩款鍵值對內存資料庫;而 SQLite 是最受歡迎的關係型內存資料庫。表中大部分的關係型內存資料庫為商用資料庫,其中熱度最高的是 SAP HANA。
早在 1995 年就發布第一版的Oracle TimesTen 仍然在網上活躍;2014 年新發布 Apache Ignite 兼容鍵值和關係型數據結構,熱度正穩步攀升。事務支持方面,大部分的關係型內存資料庫稱可以支持 ACID,但都需要在性能上作出妥協。

7.內存資料庫選型建議
技術服務於業務,內存資料庫的選型應首先遵循業務場景的需求。業務特性決定了數據的應用特性,包括數據量、並發度、讀寫特性、一致性、響應時間、操作複雜度、業務連續性等要求,對應資料庫的一致性、容錯性、擴展性、安全性等技術要求。在做內存資料庫的選型前,建議先梳理業務需求並進行量化;再將核心數據應用特性映射成資料庫技術要求;最後按篩選出的技術要求進行選型。
1).技術因素
按照技術要求進行內存資料庫選型時,可主要考察業務的性能、一致性要求和 SQL 兼容性三個因素。

業務是否有很高的性能要求?一般有高並發、低時延讀寫要求的業務,如遊戲實時排行、直播粉絲關注等,建議選擇內存資料庫。
業務數據是否要求強一致性?如果業務對數據的可靠性和一致性要求較高、需要 ACID 級別的事務支持,則建議使用 MySQL 等傳統的關係型資料庫。但需要注意的是,強一致性的要求會對資料庫的性能造成一定的影響;如果需要兼具高性能和強一致性,則需要在應用架構層面進行優化,單靠資料庫的能力還無法實現。
數據處理是否要求 SQL 兼容性?在高性能要求的場景下,業務中如果數據結構固定、有複雜的關聯計算要求,或是需要 SQL 無法支持的情況,建議使用關係型內存資料庫;對於數據結構多變、擴展性要求高、數據模型和操作簡單的場景,建議使用鍵值對內存資料庫。
除了這三條考察指標,還可以結合數據容量、成本、擴展性、可維護性等需求進行綜合考量。
2).非技術因素
上述選型方法主要考量的是技術因素,除此以外還可以結合實際情況,引入一些其他維度的考量,進行綜合評估,最終挑選出適合的產品。包括但不限於以下維度:
- 1)生態成熟度。指資料庫產品的狀態,包括各種配套工具、技術架構成熟度、代碼質量、開發模式、社區建設、商業支持服務、版權協議等;
- 2)應用架構適配度。指應用架構對資料庫架構的兼容性、以及適配改造友好度,包括技術架構適配、開發語言適配等;
- 3)團隊適應度。指開發團隊、維護團隊對資料庫的熟悉程度、偏好程度、學習成本以及配套運維工具等。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/209100.html