近日,微軟正式開源緩存存儲(chǔ)系統(tǒng) Garnet。據(jù)微軟研究院數(shù)據(jù)庫小組高級(jí)首席研究員 Badrish Chandramouli 介紹,Garnet 項(xiàng)目是從零開始構(gòu)建而成,且以性能為核心考量(特別是吞吐量中的線程可擴(kuò)展性與更高比例的低延遲水平)。
具體來說,Garnet 具有以下幾大優(yōu)勢(shì):
-
Garnet 采用流行的 RESP 線路協(xié)議作為起點(diǎn),因此大多數(shù)用戶可以不作任何修改、就直接通過大多數(shù)編程語言編寫的 Redis 客戶端直接接入 Garnet。
-
Garnet 通過多條客戶端連接與小批量形式提供更好的可擴(kuò)展性與吞吐量,幫助大型應(yīng)用程序和服務(wù)節(jié)約運(yùn)行成本。
-
Garnet 在第 99 及第 99.9 百分位上表現(xiàn)出更好的客戶端延遲水平,更高比例的穩(wěn)定性表現(xiàn)對(duì)于現(xiàn)實(shí)場(chǎng)景而言至關(guān)重要。
-
Garnet 基于最新.NET 技術(shù),具有跨平臺(tái)、可擴(kuò)展和現(xiàn)代化等特點(diǎn)。它在設(shè)計(jì)上易于開發(fā)與調(diào)整,且不致犧牲常見場(chǎng)景下的性能水平。通過利用.NET 豐富的庫生態(tài)來擴(kuò)展其 API,并提供開放的優(yōu)化機(jī)會(huì)。憑借對(duì).NET 的充分發(fā)掘,Garnet 在 Linux 和 Windows 平臺(tái)上均表現(xiàn)出頂尖性能。
據(jù)了解,微軟研究院自 2016 年以來一直在研究現(xiàn)代鍵 - 值數(shù)據(jù)庫架構(gòu)。2018 年,微軟將一套嵌入式鍵 - 值庫 FASTER 開源之后,其性能超出原有系統(tǒng)幾個(gè)數(shù)量級(jí),同時(shí)專注于簡(jiǎn)單的單節(jié)點(diǎn)進(jìn)程內(nèi)鍵 - 值模型。
從 2021 年開始,根據(jù)實(shí)際用例的需求,微軟開始構(gòu)建一套新的遠(yuǎn)程緩存存儲(chǔ)方案。其中包含一切必要功能,以作為現(xiàn)有緩存存儲(chǔ)的可行替代選項(xiàng)。當(dāng)時(shí)微軟面臨的挑戰(zhàn)包括保持 / 增強(qiáng)其在早期工作中已經(jīng)取得的性能優(yōu)勢(shì),同時(shí)考慮如何更好地適應(yīng)更加現(xiàn)實(shí)的普遍網(wǎng)絡(luò)環(huán)境。這項(xiàng)工作的成果就是 Garnet。
在被問及 Garnet 適合部署在哪些場(chǎng)景下時(shí),Chandramouli 表示任何“使用 Redis、KeyDB 或者 Dragonfly 作為緩存存儲(chǔ)方案的現(xiàn)有應(yīng)用程序都適合,Garnet 能提供更高的吞吐量、更低延遲、通過減少需要托管的緩存存儲(chǔ)分片來降低成本,還可將數(shù)據(jù)溢出至本地磁盤或 SSD 以緩存超過內(nèi)存大小的數(shù)據(jù)。此外,Garnet 也適合各種希望借極高性能緩存層提高性能、降低后端存儲(chǔ)服務(wù)器或數(shù)據(jù)庫成本的新型應(yīng)用程序?!?/p>
API 功能方面,Garnet 支持廣泛的 API,包括原始字符串、分析與對(duì)象操作。它還提供分片、復(fù)制及動(dòng)態(tài)密鑰遷移等功能的集群模式。Gartner 支持客戶端 RESP 事務(wù)及用 C# 編寫的服務(wù)器端存儲(chǔ)過程,還允許用戶在原始字符串及新對(duì)象類型之上設(shè)置自定義操作。所有這些均可簡(jiǎn)單使用 C# 編寫,因此自定義擴(kuò)展的開發(fā)門檻更低。
網(wǎng)絡(luò)、存儲(chǔ)、集群功能方面,Garnet 使用快速且可插拔的網(wǎng)絡(luò)層,且支持后續(xù)擴(kuò)展,例如配合內(nèi)核旁路堆棧。它支持傳輸層安全(TLS)通信協(xié)議和各種基本訪問控制。Garnet 的存儲(chǔ)層被稱為 Tsavorite,是從 OSS FASTER 中分叉而成,可提供一系列強(qiáng)大的數(shù)據(jù)庫功能,例如線程可擴(kuò)展性、分層存儲(chǔ)支持(內(nèi)存、SSD 和云存儲(chǔ)等)、快速非阻塞檢查點(diǎn)、恢復(fù)、持久操作日志記錄、多鍵事務(wù)支持,以及更好的內(nèi)在管理與重用功能等。此外,Garnet 還支持集群操作模式。
除了單節(jié)點(diǎn)執(zhí)行之外,Garnet 還支持集群模式,允許用戶創(chuàng)建并管理分片和復(fù)制部署。Garnet 還支持高效、動(dòng)態(tài)的鍵遷移方案,借此重新均衡各個(gè)分片。用戶可以使用標(biāo)準(zhǔn)的 Redis 集群命令來創(chuàng)建并管理 Garnet 集群,各節(jié)點(diǎn)則執(zhí)行 gossip 以共享并演進(jìn)集群狀態(tài)??偟膩碚f,Garnet 的集群模式是一項(xiàng)龐大且仍在發(fā)展的功能,微軟表示,更多細(xì)節(jié)將在后續(xù)文章中與大家分享。
Chandramouli 在回復(fù) The Stack 的郵件中補(bǔ)充道,“我們也期待大家能將 Garnet 在各類其他現(xiàn)實(shí)應(yīng)用中的表現(xiàn)反饋回來。此外,我們還擁有一套基于 C# 的強(qiáng)大存儲(chǔ)過程模型,用戶可以借此對(duì)關(guān)注的事務(wù)進(jìn)行自定義。最后,我們將 Garnet 視為面向未來的重要?jiǎng)?chuàng)新工具,包括優(yōu)化磁盤 IO、內(nèi)核旁路網(wǎng)絡(luò)以及向量數(shù)據(jù)庫等應(yīng)用場(chǎng)景?!?/p>
Garnet 有什么亮點(diǎn)?
云和邊緣計(jì)算的快速增長(zhǎng)讓相關(guān)應(yīng)用程序和服務(wù)在數(shù)據(jù)和覆蓋范圍上均有顯著提升。但與此同時(shí),它們也在數(shù)據(jù)訪問、更新與轉(zhuǎn)換層面提出了效率更高、延遲更低、成本更廉的實(shí)際要求。這些應(yīng)用程序與服務(wù)往往需要在存儲(chǔ)交互方面投入大量運(yùn)營支出,這也使其成為當(dāng)今最昂貴、最具挑戰(zhàn)性的平臺(tái)領(lǐng)域之一。以單獨(dú)可擴(kuò)展的遠(yuǎn)程進(jìn)程形式存在的緩存存儲(chǔ)軟件層,能夠有效降低這些成本并提高應(yīng)用程序性能。這也推動(dòng)了緩存存儲(chǔ)行業(yè)的發(fā)展,包括許多大家耳熟能詳?shù)拈_源系統(tǒng),例如 Redis、Memcached、KeyDB 以及 Dragonfly。
與僅支持簡(jiǎn)單獲取 / 設(shè)置接口的傳統(tǒng)遠(yuǎn)程緩存存儲(chǔ)不同,現(xiàn)代緩存需要提供豐富的 API 與功能集。它們支持原始字符串、Hyperloglog 等分析數(shù)據(jù)結(jié)構(gòu),以及排序集和哈希等復(fù)雜數(shù)據(jù)類型。它們還須允許用戶為緩存設(shè)置檢查點(diǎn)和恢復(fù)功能、創(chuàng)建數(shù)據(jù)分片、維護(hù)復(fù)制副本并支持事務(wù)與自定義擴(kuò)展。
然而,現(xiàn)有系統(tǒng)在保持系統(tǒng)設(shè)計(jì)簡(jiǎn)單性的同時(shí),往往難以滿足如此豐富的功能需求,包括導(dǎo)致其無法充分利用最新硬件功能(例如多核心、分層存儲(chǔ)、快速網(wǎng)絡(luò))。此外,其中許多系統(tǒng)在設(shè)計(jì)之初,也沒有考慮到可由應(yīng)用程序開發(fā)者輕松擴(kuò)展、或者在不同平臺(tái) / 操作系統(tǒng)上良好運(yùn)行等現(xiàn)實(shí)需求。
根據(jù)介紹,Garnet 在設(shè)計(jì)上重新考量了整個(gè)緩存存儲(chǔ)堆?!獜木W(wǎng)絡(luò)處獲取數(shù)據(jù)包、到解析和處理數(shù)據(jù)庫操作、再到執(zhí)行存儲(chǔ)交互。
下圖為 Garnet 的整體架構(gòu),可以看到,Garnet 的網(wǎng)絡(luò)層繼承了微軟受 ShadowFax 研究啟發(fā)所建立的共享內(nèi)存設(shè)計(jì)。TLS 處理與存儲(chǔ)交互在 IO 完成線程上執(zhí)行,這就避免了常見的線程切換開銷。這種方法能夠借 CPU 緩存一致性將數(shù)據(jù)傳輸至網(wǎng)絡(luò),而非基于需要在服務(wù)器上移動(dòng)數(shù)據(jù)的傳統(tǒng) shuffle 設(shè)計(jì)。
Garnet 的存儲(chǔ)設(shè)計(jì)由兩套 Tsavorite 鍵 - 值存儲(chǔ)組成,二者與統(tǒng)一的操作日志進(jìn)行綁定。前一套存儲(chǔ)被稱為“主存儲(chǔ)”,針對(duì)原始字符串操作進(jìn)行了優(yōu)化,負(fù)責(zé)管理內(nèi)存以避免垃圾收集。第二套則為可選的“對(duì)象存儲(chǔ)”,主要針對(duì)復(fù)雜對(duì)象及自定義數(shù)據(jù)類型進(jìn)行優(yōu)化,具體涵蓋排序集、集、哈希、列表和地理空間等流行數(shù)據(jù)類型。它們被存儲(chǔ)在內(nèi)存堆上(以保證更新更加高效),并以序列化形式存放在磁盤內(nèi)。未來,微軟還將研究如何通過統(tǒng)一的索引與日志簡(jiǎn)化 Garnet 的系統(tǒng)維護(hù)。
Garnet 設(shè)計(jì)中的一大顯著特點(diǎn),就是采用了 Tsavorite 存儲(chǔ) API。該 AIP 用于提供更大、更豐富且可擴(kuò)展的 RESP API 表面,能夠執(zhí)行讀取、更新插入、刪除以及原子讀取 - 修改 - 寫入等操作,且全部通過 Garnet 的異步回調(diào)實(shí)現(xiàn)以便在每項(xiàng)操作期間的多個(gè)點(diǎn)上插入邏輯。存儲(chǔ) API 模型還確保 Garnet 能夠?qū)?duì)問題的解析與查詢處理,同并發(fā)、存儲(chǔ)分層和檢查點(diǎn)等其他存儲(chǔ)功能徹底分開。
此外,Garnet 還進(jìn)一步增加了對(duì)基于雙階段鎖定的多鍵事務(wù)的支持。用戶可以使用 RESP 客戶端事務(wù)(MULTI-EXEC)或使用 C# 中的服務(wù)器端事務(wù)存儲(chǔ)過程。
性能表現(xiàn)
微軟研究團(tuán)隊(duì)通過展示比較了 Gartner 與其他領(lǐng)先開源緩存存儲(chǔ)方案間的關(guān)鍵性能指標(biāo)。
首先,團(tuán)隊(duì)預(yù)先配置了兩套運(yùn)行 Linux 系統(tǒng)(Ubuntu 20.04)的 Azure 標(biāo)準(zhǔn) F72s v2 虛擬機(jī)(每虛擬機(jī) 72 上 vCPU 加 144 GiB 內(nèi)存),且啟用了加速 TCP。其中一套虛擬機(jī)運(yùn)行各種緩存存儲(chǔ)服務(wù)器,另一套則專門發(fā)布工作負(fù)載。這里微軟使用自己的基準(zhǔn)測(cè)試工具 Resp.benchmark,統(tǒng)一由它給出性能測(cè)試結(jié)果。
微軟將 Garnet 與最新開源版本的 Redis(v7.2)、KeyDB(v6.3.4)以及 Dragonfly(v6.2.11)進(jìn)行了比較。在實(shí)驗(yàn)中,微軟使用了均勻隨機(jī)分布的鍵(Garnet 的共享內(nèi)存設(shè)計(jì)對(duì)于非隨機(jī)分布的鍵具有更好的性能優(yōu)化效果)。在這些實(shí)驗(yàn)中,數(shù)據(jù)會(huì)被預(yù)先加載至每臺(tái)服務(wù)器上,再嵌入內(nèi)存中。
實(shí)驗(yàn)一:不同數(shù)量客戶端會(huì)話的吞吐量比較
從大指 GET 操作(每批 4096 條請(qǐng)求)加低負(fù)載(8 字節(jié)鍵與值)起步,嘗試最大限度減少網(wǎng)絡(luò)開銷,并逐步增加客戶端會(huì)話數(shù)量以比較系統(tǒng)性能。從下圖中可以看到,Garnet 表現(xiàn)出的可擴(kuò)展性超越了 Redis 與 KeyDB,同時(shí)實(shí)現(xiàn)了比所有三大基線系統(tǒng)更高的吞吐量(y 軸取對(duì)數(shù)坐標(biāo))。請(qǐng)注意,雖然 Dragonfly 的擴(kuò)展性能與 Garnet 類似,但前者屬于純內(nèi)存內(nèi)系統(tǒng)。此外,當(dāng)數(shù)據(jù)庫大?。搭A(yù)加載的鍵數(shù)量)明顯超過處理器的緩存大小時(shí)(2.56 億個(gè)鍵),Garnet 相較于其他系統(tǒng)仍擁有強(qiáng)勁的吞吐量表現(xiàn)。
數(shù)據(jù)庫大小為(a)1024 個(gè)鍵及(b)2.56 億個(gè)鍵時(shí),不同數(shù)量客戶端會(huì)話對(duì)應(yīng)的吞吐量(對(duì)數(shù)坐標(biāo))。
實(shí)驗(yàn)二:不同批量大小的吞吐量比較
接下來,使用 GET 操作加固定數(shù)量(64)的客戶端會(huì)話來改變批量大小。跟之前的實(shí)驗(yàn)一樣,繼續(xù)嘗試兩種不同的數(shù)據(jù)庫大小。如下圖所示,即使不采用分批處理,Garnet 的性能同樣表現(xiàn)更好;而在采用分批處理后,即使批量規(guī)模很小,Garnet 的性能優(yōu)勢(shì)也在增強(qiáng)。負(fù)載大小與實(shí)驗(yàn)一相同,且 y 軸同樣取對(duì)數(shù)坐標(biāo)。
數(shù)據(jù)庫大小為(a)1024 個(gè)鍵及(b)2.56 億個(gè)鍵時(shí),不同批量大小下的吞吐量比較(取對(duì)數(shù)坐標(biāo))。
實(shí)驗(yàn)三:不同數(shù)量實(shí)施意見會(huì)話的延遲比較
接下來測(cè)試的是各種系統(tǒng)的客戶端延遲。如下圖所示,隨著客戶端會(huì)話數(shù)量增加,與其他系統(tǒng)相比,Garnet 在各個(gè)百分位上的延遲(以微秒為單位)均更低也更加穩(wěn)定。實(shí)驗(yàn)中,以 GET 操作占 80%、SET 操作占 20% 的混合比例發(fā)送操作,且不做分批處理。
不同客戶端會(huì)話數(shù)量時(shí),(a)中位數(shù)、(b)第 99 百分位與(c)第 99.9 百分位處的延遲水平。
實(shí)驗(yàn)四:不同批量大小的延遲比較
Garnet 的延遲水平針對(duì)自適應(yīng)客戶端的批量與查詢系統(tǒng)進(jìn)行了優(yōu)化。微軟將批量大小從 1 增加到 64,并在下圖中整理出具有 128 個(gè)活動(dòng)客戶端連接時(shí)不同百分位上的延遲水平。從下圖中可以看到,Gartner 的延遲整體較低。與之前的實(shí)驗(yàn)一樣,同樣采用 GET 操作占 80%、SET 操作占 20% 的混合比例。
不同批量大小下,(a)中位數(shù)、(b)第 99 百分位以及(c)第 99.9 百分位上的延遲水平。
開發(fā)者:Redis 需要進(jìn)行重大性能優(yōu)化了!
從基準(zhǔn)性能圖表來看,GET 命令的吞吐量超過了 Dragonfly 十倍以上。雖然第 50 百分位的延遲水平略高于 Dragonfly,但第 99 百分位上的延遲卻比 Dragonfly 更低。Garnet 和 Dragonfly 在吞吐量和延遲上的表現(xiàn)均遠(yuǎn)遠(yuǎn)優(yōu)于 Redis,不少開發(fā)者認(rèn)為,這表明 Redis 可能需要進(jìn)行重大性能優(yōu)化。
開發(fā)者 hipadev23 表示,“Garnet 確實(shí)是首個(gè)在低并發(fā)與高并發(fā)水平上均優(yōu)于 Redis 的替代方案,這是一項(xiàng)很了不起的成就?!薄癛edis 可能需要進(jìn)行重大性能優(yōu)化?!?/p>
開發(fā)者 mtmk 認(rèn)為,對(duì)于需要直接在微軟 Windows Server 上運(yùn)行 Redis(或者兼容),但又不想依賴于 WSL2 的朋友們來說,Garnet 的出現(xiàn)肯定是個(gè)好消息。以往由 Redis 端口(現(xiàn)處于歸檔狀態(tài))造成的內(nèi)存使用問題(主要是由于內(nèi)存映射文件 AFAIK)將不復(fù)存在。
也有不少開發(fā)者仍舊堅(jiān)定地選擇 Redis。Redis 在某些方面對(duì)開發(fā)者更友好,而且運(yùn)行時(shí)間更長(zhǎng)更穩(wěn)定。對(duì)于 Garnet,大家在許可協(xié)議、產(chǎn)品定價(jià)、更新維護(hù)等方面普遍較為擔(dān)心。throwaway38375 表示,“Redis 在許可協(xié)議或者產(chǎn)品定價(jià)方面應(yīng)該會(huì)更穩(wěn)定,而且它畢竟經(jīng)歷了數(shù)十億小時(shí)的生產(chǎn)運(yùn)行考驗(yàn)。Redis 也更容易安裝和理解。”Someone 認(rèn)為,“對(duì)于這樣一個(gè)微軟研究院推出的項(xiàng)目,我最擔(dān)心的不是許可協(xié)議和產(chǎn)品定價(jià),而是缺乏更新(功能、維護(hù)甚至是安全更新)”。
By the way:Garnet 是用 C# 開發(fā)的
在社區(qū)討論中,不少開發(fā)者驚訝于 Garnet 項(xiàng)目居然是用 C# 開發(fā)的。
開發(fā)者 west0n 表示:“最讓我驚訝的是,Garnet 項(xiàng)目居然是用 C# 開發(fā)的,而 Dragonfly 是用 C++ 開發(fā)的,Redis 則是用 C 開發(fā)的?!遍_發(fā)者 whimsicalism 更是直言“太意外了,垃圾收集語言 C# 編寫的 Garnet 居然擊敗了 Redis 和 Dragonfly?!?/p>
也有開發(fā)者對(duì)此給出的評(píng)價(jià)較為中肯,pjmlp 認(rèn)為“垃圾收集語言跟垃圾收集語言可不一樣,像 C# 和.NET 這些語言其實(shí)提供了跟 C++ 相當(dāng)?shù)乃行阅苷{(diào)優(yōu)選項(xiàng)?!彼硎荆蠹以撟龅氖钦J(rèn)真學(xué)習(xí),而不是把所有垃圾收集語言都?xì)w為一類,再一棒子打死。
此外,更具體地講,MSIL 和.NET 在設(shè)計(jì)上也能支持 C++,而 C# 和 F# 等語言也有辦法訪問這些功能。即使某些功能未在語言語法層面公開,開發(fā)者也可以直接使用 C++/CLI 生成的 MSIL。
對(duì)此,你怎么看呢?歡迎在評(píng)論區(qū)留下你的觀點(diǎn)。
參考鏈接:
https://www.microsoft.com/en-us/research/blog/introducing-garnet-an-open-source-next-generation-faster-cache-store-for-accelerating-applications-and-services/
https://www.thestack.technology/microsoft-takes-on-redis-with-new-open-source-garnet-cache-store/
https://news.ycombinator.com/item?id=39752504
one more thing
程序員的煩惱
- 為激活編程軟件到處找激活碼(JetBrains 全家通)
- 苦于JetBrains 正版授權(quán)太貴而放棄
- 學(xué)習(xí)資料貴且不成體系而躺平
關(guān)注公眾號(hào)金榜探云手
你可以獲得什么?
- JetBrains 最新激活碼,永久更新(只供娛樂,切勿商用)
- JetBrains 正版授權(quán),99%收費(fèi)插件免費(fèi)試用,一年一杯咖啡錢
- IT 技術(shù)視頻共享(國內(nèi)外全系列,只對(duì)粉絲開放)
JetBrains 全家桶包含哪些軟件?詳情進(jìn)入
jetbrains 31款軟件
一、語言IDLE(7款)
1、IntelliJ IDEA: Java編輯器+集成環(huán)境
·包含 Ultimate(付費(fèi)專業(yè)版)和 Community(社區(qū)免費(fèi)版)兩個(gè)版本。
2、PyCharm:Python編輯器+集成環(huán)境
·包含 Professional(付費(fèi)專業(yè)版)和 Community(社區(qū)免費(fèi)版)兩個(gè)版本。
3、CLion:C/C++編輯器+集成環(huán)境
4、WebStorm:JavaScript、HTML編輯器+集成環(huán)境
5、PhpStrom:php編輯器+集成環(huán)境
6、Goland:Go編輯器+集成環(huán)境文章來源:http://www.zghlxwxcb.cn/news/detail-843190.html
7、RubyMine:Ruby編輯器+集成環(huán)境文章來源地址http://www.zghlxwxcb.cn/news/detail-843190.html
到了這里,關(guān)于向Redis宣戰(zhàn)?微軟開源Garnet,性能提升幾十倍!的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!