Aerospike-Architecture系列之混合儲存,aerospike

來源:互聯網
上載者:User

Aerospike-Architecture系列之混合儲存,aerospike
Hybrid Storage(混合儲存)

混合記憶體系統包含每個節點上的索引和資料,操縱與實體儲存體的互動。它還包括用於自動移除就資料的模組以及磁碟重組等模組。

Aerospike可以將資料存放區在DRAM,傳統磁碟及SSD硬碟,每個namespace可以分別進行配置。這種配置彈性允許應用程式開發人員在記憶體中配置一個小但頻繁訪問的namespace,在相對廉價的SSD硬碟中配置一個大的namespace。

在SSD上最佳化資料存放區的重要工作已完成,包括穿透檔案系統利用底層SSD讀寫入模式。

Philosophy(理念)

不同於 Large Data Types,一條記錄的所有資料存放區在一起。每行的儲存限制預設為 1 MB。

儲存寫時複製(copy-on-write),由磁碟重組進程回收空間。

每個namespace配置固定大小的儲存。每個節點必須有一樣的namespace,並且每個namespace大小一致。

儲存可以配置為純記憶體無持久化,記憶體並持久化,或者快閃記憶體(SSD)

持久化儲存(磁碟)必須是快閃記憶體或高效能Block Storage裝置(雲),或者是任何存放裝置上的檔案。

Data in DRAM(記憶體中的資料)

記憶體中的資料-無持久化-好處是高輸送量。即使是高效能的現代快閃記憶體儲存效能依舊不及記憶體,記憶體的價格也在快速下降。

資料通過 JEMalloc 分配器進行分配。JEMalloc允許分配到不同的池。長期分配-比如那些為儲存層所做的-可以單獨分配。我們發現JEMalloc分配器在低片段的情況下具有超常效能。

通過DRAM的多副本可以獲得進階別的可靠性。由於Aerospike在叢集節點損壞或節點加入時重新進行資料分配和資料複製,可以獲得進階別的"k-safety" 。自動從資料副本中恢複節點資料。

由於Aerospike的隨機資料分布( data distribution),當幾個節點失敗時資料不可用風險相當小。例如,在一個有兩個資料拷貝的10節點叢集中,如果兩個節點失效。失效資料的數量大約2%,1/50的資料。

當持久層被配置,讀發生在記憶體副本。通過資料路徑進行寫入。


Data on SSD / Flash(SSD上的資料)

當資料被寫入,為避免相同記錄寫入衝突會在行上加寫入閂。在某些叢集狀態下,資料需要從其他節點讀入並解決衝突問題。

當寫入被確認,記憶體中的記錄在主節點被更新。被寫入的資料添加到寫緩衝區。如果寫緩衝區滿了,排隊寫入磁碟。類似最大行數,依賴於寫緩衝區大小和寫輸送量,這裡存在一些未提交資料的風險。

如果有副本,當更新時他們的索引同時更新。當多有記憶體中的副本都被更新,結果將返回用戶端。

系統可以被配置為在所有寫完成之前返回結果-延遲一致性。

Storing data(儲存資料)

Aerospike資料包括整型、字串、二進位對象、原生序列化類別型、列表、映射及LDTs。

除了更高效的"single bin mode",bin-Aerospike的列-每個bin有一個bin名稱,它用一個字串表進行儲存。每個列的名稱被儲存移除,一個namespace中可以儲存32K個唯一bin名稱。

如果需要更多的bin名稱,可以考慮使用map。利用map,你可以儲存任意數量的鍵值對,通過UDF訪問高效訪問資料。

如果通過類似java class這樣的複雜語言類型訪問資料。Aerospike用戶端將使用語言原生的序列化系統。資料將被儲存為語言指定的 "blob type"。這允許相同語言的用戶端使用清晰的代碼讀取資料,但是大多數語言的預設序列化很簡陋。

整型以8位元組儲存,這限制了目前的版本整型的值。Aerospike網路通訊協定允許變長整型。

String以 UTF-8字元集儲存。對大多數字串UTF-8比unicode更緊湊。為了允許誇語言相容,用戶端函數庫將原始的unicode字元轉換成UTF-8.

最有效率的方式是使用二進位對象 (blobs)。其大小限制於記錄大小限制相當。許多部署使用自己的序列化,可能對對象壓縮後直接儲存。這樣做意味著資料不能容易的通過UDF訪問

複雜類型呈現為msgpack本機存放區。複雜物件在用戶端被序列化,利用寫協議發送。當應用到簡單的get/put操作,網路格式無需序列化或轉換,直接寫入儲存。

Flash optimizations(快閃記憶體最佳化)


磁碟重組器追蹤磁碟上每個塊上的活動記錄數量,回收低於最低使用的塊。磁碟重組器不斷掃描活動快,尋找那些有一定數量空閑空間的塊。

Eviction based on storage(基於儲存的回收)

磁碟重組器追蹤磁碟上每個塊上的活動記錄數量,回收低於最低使用的塊。清除器負責移除到期記錄,當系統到達預設的高水位線時回收記憶體。當配置namespace時,管理員指定namespace使用記憶體的最大值。通常操作下,清除程式尋找到期資料,釋放記憶體和磁碟空間。清除程式也通過namespace追蹤記憶體使用量情況,如果記憶體達到預設的高水位線,即使記錄不是必須到期,清除程式也會釋放比較舊的記錄。當系統記憶體達到使用上限時,通過允許清除程式移除老的資料,Aerospike可以被作為一個高效的LRU(最近最少使用演算法) cache使用。注意,記錄的年齡通過其最後一次修改時間來度量,應用程式可以在任何時間修改記錄的存活期。應用程式也可以指定記錄永遠不被自動回收。

Large records (Sub-Record Storage Mechanism)大記錄(子記錄儲存演算法)

為了支援大對象的儲存能力,Aerospike支援新的底層儲存模型,這就是所說的“子記錄”(sub-records)。子記錄(sub-records)與常規記錄很相似,主要的不同點事不能直接存取。子記錄連結在父記錄上並通過父記錄進行訪問。子記錄與父記錄共用分區ID和內部記錄鎖,所以在遷移時與父記錄一起移動,與父記錄一起通過一樣的隔離機制保護。

Aerospike LDT 使用這種儲存演算法構建。LDT bins/records(具有LDT類型bin的記錄)不是連續儲存的相關記錄,而是劃分為多個子記錄(大小在2k至1M)。一個子記錄至於一個bin有關,可以包含多重專案(例如,8k的子記錄可以持有100個80bytes的字串資料)。子記錄之間是互連的,連結在父記錄上來提供有效更新和尋找。

因此,LDT對象利用Aerospike健壯的複製,重新平衡及遷移演算法來確保即時一致性和高可用。LDT對象通過用戶端API在資料庫伺服器端處理。

子記錄機制有如下好處

  • 利用SSD能力執行隨機讀不需要任何其他開銷,也不需要想傳統資料庫實施時所擔心的資料在儲存上的排列問題。
  • 當執行指定的LDT操作(例如插入100bytes)成本只相當於與更新LDT條目,用戶端與伺服器直接也沒有LDT的互動成本。

大記錄用不同的方式儲存,但是允許資料超過單記錄的限制,請閱讀Large Data Type Architecture.


原文連結: <http://www.aerospike.com/docs/architecture/storage.html>
譯       者:北京IT爺們兒

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.