RocksDB:高性能和可擴展性的 NoSQL 數據庫
已發表: 2022-11-19RocksDB 是一種流行的 NoSQL 數據庫,由於其高性能和可擴展性而被許多公司使用。 它是一個由 Facebook 發起的開源項目,現在由開發者社區維護。 RocksDB 使用日誌結構化合併樹 (LSM) 數據結構,使其能夠高效地處理寫入繁重的工作負載。
在使用 couchbase 四年多之後,我們遷移到了 MongoDB,並對結果感到滿意。 Couchbase 的體驗非常糟糕,儘管我們獲得了企業支持並在該平台上列出。 要使其正常工作,您總共至少需要六台服務器。 對於生產,只需要構建六台服務器。 內存中的緩存由 Couchbase 實例上較小的 Memcached 實例處理。 該程序佔用 8GB RAM,可提供 5000 個文檔。 事實並非如此。 我們的 Couchbase 實例上只有不到 5000 個文檔和不到 20 個索引,並且實例的內存消耗始終超過 8 GB。
嵌入式數據庫 RocksDB 在鍵值數據方面的表現令人欽佩。 這是 Google LevelDB 的一個分支,針對處理許多 CPU 內核進行了優化,非常適合具有高 I/O 要求的工作負載。 它可以在固態驅動器 (SSD) 或其他高性能存儲設備上運行。
當他們構建他們的 Cassandra 版本時,他們包括了RocksDB 存儲引擎,也稱為 Rocksandra。 我們極大地改變了我們對 Cassandra 存儲的看法,同時保持其網絡和節點協調不變。
Rocksdb 是內存數據庫嗎?
它的主要功能是為高性能數據提供服務,因為它是一個基於鍵值數據的嵌入式數據庫。 RocksDB 是從 Google 的 LevelDB 派生出來的,它能夠比許多 CPU 內核執行得更好,並且在 I/O 綁定應用程序中比 SSD 更快地存儲數據。
RocksDB 中的一個或多個組件可能導致內存使用過多。 當您在 MongoRocks 中的塊緩存對像上調用 GetUsage() 時,您可以確定塊緩存的大小。 當塊緩存大小減小時,將緩存更多數據,因為 IO 不會增加。 儘管 CPU 使用率可能不會因為 RocksDB 需要解壓縮它從頁面緩存中讀取的頁面而上升,但它可能會上升。 索引塊和布隆過濾器塊通常用於解釋差異。 在 MongoRocks 中,您可以通過為 memtables 分配內存預算來設置塊緩存。 在計算固定塊的內存使用時,它很簡單。 L1 大小可以通過添加或減去基本級別的字節來控制。 當同時進行 100k 讀取事務時,可能會導致內存變慢。
通過結合 RocksDB,嵌入式應用程序可以高效快速地存儲鍵值數據。 與動態 RAM 相比,SecondaryCache 具有更大的數量級,因此需要從遠程存儲讀取更少,從而降低讀取延遲和網絡帶寬消耗。 目前沒有計劃使用 RocksDB 作為默認數據庫模型,但我們對其未來的廣泛採用持樂觀態度。
為什麼 Rocksdb 是最好的鍵值存儲
RocksDB 是一種快速可靠的存儲選項,用於將鍵存儲在鍵值存儲中,也可以作為基於服務器的數據庫的基礎。 它帶有用於性能調整的 LSM 樹,使其成為需要大量數據存儲的應用程序的可行選擇。
RocksDB 與 Redis 有何不同?
Redis 的主要用例是內存,儘管它也可以將數據備份到持久存儲並在必要時在內存中進行計算。 在大多數情況下,RocksDB 用於持久化持久化數據,並且在很多情況下,數據存儲在持久化介質上。
Redis 對比 RocksDB 有哪些優勢? Redis 數據存儲是一種類似於 Memcached 的虛擬內存存儲。 RocksDB 嵌入式鍵/值存儲允許您讀取多線程和日誌結構的合併樹。 由於 Redis 非常高效且可擴展(CPU 除外),因此其擴展性沒有限制。 儘管 Redis 看起來更快,但 OP 的觀點是,正如他所說,您的數據集不需要受應用程序中可用內存量的限制。 在某些情況下,您可以使用 LedisDB 和相同的 Redis 客戶端庫來替代 Redis,這幾乎是九牛一毛。
Rocksdb 是分佈式的嗎?
RocksDB 是一個分佈式數據庫,可以水平擴展存儲和性能。 它旨在通過簡單的部署模型提供高可用性和性能。
ChakrDB鍵值存儲(KVS)基於RocksDB,適用於PB到幾十TB規模。 基於節點的架構 (vNodes) 用於分片 ChakrDB。 vNode 支持由 Kubernetes 創建的基於 ext4 文件系統的捲和 Nutanix BlockStore 內部文件系統配置。 RocksDB 是一種基於日誌結構合併 (LSM) 樹的 KVS,是 ChakrDB 背後的軟件。 LSM 的數據結構適用於 NVMe 設備以及 SSD。 ChakrDB 可以在各種磁盤、虛擬機和使用 Kubernetes 的 Azure 中運行。 因為是容器化的,所以ChakrDB容器化程序可以在一個Pod中運行在任何K8s環境中。
該平台可以託管在 Nutanix 的分佈式存儲服務(Azure 或 AWS)或任何云存儲服務提供商上。 Chakr 集群管理器負責集群中的所有控制平面流量。 chharDB 的目的是提供性能和規模。 使用 vNode,它創建了一個分片架構,將 I/O 分佈在多個 RocksDB 實例上,以提高並行性和寫入吞吐量。 Nutanix Objects 是有狀態服務的一個示例,可以使用 chacherDB 在嵌入式或遠程模式下運行。 它為 MetadataService 提供了維護緩存層的能力,同時還確保讀取後讀取的一致性。 我們可以在下圖中看到通過線性擴展 ChakrDB 實例獲得了多少吞吐量。
我們將在未來為讀取、寫入和掃描操作提供更詳細的結果。 我們正在研究不同開發階段的異步備份技術或校驗和計算。 RocksDB 的版本現在有更好的校驗和技術,可以在軟件損壞變得持久之前檢測到它。 在對 ChakrDB 有很高需求的應用程序中,有大數據分析、機器學習和人工智能等工作負載。 Nutanix 目前正在各種正在進行的項目和產品中對 ChakrDB 進行原型設計,這些項目和產品已經取得了可喜的成果。 我們將在未來的博客中讓您了解我們正在做的事情。
Rocksdb:數據庫的快速存儲引擎
與 Linux 和 Apache 相比,RocksDB 不是一個具有災難恢復計劃的分佈式系統。 由於可用性低,並且由於缺乏強大的數據複製機制,它沒有很大的容量。 儘管如此,一些世界上最流行的數據庫仍在繼續使用它。 已經具備快速數據庫引擎的 LevelDB 使 RocksDB 成為理想的存儲引擎。 LevelDB 能夠擴展以處理大量數據,同時還利用快速存儲,這是一項重要資產。 此外,RocksDB 具有創新能力。 RocksDB 可以以多種方式存儲數據,包括 IO 綁定、內存中或一次寫入。 因此,對於存儲要求高又不想犧牲性能或數據可用性的數據庫來說,這是一個非常好的選擇。
Rocksdb 替代方案
根據您的具體需求,有許多不同的 rocksdb 替代方案可供選擇。 一些流行的替代方案包括 hbase、leveldb 和 berkeley db。
截至 2022 年,SourceForge 將 RocksDB 列為 Linux 的最佳替代品。 借助雲數據庫Redis版,我們可以高速從內存緩存中讀取數據,保證數據的持久化,並在此過程中使用內存和硬盤存儲。 自2009年起,Tair成為阿里巴巴集團官方數據緩存提供商,在雙11等數據緩存場景中的表現得到認可。 Tanzu GemFire 對數據訪問請求的低延遲響應使應用程序能夠始終返回最新數據。 Google Cloud Bigtable 是一種完全託管的 NoSQL 數據庫服務,專為需要實時分析和運營數據的工作負載而構建。 Amazon DynamoDB 每天可以處理超過 10 萬億次請求,支持每秒超過 2000 萬次請求的峰值流量。 BergDB 是一個無模式、嵌入式、面向文檔的 NoSQL 數據庫,它是開源的並且可以免費使用。
提供簡單鍵值存儲、ACID 事務、歷史查詢、並發控制、快速附加存儲、複製、透明對象標識符等多種功能。 OrigoDB 允許您以極低的成本構建關鍵任務的高性能係統。 因此,它提供了全方位的內存數據管理功能,包括同時管理多個數據庫的能力。 單個 OrigoDB 引擎每秒可以處理數百萬個讀取事務。 Ignite 軟件可用於開發 Java、C#、C++、Python 和其他編程語言的應用程序。 您可以快速輕鬆地加入、分組、聚合和排序內存和磁盤服務器上的數據。 您的 Ignite 數據庫現在可以轉換為分佈式超級計算機。
Oracle 自治數據庫簡化了關係數據庫的管理。 作為最靈活的部署之一,Redis Enterprise 提供混合模型。 InfinityDB Embedded 是一種 Java NoSQL 數據庫,包含用於存儲鍵值記錄的層次結構。 該系統的性能、靈活性和免維護特性使其成為高性能、多核、靈活和免維護使用的理想選擇。 LeanXcale 是一個快速且可擴展的數據庫,它結合了 SQL 和 NoSQL,使它們能夠很好地協同工作。 KiVi 存儲引擎旨在以關係格式存儲數據。 ModJS 允許您編寫可以直接從 KeyBD 調用的 javascript 函數。
使用 Amazon ElastiCache 可以輕鬆設置、運行和擴展流行的內存數據存儲。 緩存、會話存儲、遊戲、psyg 服務、實時分析和緩存只是 Amazon ElastiCache 可用的幾個實時用例。 Go 憑藉其高性能的 NoSQL 數據庫庫和服務器,是開發 Ledisdb 的最佳選擇。 OrientDB 是市場上最快的圖形數據庫。 通過新的收入來源提高您的競爭優勢並加速創新。 Macrometa NoSQL 數據庫是無服務器的,基於流引擎,可以高速處理和計算數據。 Memorystore 可自動執行複雜的 Redis 和 Memcached 任務,例如高可用性、故障轉移、修補和監控。
像 upscaledb 這樣的高性能數據庫利用它們的快速鍵值存儲和算法來最大限度地利用它們。 UpscaleDB 是一個開源基準,可以掃描超過 5000 萬條記錄並檢索最多。 Tablestore 平台使用數據分片和服務器負載平衡器技術以無縫方式實現數據增長和並發擴展。 InsightEdge 是分析的提供者,可以對歷史結構化的流數據進行實時分析。 通過使用本服務按量付費的計費方式,您可以確保您的風控系統始終處於最佳運行狀態。 ScyllaDB 數據庫專為具有高性能和低延遲要求的數據密集型應用程序而設計。 超過 400 家改變遊戲規則的公司使用 ScyllaDB,例如迪士尼、Expedia、FireEye、Discord、Zillow、星巴克、康卡斯特和三星。
當您需要可伸縮性和高可用性時,Apache Cassandra 數據庫是一個不錯的選擇。 基於開源 Infinispan 數據存儲和管理平台的 Hazelcast 數據網格提供了一組用於存儲、管理和處理數據的強大功能。 多維數據是作為 InterSystems IRIS 的一部分使用一組 API 創建的,這些 API 允許對鍵值、關係、對象、文檔和其他事務性持久數據進行並發操作。 FairCom DB 是一個實時分析平台,能夠以可預測的方式實現大批量交易和並行大數據處理。 它是一種高級數據庫引擎,可提供連續控制,是所有數據庫引擎中總擁有成本 (TCO) 最低的。 Cache是由InterSystems創建的多模型(對象、關係、鍵值)數據庫管理系統和應用服務器。 使用 Ehcache 作為客戶端可以提高性能,減少數據庫工作負載,並通過使用基於開源標準的緩存來簡化可擴展性。
IBM Cloud Databases中的數據存儲是用於企業應用程序開發的免費開源軟件平台。 借助基於微服務平台構建的框架,它們支持無服務器應用程序。 Voldemort 不會嘗試滿足任意關係或滿足關係數據庫中的 ACID 屬性。 通過使用多播通信將集群定義為網格。 XAP 是 GigaSpaces 的內存數據網格,專為具有高性能、彈性和超低延遲的關鍵任務應用程序的極端事務和流處理而設計。 FoundationDB 可以在商用硬件上以低成本運行大量繁重的數據。 由於 Kyoto Tycoon 網絡服務器是輕量級的,因此它與 Kyoto Cabinet 鍵值數據庫和 Kyoto Tycoon 網絡服務器兼容。
最新的上游版本已經過改進,它們旨在一起使用並在實際生產條件下進行測試。 錯誤修復、次要新功能和一些 Linux 分發包更新是其中的一些改進。 現在可以將您經常使用的應用程序、文檔和其他數據存儲在速度更快的設備中。 它可以以與 RAM 或 SSD 相當的速度訪問它們。 您可以使用 Memcached 從計算機的某些部分獲取內存,這些部分您需要的內存超出了它們的處理能力。 開放標準和強大的 SQL 引擎相結合,創建了一個與眾不同的強大 NoSQL 框架。 Amadeus、American Express、Carrefour、Cisco、Comcast/Sky、Disney、eBay、LinkedIn、Marriott、Tesco、Tommy Hilfiger、United、Verizon 和其他數百家公司都在使用該平台。
Rocksdb 快嗎?
快速和低延遲存儲,例如閃存驅動器和高速磁盤,是 RocksDB 的理想選擇。 使用 RocksDB,您可以充分利用閃存和 RAM 的內存和讀/寫功能。
Badger 是在圖形數據庫中存儲數據的更快選擇
對於在圖形數據庫中存儲數據,Badger 庫是 RocksDB 的更快替代品。 因為 LSM 樹擁有如此多的鍵,所以更多的鍵不太可能導致壓縮。 此外,RocksDB 將用於讀取和寫入的數據存儲在內存中,緩衝傳入的讀取。
分佈式RocksDB
RocksDB 是一個用於鍵值數據的高性能嵌入式數據庫。 它是用 C++ 編寫的,提供了一個簡單但功能強大的 API。 RocksDB 以日誌結構格式存儲其數據,使其在磁盤空間和讀取性能方面都非常高效。 RocksDB 是需要低延遲和高吞吐量的應用程序的絕佳選擇。
稱為 chkrDB 的非結構化數據存儲旨在通過創建分佈式鍵值存儲 (KVS) 來利用基於雲的構造。 現代數據應用程序必須遵守某些規則才能在任何公共或私有云中運行。 雲就緒應用程序通常需要開源 API 標準、標準 iSCSI 存儲端點和容器工作負載,例如 Docker。 雲存儲和 Kubernetes 已經在計算和存儲方面提供了橫向擴展存儲、可用性和一致性。 傳統的分佈式 KVS 複製數據、執行活動工作負載、遷移數據並確保 HA 和彈性。 當我們使用高度可用的雲基礎架構時,我們可以輕鬆消除與復制、HA 和擴展到底層雲平台相關的一些複雜性。 大多數開源數據庫並不滿足上面列出的所有要求,包括低延遲和高吞吐量。
一個高性能的存儲系統需要一個非常輕量級的分佈式 KVS,它可以同時擴展到最大數量的文件。 我們決定使用 Cassandra 的分叉版本,我們已經使用了八年。 Nutanix 的自治範圍存儲 (AES) 是一種 AOS 磁盤本地元數據數據庫,在測試期間展示了可喜的性能結果。 儘管 RocksDB 能夠存儲大量數據,但它需要的內存相對較少。 因為我們可以將 RocksDB 嵌入到其他進程中,所以在延遲和吞吐量方面我們具有顯著優勢。 ChahalDB 憑藉其分佈式、雲原生設計、高可用特性和高性能特性,是 RocksDB 的優秀 KVS。 RocksDB Env 後端還使您能夠連接到任何其他存儲層。 本系列的第二部分將介紹 ChakrDB 分佈式 KVS 的架構,並回顧推理和理論如何發展成為現實。
RocksDB 與 Sqlite
SQLite 和 RocksDB 主要用於數據庫。 開發人員選擇 RocksDB 而不是 SQLite 的主要原因是它對用戶更友好,而輕量級被認為是一個關鍵因素。 RocksDB 是一個開源項目,GitHub 星數為 14.1K,GitHub 分支數為 3.09K。
RocksDB 和 SQLite 有什麼區別? 在服務器-客戶端關係(中央數據庫)方面,SQLite 可能是最差候選者中最差的,而 RocksDB 是服務器-客戶端關係(中央數據庫)。 Firebase 並不是什麼新鮮事,因為它是由企業而不是服務託管的應用程序。 雖然有一些負面影響,但好處是巨大的。 因此,您將需要創建服務器、客戶端應用程序和數據庫。 這可以是在 Node.js 上帶有基於 Express 的 REST API 的 Javascript,或者帶有用於數據庫存儲的內置 ObjectDB 數據庫的 Javalin。 初始成本可能從非常低到零不等。 儘管您需要學習 Firebase 的 API,但我認為 Firebase 是更好的選擇。
RocksDB Golang
RocksDB 是 Facebook 開發的鍵值數據庫。 它是用 C++ 編寫的,並且綁定了許多編程語言,包括 Go。
RocksDB 被設計成可擴展和高效的。 它可以用作獨立的數據庫或作為更大系統的一部分。 許多大公司都在使用 RocksDB,包括 Facebook、谷歌和微軟。
它是 levigo 包的一個分支,標識符更改為 rockdb,包名稱更改為 rocksdb。 批量使用批量讀取設備。 如果您在代碼中使用自定義比較器,則可能需要創建自己的過濾策略對象。 當程序不再需要緩存以防止內存洩漏時,激活它是至關重要的。 您現在可以通過打開數據庫來訪問它。 刪除後,與該鍵關聯的數據將從數據庫中刪除。 請在返回前複印一份信息。
CompactRange 在使用手動壓縮模式時對其鍵範圍進行手動壓縮。 GetApproximateSizes 為使用的每個鍵範圍計算文件系統的大小(以字節為單位)。 PropertyValue 作為其 property() 方法的結果返回數據庫屬性的值。 Put 寫入與數據庫鍵關聯的數據。 如果 nil []byte 作為值傳入,則返回零 []byte 的切片。 它是用於系統調用的數據庫調用環境。 當程序不再需要 Envs 時,需要調用 Close 來防止內存洩漏。
如果在 GetError 事件期間發生 LevelDB 錯誤,它將返回一個錯誤。 對於完全無效的迭代器,返回值將為 nil。 當 close 釋放給定的 Iterator 時,它會釋放底層的 C 結構。 當程序不再使用 Iterator 時,激活 Close 以防止內存洩漏至關重要。 打開數據庫時,SetCache 將緩存對象存儲在數據庫中。 使用 setCompression 時,由 SetCompression 指定的壓縮算法決定哪些塊可以被壓縮。 使用 SetFilterPolicy 時,Open 創建一個新數據庫,其中指定了過濾策略。
SetInfoLog 將 *Crocksdb_logger_t 對象指定為數據庫的內部記錄器。 SetFillCache 可用於確定使用此 ReadOptions 執行的讀取是否將填充服務器緩存。 創建快照時,SetSnapshot 提供的原因讀取與快照生成的原因讀取相同。 這種方式可以保證在大數據量的時候每次讀取都是一致的。 在以原子方式寫入之前,必須將 WriteBatch 批量放置和刪除操作存儲在數據庫中。 WriteBatch 在傳遞給 DB 後立即寫入。 如果程序不再需要 WriteBatch 對象,建議關閉它。
所有排隊的 Puts 和 Deletes 現在都被擦除。 當 Close 釋放 WriteOptions 時,底層 C 結構可以自由執行。 如果使用 Write Options 腳本執行,則 SetSync 確定在寫入被視為完成之前是否從操作系統緩衝區緩存中刷新每個 Write Options 寫入。
Rocksdb:面向用戶的應用程序的可嵌入鍵值存儲
使用 RocksDB 是應用程序將數據存儲在低延遲和快速訪問數據庫中的一種簡單方法。 它對於跟踪網站訪問者歷史記錄和網站狀態的面向用戶的應用程序非常有用。 此外,RocksDB 可用於需要快速訪問大型數據集的應用程序。
Rocksdb 的實現
RocksDB 的實現非常高效。 它使用日誌結構化合併樹(LSM 樹)來存儲數據。 這允許快速插入和刪除。 此外,RocksDB 壓縮數據以節省空間。
我們將在這篇博文中介紹 RocksDB 如何在 Rockset 中使用,以及如何對其進行調整以獲得最佳性能。 談到 Rockset,我們希望我們的用戶能夠在 10 毫秒內以亞秒級延遲查詢他們的數據,並連續攝取數據。 RocksDB 在 Facebook、LinkedIn、Uber 和許多其他公司的生產中使用。 RocksDB 以嵌入鍵的形式存儲鍵值數據。 在 1 個RocksDB 實例中,數據不會傳輸到其他機器。 它經久耐用,是與 RocksDB-Cloud 合作設計的。 機器故障導致 RocksDB 無法恢復。
導致RocksDB的write ahead log無法使用。 因為 RocksDB 是寫在內存中的,所以我們所有的寫操作都是一樣的結構。 具有在 WriteBatch 中批處理的單個更新數組的寫入批處理會導致 RocksDB 的寫入吞吐量更高; 並且寫入批處理中的單個鍵被分類為多個。 在將更新寫入 RocksDB 之前,我們將它們分成 100KB 大小的微批次並對其進行排序。 在 RocksDB 中,每個級別的目標大小都可以根據最後一個級別在該點的大小動態分配。 與 LSM 樹中的其他級別相比,來自 L0 和 L1 級別的數據非常有限。 在從 L0 到 L1 的壓縮過程中,必須訪問 L1 中的所有文件。 執行範圍掃描或檢索大量字段的查詢需要創建大量迭代器。 迭代器不允許在它們所在的空閒池中的查詢中重複使用。
數據云數據庫比較
有許多不同的雲數據庫可用,每種都有自己的優點和缺點。 在決定為您的企業使用哪種雲數據庫時,重要的是要比較和對比不同的選項,以便找到最適合您需求的選項。 Datamation 創建了一個雲數據庫比較圖表,可以幫助您評估不同的選項並做出明智的決定。
Couchbase企業
Couchbase Enterprise Edition 是 Couchbase Server 最全面、性能最高的版本。 它包括社區版的所有功能,並添加了主動-主動異地複制和跨數據中心複製 (XDCR) 等企業功能,以及增強的安全性和監控功能。 Couchbase 企業版有兩個訂閱級別:標準版和企業版。
Couchbase Server 是一種雲原生分佈式數據庫,結合了關係數據庫的優勢和 NoSQL 的強大功能。 此云服務可作為公共雲以及私有云和混合雲中的服務使用。 使用系統的內存優先架構以毫秒為單位測量延遲。 對於關鍵任務應用程序,Couchbase 平台重新定義了數據庫經濟學。 使用鍵值、查詢和搜索等多種方法,您可以創建跨多個平台運行的引人入勝的應用程序。 SQL、模式、事務和用戶定義的函數只是一些熟悉的結構。 此外,Couchbase 支持可用於將存儲桶、範圍、集合和文檔映射到 RDBMS 的動態模式結構。
N1QL 是一種聲明性語言,使應用程序開發人員能夠以富有表現力、強大和完整的方式查詢、轉換和操作數據。 在擴展您的業務時,多層數據中心提供了兩全其美的優勢:它允許您通過利用計算、存儲和處理工作負載分區來滿足您在單一平台中要求最苛刻的工作負載。 您可以輕鬆地跨數據中心複製數據以滿足您的業務需求,無論是高可用性、災難恢復還是靈活的全球複製。 提供內置審計功能以及基於角色的訪問控制和加密通信。 您的數據在線上和雲端都是安全的。
Couchbase:流行的 Nosql 數據庫
Couchbase 等 NoSQL 數據庫是各種 Web、移動和物聯網 (IoT) 應用程序的絕佳選擇。 作為基於雲的解決方案的領先供應商,Couchbase 在五個國家設有辦事處,為超過 2,000 名客戶提供服務,其中包括阿聯酋航空、Tommy Hilfiger、SyncThink、LinkedIn 和萬豪酒店。