[轉帖].NET的集羣Redis實現版本: Garnet – 一種開源、下一代、更快的緩存存儲,用於加速應用程序和服務

https://zhuanlan.zhihu.com/p/687828165

 

先來一個隱喻,讓大家好理解。

你就想象成一個集羣版的Redis,不過是.NET寫的且開源。
任何一個redis client都可以連接他。

先來一段啓動代碼:

NuGet

在  上查找版本。The NuGet 包含 Garnet 作爲庫,供您在應用程序中自託管。這可以基於我們的 GarnetServer 此處提供應用程序代碼。 最小示例如下所示:

using Garnet;

try
{
    using var server = new GarnetServer(args);
    server.Start();
    Thread.Sleep(Timeout.Infinite);
}
catch (Exception ex)
{
    Console.WriteLine($"Unable to initialize server due to exception: {ex.Message}");
}

docker

我們在 GitHub 上提供了非常基本的 Dockerfile,因此您可以自己託管它們。我們將不勝感激 以幫助使我們的 Docker 支持更加全面。官方 Docker 版本是我們未來的關注對象。

正文:

代碼倉庫:microsoft/garnet:Garnet 是 Microsoft Research 提供的遠程緩存存儲,可提供強大的性能(吞吐量和延遲)、可伸縮性、存儲、恢復、羣集分片、密鑰遷移和複製功能。Garnet 可以與現有的 Redis 客戶端配合使用。 (github.com)

 

Garnet 是 Microsoft Research 推出的一款新的遠程緩存存儲,它提供了幾個獨特的優勢:

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

此存儲庫包含用於構建和運行 Garnet 的代碼。有關更多信息和文檔,請查看我們的網站 .

功能摘要

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

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

 

性能預覽

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

設計亮點

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

 

 

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

Garnet 的存儲設計由兩個沙弗萊石鍵值存儲組成,它們的命運由統一的操作日誌綁定。第一個存儲區稱爲“主存儲區”,針對原始字符串操作進行了優化,並仔細管理內存,以 避免垃圾回收。第二個(可選)“對象存儲”針對複雜對象和自定義數據類型進行了優化,包括常用類型,如 Sorted Set、Set、Hash、List 和 Geo。 對象存儲中的數據類型 利用 .NET 庫生態系統實現其當前實現。它們存儲在內存的堆中(這使得更新非常有效),並以序列化形式存儲在磁盤上。未來,我們計劃使用 統一索引和日誌,便於維護。

Garnet 設計的一個顯着特點是其窄腰沙弗萊石存儲 API,用於在頂部實現大、豐富且可擴展的 RESP API 表面。此 API 由 read、upsert、delete 和 atomic 組成 讀-修改-寫操作,通過異步回調實現,Garnet 在每次操作期間的不同點插入邏輯。我們的存儲 API 模型允許我們完全分離 Garnet 的解析和查詢 處理存儲詳細信息(如併發、存儲分層和檢查點)的問題。Garnet 使用兩階段鎖定進行多密鑰交易。

集羣模式

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

 

以下文章來自ms research Introducing Garnet – an open-source, next-generation, faster cache-store for accelerating applications and services - Microsoft Research

隆重推出 Garnet – 一種開源、下一代、更快的緩存存儲,用於加速應用程序和服務
已發表 2024 年 3 月 18 日
作者: Badrish Chandramouli , 合夥人研究經理
分享此頁

 

 

近十年來,Microsoft的研究人員一直在努力解決對數據存儲機制日益增長的需求,以支持交互式Web應用程序和服務的快速發展。我們名爲Garnet的新緩存存儲系統與傳統緩存存儲相比具有多項優勢,已部署在Microsoft的多個用例中,例如Windows和Web體驗平臺,Azure Resource Manager和Azure Resource Graph中的用例,現在可以在以下位置作爲開源下載https://github.com/microsoft/garnet(在新選項卡中打開).在開源 Garnet 中,我們希望使開發人員社區能夠從其性能提升和功能中受益,在我們的工作基礎上再接再厲,並通過添加新的 API 調用和功能來擴展 Garnet 生態系統。我們也希望開源能夠鼓勵後續的學術研究,並在這個重要的研究領域開闢未來的合作機會。
緩存存儲問題
雲計算和邊緣計算的發展帶來了越來越多的應用程序和服務,這些應用程序和服務需要以比以往更高的效率、更低的延遲和更低的成本訪問、更新和轉換數據。這些應用程序和服務通常需要在存儲交互方面投入大量運營支出,使其成爲當今最昂貴和最具挑戰性的平臺領域之一。緩存存儲軟件層部署爲單獨可擴展的遠程進程,可以降低這些成本並提高應用程序性能。這推動了緩存存儲行業的發展,包括許多開源系統,如 Redis、Memcached、KeyDB 和 Dragonfly。
與支持簡單獲取/設置接口的傳統遠程緩存存儲不同,現代緩存提供了豐富的 API 和功能集。它們支持原始字符串、分析數據結構(如 Hyperloglog)和複雜數據類型(如排序集和哈希)。它們允許用戶檢查點和恢復緩存、創建數據分片、維護複製副本,並支持事務和自定義擴展。

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