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 在所有儲存庫中執行一次此操作。
該專案採用了微軟開源行為準則。有關詳細資訊,請參閱行為準則常見問題解答或聯絡 opencode@microsoft.com 提出任何其他問題或意見。
商標
該專案可能包含專案、產品或服務的商標或徽標。 Microsoft 商標或徽標的授權使用須遵守且必須遵循 Microsoft 的商標和品牌指南。在此專案的修改版本中使用 Microsoft 商標或徽標不得引起混淆或暗示 Microsoft 贊助。對第三方商標或徽標的任何使用均須遵守這些第三方的政策。
Redis 是 Redis Ltd 的註冊商標。其中的任何權利均歸 Redis Ltd 保留。Microsoft 的任何使用僅供參考,並不表明 Redis 與 Microsoft 之間有任何贊助、認可或從屬關係。
github地址: https://github.com/microsoft/garnet