Garnet發佈 Redis不再是唯一選擇

Garnet 是 Microsoft Research 的遠程緩存存儲,提供強大的性能(吞吐量和延遲)、可擴展性、存儲、恢復、集羣分片、密鑰遷移和複製功能。

Garnet 可以與現有的 Redis 客戶端配合使用。

Garnet 是 Microsoft Research 推出的一種新型遠程緩存存儲,具有多種獨特優勢:

  • Garnet 採用流行的 RESP 線路協議作爲起點,這使得可以從當今大多數編程語言(例如 C# 中的 StackExchange.Redis)中可用的未經修改的 Redis 客戶端使用 Garnet。
  • 相對於同類開源緩存存儲,Garnet 通過許多客戶端連接和小批量提供更好的吞吐量和可擴展性,從而節省大型應用程序和服務的成本。
  • Garnet 使用啓用了加速 TCP 的商品雲 (Azure) VM 展示了極低的客戶端延遲(在 99.9% 時通常低於 300 微秒),這對於現實場景至關重要。
  • Garnet 基於最新的 .NET 技術,具有跨平臺、可擴展和現代化的特點。它被設計爲易於開發和發展,而不會犧牲常見情況下的性能。我們利用 .NET 豐富的庫生態系統來擴展 API,並提供開放的優化機會。由於我們對 .NET 的精心使用,Garnet 在 Linux 和 Windows 上都實現了最先進的性能。

該存儲庫包含構建和運行 Garnet 的代碼。有關更多信息和文檔,請訪問網站:https://microsoft.github.io/garnet。

 

特性總結

Garnet 實現了廣泛的 API,包括原始字符串(例如,獲取、設置和密鑰過期)、分析(例如,HyperLogLog 和 Bitmap)和對象(例如,排序集和列表)操作。它可以以客戶端 RESP 事務和我們自己的 C# 服務器端存儲過程的形式處理多密鑰事務,並允許用戶在原始字符串和新對象類型上定義自定義操作,所有這些都以 C# 的便利性和安全性實現,導致開發自定義擴展的門檻較低。

Garnet 使用快速且可插拔的網絡層,支持未來的擴展,例如利用內核旁路堆棧。它使用強大的 .NET SslStream 庫支持安全傳輸層安全 (TLS) 通信以及基本訪問控制。 Garnet 的存儲層稱爲 Tsavorite,是從我們之前的開源項目 FASTER 中分叉出來的,包括強大的數據庫功能,例如線程可擴展性、分層存儲支持(內存、SSD 和雲存儲)、快速非阻塞檢查點、恢復、操作日誌記錄以實現持久性、多鍵事務支持以及更好的內存管理和重用。最後,Garnet 支持集羣操作模式,支持分片、複製和動態密鑰遷移。

 

 性能預覽

我們在網站上展示了一些關鍵結果,將 Garnet 與領先的開源緩存存儲進行比較。

 

 設計亮點

Garnet 的設計重新思考了整個緩存存儲堆棧——從網絡上接收數據包,到解析和處理數據庫操作,再到執行存儲交互。我們建立在我們之前多年研究的基礎上。下面是Garnet的整體架構。

 

Garnet 的網絡層繼承了受我們之前對 ShadowFax 研究啓發的共享內存設計。 TLS 處理和存儲交互在 IO 完成線程上執行,避免了常見情況下的線程切換開銷。這種方法允許 CPU 緩存一致性將數據傳輸到網絡,而不是傳統的基於隨機播放的設計,後者需要在服務器上移動數據。

Garnet的存儲設計由兩個Tsavorite鍵值存儲組成,它們的命運由統一的操作日誌綁定。第一個存儲稱爲“主存儲”,針對原始字符串操作進行了優化,並仔細管理內存以避免垃圾收集。第二個也是可選的“對象存儲”針對複雜對象和自定義數據類型進行了優化,包括排序集、集合、哈希、列表和地理等流行類型。對象存儲中的數據類型利用 .NET 庫生態系統來實現其當前的實現。它們存儲在內存中的堆上(這使得更新非常高效)並以序列化形式存儲在磁盤上。未來,我們計劃研究使用統一的索引和日誌來簡化維護。

Garnet 設計的一個顯着特點是其窄腰 Tsavorite 存儲 API,用於在頂部實現大型、豐富且可擴展的 RESP API 表面。該 API 包含讀取、更新插入、刪除和原子讀取-修改-寫入操作,通過 Garnet 的異步回調實現,以便在每個操作期間的各個點插入邏輯。存儲 API 模型使我們能夠將 Garnet 的解析和查詢處理問題與併發、存儲分層和檢查點等存儲細節完全分開。 Garnet 對多密鑰交易使用兩階段鎖定。

 集羣模式

除了單節點執行之外,Garnet還支持集羣模式,允許用戶創建和管理分片和複製部署。 Garnet 還支持高效、動態的密鑰遷移方案來重新平衡分片。用戶可以使用標準的Redis集羣命令來創建和管理Garnet集羣,節點執行gossip來共享和演化集羣狀態。集羣工作仍在進行中。

License

該項目已獲得 MIT 許可證的許可,請參閱許可證文件。

 隱私

隱私信息可在 https://privacy.microsoft.com/en-us/ 找到。

 貢獻

該項目歡迎貢獻和建議。大多數貢獻都要求您同意貢獻者許可協議 (CLA),聲明您有權並且實際上授予我們使用您的貢獻的權利。有關詳細信息,請訪問 https://cla.opensource.microsoft.com。

當您提交拉取請求時,CLA 機器人將自動確定您是否需要提供 CLA 並適當地修飾 PR(例如狀態檢查、評論)。只需按照機器人提供的說明進行操作即可。您只需使用我們的 CLA 在所有存儲庫中執行一次此操作。

該項目採用了微軟開源行爲準則。有關詳細信息,請參閱行爲準則常見問題解答或聯繫 [email protected] 提出任何其他問題或意見。

 商標

該項目可能包含項目、產品或服務的商標或徽標。 Microsoft 商標或徽標的授權使用須遵守且必須遵循 Microsoft 的商標和品牌指南。在此項目的修改版本中使用 Microsoft 商標或徽標不得引起混淆或暗示 Microsoft 贊助。對第三方商標或徽標的任何使用均須遵守這些第三方的政策。

Redis 是 Redis Ltd 的註冊商標。其中的任何權利均歸 Redis Ltd 保留。Microsoft 的任何使用僅供參考,並不表明 Redis 與 Microsoft 之間有任何贊助、認可或從屬關係。

 

github地址: https://github.com/microsoft/garnet

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章