1. 程式人生 > 其它 >NoSQL佼佼者:選出最好的鍵值資料庫

NoSQL佼佼者:選出最好的鍵值資料庫

Aerospike,Hazelcast,Memcached,Microsoft Azure Cosmos DB和Redis對資料儲存方式進行了不同的改進。

大多數應用程式對相關資料需要某種形式的永續性:一種將資料儲存在應用程式外部以便安全儲存的方法。最基本的方法是將資料寫入檔案系統,但這很快就成為一種緩慢而笨拙的方法。有時,您需要的只是一種快速獲取自由格式資訊的方法。

鍵值儲存。它本質上是一種NoSQL資料庫,但具有高度特定的目的和故意限制的設計。它的工作是讓你獲取資料(一個值),為它(一個鍵)新增一個標籤,並將其儲存在記憶體中或儲存系統中,該系統已經過優化,可以快速檢索。應用程式使用鍵值資料庫來處理從快取物件到在應用程式節點之間共享常用資料的所有內容。

許多關係資料庫可以作為鍵值儲存,但這有點像使用拖拉機拖車去雜貨店執行。它有效,但效率極低,並且有更輕鬆的方法來解決問題。與其他NoSQL資料庫一樣,鍵值儲存為簡單的價值儲存和檢索提供了足夠的基礎架構,可以更直接地與使用它的應用程式整合,並以更細粒度的方式擴充套件應用程式工作負載。

一、鍵值NoSQL資料庫功能比較

五種廣泛使用的產品(包括一種雲服務)值得您考慮; 它們被明確地稱為鍵值資料庫,或者提供鍵值儲存作為核心功能。他們的基本差異:

l Hazelcast和Memcached傾向於極簡主義,甚至懶得備份磁碟上的資料。

l Aerospike,Cosmos DB和Redis功能更全面,但是仍然圍繞著鍵值儲存。



二、深入Aerospike

與Redis一樣,Aerospike是一個鍵值儲存,可以作為持久資料庫或資料快取執行。Aerospike旨在易於叢集和易於擴充套件,以更好地支援企業工作負載。

Aerospike獨有的特色

Aerospike的很多內容與其他鍵值儲存和其他NoSQL資料庫相呼應。通過金鑰儲存和檢索資料,並且資料可以儲存在許多基本資料型別中,包括64位整數,字串,雙精度浮點數和從許多通用程式語言序列化的原始二進位制資料。

Aerospike還可以將資料儲存在複雜型別 - 值列表,稱為對映的鍵值對集合以及GeoJSON格式的地理空間資料中。

儲存在Aerospike中的資料可以組織成幾個分層容器。一些NoSQL系統是面向文件的,這意味著資料被封裝在某種物件中,通常是JSON。使用Aerospike,容器大致類似於文件,但具有Aerospike特有的功能和行為。每種容器都允許您在其中的資料上設定不同的行為屬性。

Aerospike如何處理儲存和群集

Aerospike幾乎可以將資料儲存在任何檔案系統上,但它專門用於利用SSD。也就是說,不要指望將Aerospike放在任何舊SSD上,並期望取得良好效果。Aerospike的開發人員維護了一系列已批准的SSD裝置,他們建立了一個名為ACT的工具,用於評估Aerospike工作負載下SSD儲存裝置的效能。

與大多數NoSQL系統一樣,Aerospike為了複製和叢集而使用無共享架構。Aerospike沒有主節點,也沒有手動分片。每個節點都是相同的。資料在節點之間隨機分佈,並自動重新平衡以防止形成瓶頸。如果需要,可以設定重新平衡資料的規則。您可以配置在不同網段或甚至不同資料中心執行的多個群集,以便彼此同步。

在Aerospike中編寫指令碼

與Redis一樣,Aerospike允許開發人員編寫在Aerospike引擎內執行的Lua指令碼或UDF(使用者定義的函式)。您可以使用UDF來讀取或更改記錄,但最好使用它們跨多個節點上的記錄集合或“流”執行高速,只讀,對映減少操作。

哪裡可以獲得Aerospike

Aerospike的社群版可以直接從Aerospike的網站下載。這包括適用於Linux的伺服器版本,適用於Apple MacOS和Microsoft Windows的桌面版本,適用於Amazon EC2,Azure和Google Compute Engine的雲版本以及Docker容器。Aerospike的企業版可通過Aerospike的快速啟動計劃獲得,該計劃提供無限制的90天試用版。

原始碼可在GitHub上獲得。

三、深入Hazelcast

Hazelcast被稱為“記憶體資料網格”,實質上是一種跨多臺計算機彙集RAM和CPU資源的方法,允許資料集分佈在這些計算機上並在記憶體中進行操作。

NoSQL資料庫提供鍵值,圖形或文件功能。Hazelcast專注於鍵值功能,強調快速訪問分散式資料。據其製造商稱,它還可以用作Pivotal Gemfire,SoftwareTerracotta和Oracle Coherence等產品的替代品。

Hazelcast可以作為分散式服務執行,也可以直接嵌入Java應用程式中。客戶端可用於Java,Scala,.Net,C / C ++,Python和Node.js,而Go正在開發中。

Hazelcast獨有的功能

Hazelcast使用Java構建,具有以Java為中心的生態系統。Hazelcast叢集中的每個節點都在JVM上執行Hazelcast核心庫IMDG的例項。Hazelcast如何處理資料也與Java的語言結構緊密相關。例如,Java的Map介面被Hazelcast用於提供鍵值儲存。與Memcached一樣,QQ靚號出售地圖沒有任何內容寫入磁碟;一切都儲存在記憶體中。

Hazelcast可以在分散式環境中提供的一個好處是“接近快取”,其中通常請求的物件被遷移到發出請求的伺服器。這樣,可以在同一系統上直接在記憶體中執行請求,而無需跨網路往返。

除了鍵值對,您還可以通過Hazelcast儲存和分發許多其他型別的資料結構。有些是Java物件的簡單實現,比如Map。其他特定於Hazelcast。例如,MultiMap是鍵值儲存的變體,可以在同一個鍵下儲存多個值。這些功能可以模擬其他NoSQL系統的某些行為,例如將資料組織到文件中,但是這種結構允許資料快速分發和訪問。

Hazelcast如何處理群集

Hazelcast叢集沒有主/從設定; 一切都是點對點的。資料自動分片並分佈在群集的所有成員中。您還可以將某些叢集成員指定為“lite”,它最初不保留任何資料,但稍後可以提升為完整成員。這使得一些節點可以嚴格用於計算,或者在群集上線時逐漸通過群集分發資料。

Hazelcast還可以確保僅在至少一定數量的節點線上時才進行操作。但是,您必須手動配置此行為,並且它僅適用於某些資料結構。從Hazelcast版本3.9開始,您可以在群集中重新配置資料結構,而無需先使其離線。

哪裡可以獲得Hazelcast

Hazelcast可直接從Hazelcast網站下載。它通常部署為Java .JAR檔案的集合。Docker影象也可以在官方Docker登錄檔中找到。

您可以直接從Hazelcast下載Hazelcast的企業版。您還可以獲得Hazelcast的30天免費試用金鑰。

四、Memcached鍵值NoSQL資料庫深入

Memcached與key-value儲存一樣簡單和快速。Memcached最初是作為部落格平臺LiveJournal的加速層編寫的,後來成為Web技術堆疊中無處不在的元件。如果您有許多可以與簡單金鑰關聯的小資料片段,並且不需要在快取例項之間複製,則Memcached是正確的工具。

Memcached獨有的功能

Memcached最常用於快取來自資料庫的查詢並將結果專門儲存在記憶體中。在這方面,它與許多其他NoSQL資料庫,鍵值或其他方式不同,因為它們以某種持久的形式儲存資料。

Memcached沒有持久化。只儲存在記憶體中,因此只要重置Memcached例項或託管它的伺服器,它們就會消失掉。因此,Memcached實際上不能用作NoSQL資料庫的替代品。

但是,它是用來儲存常用資料的高速方法。

可以序列化為二進位制流的任何資料都可以儲存在Memcached中。通過引用應用程式中的值的鍵,可以將值設定為在一定時間後或按需過期。您為任何給定的Memcached例項投入的記憶體量完全取決於您,並且多個伺服器可以並行執行Memcached以分散負載。此外,Memcached與系統中可用的核心數量成線性比例,因為它是一個多執行緒應用程式。

大多數流行的程式語言都有Memcached的客戶端庫。例如,libmemcached允許C和C ++程式直接使用Memcached例項。它還可以將Memcached嵌入到C程式中。

Memcached如何處理群集

即使您可以執行多個Memcached例項,無論是在同一伺服器上還是在網路上的多個節點上,例項之間都沒有自動聯合或資料同步。插入到Memcached例項中的資料僅可從該例項中獲取。

哪裡可以獲得Memcached

Memcached的原始碼可從GitHub和官方Memcached站點下載。大多數Linux發行版的儲存庫中都提供了Linux二進位制檔案。Windows使用者可以直接從原始碼構建它; 過去已經建立了一些非官方的二進位制檔案,但似乎並不可靠。

五、Microsoft Azure Cosmos DB鍵值NoSQL資料庫

大多數資料庫都有一個總體範例:文件儲存,鍵值儲存,佇列儲存,圖形資料庫等。Azure Cosmos DB不是。

AzureCosmos DB獨有的功能

Cosmos DB使用所謂的原子記錄序列儲存系統來支援不同的資料模型。原子是原始型別,如字串,整數和布林值。記錄是原子的集合,如C中的結構。序列是原子或記錄的陣列。

Cosmos DB使用這些構建塊來複制多種資料庫型別的行為。它可以重現傳統關係資料庫中的表的行為。但它也可以重現NoSQL系統中找到的資料型別的功能 - 無模式JSON文件(DocumentDB和MongoDB)和圖形(Gremlin,Apache TinkerPop)。

表儲存是Cosmos DB提供鍵值功能的方式。查詢表時,使用一組鍵 - 分割槽鍵和行鍵 - 來檢索資料。您可以將分割槽鍵視為儲存桶或表引用,而行鍵用於檢索具有資料的行。該行可以有多個數據值,但沒有任何內容表明您無法建立只儲存在任何特定行中的一種資料型別的表。您可以通過.Net程式碼或REST API呼叫來檢索資料。

AzureCosmos DB如何處理複製和群集

Cosmos DB還提供全球覆蓋。儲存在Cosmos DB中的資料可以自動複製到Azure雲的所有36個區域中。您還可以根據應用程式的需要為讀取或查詢指定五個一致性級別之一。如果您希望以一致性為代價儘可能降低讀取延遲,請選擇最終一致性模型。如果您希望獲得強一致性,則可以使用它,但代價是將資料限制在單個Azure區域。其他三個選項在這些極點之間取得了不同的平衡。

哪裡可以獲得Azure Cosmos DB

AzureCosmos DB僅作為MicrosoftAzure雲中的服務提供。它不作為內部部署產品提供。

六、Redis鍵值NoSQL資料庫

如果Memcached沒有提供足夠的功能,請考慮Redis。Redis以Memcached(一個記憶體中的鍵值資料儲存)背後的相同基本思想開始 - 但更進一步。Redis不僅可以儲存和操作比簡單的二進位制blob更復雜的資料結構,而且還支援磁碟上的永續性。因此,Redis可以作為一個成熟的資料庫,而不僅僅是快取或資料的快速轉儲基礎。

Redis中的資料型別和資料結構

Redis的建立者將其稱為“資料結構伺服器”。Redis中最基本的資料結構是一個字串,如果只需要,您可以使用Redis來儲存字串。

但Redis還可以將資料元素儲存在較大的集合中 - 列表,集合,雜湊和更復雜的結構。這與其他NoSQL系統中的文件概念並不完全相同,但它對於在容器中將資料組合在一起的方式提供了一些相同的需求。

應用程式與Redis的互動方式與對Memcached的互動方式大致相同:獲取金鑰,將其與特定資料塊相關聯,然後使用金鑰獲取資料。任何二進位制序列都可以用作金鑰,最大可達512MB,但越短越好。金鑰可以具有生存時間值,也可以根據最近最少使用的規則進行逐出。

金鑰本質上是自由形式的,沒有與之關聯的隱式模式。如果要強制構造鍵的架構,例如物件:type:thing命名約定,則必須在應用程式中實現它。Redis不會為你做這件事。

要使用資料執行更復雜的操作,可以使用Redis的專用資料型別。這些類似於程式語言中的資料型別,而不是其他資料庫中的資料型別,每種型別都適用於不同的用例。

考慮Redis列表,它是使用Java中相同型別的連結串列結構組織的字串元素的集合。Redis列表非常適合以固定順序讀取的堆疊或元素列表,因為無論列表大小如何,向列表的頭部或尾部新增元素或從列表的尾部新增元素都需要相同的時間。但是,如果您想隨機訪問專案,最好使用Redis排序集。

Redis中的事務,快取,指令碼和自定義行為

Redis提供了以事務形式自動排隊和執行操作的能力。與其他資料庫中的事務不同,如果事務中的命令失敗,則Redis事務不會自動回滾。

作為其他應用程式之前的快取層,Redis提供了比Memcached更多的靈活性,從各種快取逐出策略開始管理資料。除了簡單的生存時間策略之外,Redis還允許您執行諸如隨機刪除金鑰或優先刪除具有較短生存時間的金鑰之類的操作,以便更高效地新增更新的資料。選擇的數量一開始可能令人困惑,但建議的預設值適用於絕大多數用例 - 您可以隨時以程式設計方式動態更改策略。

Redis包含Lua語言的直譯器,可以在Redis上執行批處理操作。您可以將Lua指令碼視為Redis的儲存過程版本 - 一種完成任務的方法,這些任務對於單獨的Redis來說有點過於複雜,但不需要完整的應用程式。但是請注意,Lua指令碼在執行時會構成Redis例項上的阻塞操作。執行Lua指令碼時不會發生任何其他事情。

Redis 4於2017年問世,它引入了一個模組系統,為開發人員提供了一種向Redis新增自定義資料結構和功能的方法。

哪裡可以獲得Redis

您可以直接從官方Redis站點下載Redis原始碼。大多數Linux軟體包管理器都可以為該版本的Linux安裝Redis二進位制檔案。微軟有自己的Redis分支用於建立Windows二進位制檔案。