單機存儲引擎就是Hash表、B樹等數據結構在機械磁盤、SSD等持久化介質上的實現。其理論來源於關係數據庫。
一、硬件基礎
1、CPU架構
現代的服務器多爲多核或多個CPU組成。經典的多CPU架構爲對稱多處理結構(Symmetric Multi-Processing,SMP),即在一個計算機上彙集了一組處理器,他們之間對稱工作,無主次或從屬關係,共享相同的物理內存及總線。
上圖爲2個CPU組成的SMP系統,每個CPU有兩個核心core,CPU與內存之間通過總線通信。每個核心有各自的L1d Cache(數據緩存)和L1i Cache(L1指令緩存),同一個CPU的多個核心共享L2以及L3緩存。
SMP架構的主要特徵即爲共享,系統中所有資源(CPU、內存、I/O等)都是共享的,由於多CPU對前端總線的競爭,SMP的擴展能力顯得非常有限。爲提高可擴展性,現在的主流服務器架構一般爲NUMA(Non-Uniform Memory Access,非一致存儲訪問)。
2、IO總線
存儲系統的性能瓶頸一般在於IO。以Intel x48主板爲例,它是典型的南、北橋架構。
北橋芯片通過前端總線(Front Side Bus,FSB)與CPU相連,內存模塊以及PCI-E 設備掛接在北橋上。通過DMI連接(1GB/s帶寬),網卡包含千兆、萬兆,硬盤以及中低端固態盤掛接在南橋上。如果採用SATA2接口,那麼最大的帶寬爲300MB/s。
3、網絡拓撲
傳統的數據中心網絡拓撲,分爲三層,Edge、Aggregation、Core。典型的接入層交換機包含48個1Gb端口以及4個10Gb上行端口,匯聚層以及核心層的交換機包含128個10Gb的端口。
傳統三層結構的問題在於有可能很多接入層的交換機接到不同接入層交換機下的服務器之間的帶寬小於1Gb。由於同一個接入層的服務器往往部署在一個機架內,因此,設計系統的時候需要考慮服務器是否在一個機架內,減少跨機架拷貝大量數據。Hadoop HDFS默認存儲三個副本,其中2個副本放在同一個機架上,就是這個原因。
爲減少系統對網絡拓撲結構的依賴,Google在2008年將網絡改造爲扁平化拓撲結構,即三級CLOS網絡。
4、參數性能
常見硬件性能參數:
存儲系統的性能瓶頸主要在於磁盤隨機讀寫。設計存儲引擎的時候針對磁盤的特性做很多的處理,如將隨機寫操作轉化爲順序寫,通過緩存減少磁盤隨機讀操作。近年來有越來越多的互聯網公司基於SSD開發應用(隨機讀取延遲小,能夠提供很高的IOPS,Input/Output Per Second)性能。
5、存儲層次架構
從分佈式系統的角度看,整個集羣中所有服務器上的存儲介質(內存、機械硬盤,SSD)構成一個整體,其它服務器上的存儲介質與本機存儲介質一樣都是可訪問的。區別僅僅在於需要額外的網絡傳輸及網絡協議棧等訪問開銷。
存儲系統的性能包括兩個維度:吞吐量、訪問延時。設計系統時要求能夠在保證訪問延時的基礎上,通過最低的成本實現儘可能高的吞吐量。
二、單機存儲引擎
1、哈希存儲引擎
a、數據結構
以Bitcask爲例,基於Hash表結構的鍵值存儲系統。
在任意時刻,只有一個文件可寫,用於數據追加,稱爲活躍數據文件(active data file)。已經達到大小限制的文件,稱爲老數據文件。
b、定期合併
Bitcask需要定期執行合併(Compaction)操作來實現垃圾回收。對於同一個Key的多個操作,只保留最新的一個,其它進行刪除,以保證不會再有冗餘數據。
c、快速恢復
將索引文件轉儲到磁盤生成的結果文件。
2、B樹存儲引擎
以Mysql InnoDB爲例,B樹存儲引擎不僅支持隨機讀取,還支持範圍掃描。
通過葉子節點來保存每行的完整數據,每次讀取一個節點,對應的如果不在內存中,需從磁盤中讀取並緩存起來。B+樹的根節點是常駐內存當中的。而緩衝區的管理通過管理器負責將可用的內存劃分成緩衝區。常見的算法有:LRU、LIRS等。
3、LSM樹存儲引擎
即將對數據的修改增量保持在內存中,達到指定的大小限制後將這些修改操作批量寫入磁盤(如LevelDB)。
當應用寫入一條記錄時,LevelDB會首先將修改操作寫入到操作日誌文件中,成功後再將修改操作應用到MemTable。當MemTable佔用的內存達到一個上限值後,需要將內存的數據轉儲到外存文件中。LevelDB會將原先的MemTable凍結稱爲不可變MemTable,並生成一個新的MemTable。
LevelDB的寫入操作很簡單,但讀取的操作比較複雜,需要再內存以及各個層級文件中按照從新到老依次查找。爲了加快讀取速度,LevelDB內部會致性Companion操作對已有的記錄進行整理壓縮,從而刪除一些不再有效的記錄,減少數據規模和文件數量。Companion的操作分爲兩種:Minor Companion和Major Compaction。
-------------------------------------------
有任何建議或問題,歡迎加微信一起學習交流,歡迎從事IT,熱愛IT,喜歡深挖源代碼的行業大牛加入,一起探討。
個人微信號:bboyHan
熱衷:Golang、Java、Python、區塊鏈、架構設計、數據分析等。