分解式存儲的詳細指南
譯文【51CTO.com快譯】近年來,各大主流云計算平臺都已經(jīng)廣泛地采用了基礎(chǔ)設(shè)施分解(Infrastructure disaggregation)的方式,讓云服務(wù)能夠提供完全獨立于現(xiàn)有計算實例(compute instances)的存儲系統(tǒng)??梢哉f,通過將數(shù)據(jù)中心資源里的內(nèi)存、計算力、以及存儲進行解耦,它能夠讓每個資源都具有獨立擴展和配置的能力。據(jù)此,云端租戶不但可以更加有效地使用計算資源,而且能夠達到可擴展性與靈活性。
而分解式存儲(Disaggregated storage)則是一種可組合的分解式基礎(chǔ)架構(gòu)。它通過在網(wǎng)絡(luò)結(jié)構(gòu)上連接各種物理存儲設(shè)備,以形成邏輯上的存儲池,并最終以按需的方式提供可擴展的存儲。由于分解式存儲能夠支持動態(tài)環(huán)境的創(chuàng)建,因此其中的計算和存儲資源可以根據(jù)應(yīng)用程序的實際負(fù)載,進行動態(tài)調(diào)配。此外,它能夠像計算實例那樣,在不干擾應(yīng)用服務(wù)的可用性的前提下,靈活地實現(xiàn)存儲的擴展與管理。
分解式存儲架構(gòu)
從概念上說,分解式存儲會通過將多個存儲設(shè)備組合到一個邏輯池中,進而將存儲資源提供給服務(wù)器實例,以實現(xiàn)存儲與計算的分離。同時,存儲設(shè)備在連接到網(wǎng)絡(luò)結(jié)構(gòu)中之后,可以模擬出存儲區(qū)域網(wǎng)絡(luò) (SAN),以便靈活地擴展出應(yīng)用所需的存儲資源。不過,傳統(tǒng)的SAN是在共享存儲資源中,將負(fù)載緊密地耦合在一起。而分解式存儲則可以提供非本地的存儲。它既為每個負(fù)載提供了直接附加存儲(Direct Attached Storage,DAS)的設(shè)計,又提高了資源的利用率、可擴展性、可管理性、以及其他非本地存儲的優(yōu)勢。
目前,分解式存儲的一項突出趨勢在于:它使用了高速的NVME-oF(Non-Volatile Memory Express over Fabric)架構(gòu)、以及通過NVMe over TCP,并網(wǎng)絡(luò)去連接存儲設(shè)備。NVMe使用閃存來提高固態(tài)存儲設(shè)備(SSD)的速度和性能,并使用PCI-Express總線將SSD連接到服務(wù)器上。也就是說,使用了NVMe-oF的分解式存儲,將高性能的SSD與服務(wù)器的CPU相隔離,然后通過低延遲、低抖動的協(xié)議,將它們提供給遠程的計算節(jié)點。NVMe over TCP已于2020年秋季被引入Linux內(nèi)核,并提供了端到端的延遲保證,您可以通過鏈接—https://blog.mayadata.io/mayastor-nvme-of-tcp-performance,以了解更加詳細的信息。
采用分解式存儲
如今,以機器學(xué)習(xí)、Cassandra的NoSql、以及ElasticSearch等日志記錄為代表的應(yīng)用程序,對于高性能和低延遲日益重視,DAS在許多負(fù)載中都占據(jù)了主導(dǎo)地位。而鑒于上述原因,基于NVMe-oF的分解式存儲擁有更為廣泛的使用場景。例如:使用共享架構(gòu)的Kubernetes通過擴展,實現(xiàn)了按需為每個負(fù)載分配適量的存儲和計算資源。而那種使用了分解式池化存儲的軟件平臺,更可以從優(yōu)先級較低的應(yīng)用程序處,借用到存儲或CPU資源,以便讓高性能的應(yīng)用程序,按照負(fù)載的變化,實現(xiàn)自動化的無縫擴展。
對于分解式存儲的性能要求:
分解式存儲可以為各種獨立的應(yīng)用程序帶來如下性能優(yōu)勢:
1. 高速的網(wǎng)絡(luò)結(jié)構(gòu) - 分解式存儲能夠在訪問速度、以及延遲方面,滿足嚴(yán)格的服務(wù)質(zhì)量(QoS)需求。此類網(wǎng)絡(luò)通過池化的網(wǎng)絡(luò)式存儲,以獲取高度可擴展性、高性能,并能以非擁塞的方式連接到計算服務(wù)器上,以便多臺主機快速地訪問到存儲。
2. 快速存儲的網(wǎng)絡(luò)協(xié)議 - 分解式存儲通過諸如:NVMe和NVMe-oF之類的高效且快速的傳輸協(xié)議,以比傳統(tǒng)的iSCSI協(xié)議更低延遲的方式,在SSD直連的計算節(jié)點處,實現(xiàn)最大的IOPS(Input Output operations Per Second,IOPS)。
3. 快速、安全、可擴展的I/O控制器 – 此類存儲控制器能夠快速、安全地在底層SSD上,執(zhí)行讀/寫操作,并能根據(jù)它們所支持的負(fù)載,使用松散耦合的架構(gòu),來實現(xiàn)彈性的橫向擴展。
分解式存儲的類型
目前分解式存儲擁有如下三種類型與形式:
配置分解
這是一種非動態(tài)形式的分解。由于是在服務(wù)級別的配置期間執(zhí)行存儲抽象,因此它不需要持續(xù)運行控制器的監(jiān)視。存儲池可以通過重新配置,實現(xiàn)在部署期間、或在為不同的應(yīng)用程序重建存儲架構(gòu)時,處理不同的工作負(fù)載。
故障分解
作為另一種非動態(tài)形式的分解,存儲驅(qū)動器僅在應(yīng)用出現(xiàn)故障時,被重新分配給不同的主機。雖然重新配置鮮少發(fā)生,但是此類分解進一步提高了應(yīng)用程序的容錯能力。
動態(tài)彈性分解
在這種形式中,驅(qū)動器通常會被池化,并且不連接到多個I/O控制器上。因此,每個服務(wù)器都可以一次性連接多個驅(qū)動器。隨著服務(wù)器請求和負(fù)載數(shù)量的變化,存儲的重新配置會頻繁發(fā)生,它們每隔幾個小時就會請求不同的存儲驅(qū)動器。
由于存儲資源被默認(rèn)為完全抽象的,因此在此類分解形式中,任何主機都可以通過任何I/O控制器,連接到任何存儲驅(qū)動器上。而且由于服務(wù)器與存儲的連接,會通過重新調(diào)整,來適應(yīng)每個I/O請求,因此基礎(chǔ)設(shè)施的重新配置也就會動態(tài)發(fā)生。例如,Kubernetes會水平擴展成為使用I/O控制器的主機,按需為負(fù)載的分解提供算力。
分解式存儲的優(yōu)勢:
分解式存儲為計算和基礎(chǔ)設(shè)施提供了如下方面的改進:
1. 提高資源的利用率 - 分解式存儲能夠根據(jù)優(yōu)先級、以及應(yīng)用程序的需求,動態(tài)地分配存儲資源。同時,它能夠讓用戶享用到由SSD提供的快速I/O。這就意味著租戶可以將所有可用的存儲資源都投入使用,并根據(jù)應(yīng)用程序的實際要求,在設(shè)備的I/O、容量、吞吐能力之間,按需實現(xiàn)最佳配置。
2. 使得SSD靈活且可擴展 - 借助分解式存儲,用戶可以為應(yīng)用程序分配任意數(shù)量的SSD,然后按照應(yīng)用程序的實際要求增減其容量。
3. 簡化擴展 - 分解式存儲允許用戶創(chuàng)建動態(tài)可擴展的存儲架構(gòu),以滿足使用Shared-Nothing架構(gòu)的資源需求變化。
4. 支持創(chuàng)建高性能的應(yīng)用程序 - 分解式存儲允許用戶按需分配吞吐量和讀寫速度,以滿足實際的負(fù)載需求。由于應(yīng)用的執(zhí)行效率更高,因此用戶訪問其存儲數(shù)據(jù)的延遲也就更小。
分類存儲的發(fā)展趨勢
在新技術(shù)的加持下,分解式存儲作為DAS的替代方案,得到了開發(fā)與采用。其中,Non-Volatile Memory Express(NVMe)和Non-Volatile Memory Express Over Fabric (NVMe-oF)通過高速的I/O和網(wǎng)絡(luò),實現(xiàn)了對于SSD的更好利用。例如,Amazon的EBS和Azure的Blob Storage等公共云的Web Scaler,都能夠構(gòu)建出大量的計算實例。而這些實例通過利用優(yōu)化的硬件和軟件基礎(chǔ)設(shè)施,為大量分布式的服務(wù)器提供了遠程的塊存儲設(shè)備。
Kubernetes如何啟用分解式存儲:
分解式存儲能夠完美地與Kubernetes相配合。也就是說,Kubernetes通過創(chuàng)建一個靈活且高度可擴展的部署環(huán)境,可以實現(xiàn)對負(fù)載和存儲控制器的編排和擴展。同時,Kubernetes使用Persistent Volumes和Persistent Volume Claims,根據(jù)容器存儲的需求將各種Pod附加到物理存儲的抽象之中,進而為集群提供靈活的存儲。此外,通過容器存儲接口(Container Storage Interface,CSI),Kubernetes允許第三方存儲提供商通過擴展卷功能的方式,來創(chuàng)建塊和文件存儲的解決方案??梢哉f,有了CSI,用戶可以虛擬地分離出計算層和存儲層,從而為應(yīng)用程序啟用分解式存儲。通常,Kubernetes的CSI插件具有如下兩種類型:
1. 存儲驅(qū)動器 – 由于可以在Kubernetes集群之外被維護,因此它允許將應(yīng)用程序配置為利用存儲類(Storage Classes)和持久卷聲明(Persistent Volume Claims),去動態(tài)地使用資源。
2. 容器附加存儲 (Container Attached Storage,CAS) - 此模型通過按需將容器化的存儲控制器,分配給負(fù)載,來實現(xiàn)基于負(fù)載的存儲。存儲在集群中運行,各種控制層面元素(control plane elements)位于主節(jié)點處,而數(shù)據(jù)層面的負(fù)載則運行在工作節(jié)點上。數(shù)據(jù)層面節(jié)點既可以是本地節(jié)點,也可以是由主節(jié)點中的控制器去獨立調(diào)度和擴展分解式的存儲目標(biāo)。通過使用CAS模型,每個卷都有一個專用的控制器Pod和一組多個副本的Pod。您可以通過鏈接--https://www.cncf.io/blog/2018/04/19/container-attached-storage-a-primer/,了解更多有關(guān)CAS架構(gòu)的詳細論述。
通過CSI的連接,以及擴展和編排存儲軟件的能力,Kubernetes很好地支持了分解式存儲。
由MayaData OpenEBS提供的容器附加存儲(Container Attached Storage,CAS)部署了一個數(shù)據(jù)管理層面。該層面在架構(gòu)上映射到Kubernetes的應(yīng)用程序管理層。OpenEBS將分解的存儲統(tǒng)一到Kubernetes應(yīng)用層的一個組件中。而對于Kubernetes應(yīng)用程序而言,在那些已部署到企業(yè)數(shù)據(jù)中心的異構(gòu)硬件和軟件之上,OpenEBS創(chuàng)建了統(tǒng)一的存儲基礎(chǔ)架構(gòu)。它不但簡化了開發(fā)人員的工作量,而且讓DevOps擁有更大的控制權(quán),甚至為CxO們提供了完整的使用可視性。可以說,OpenEBS能夠讓用戶管理起跨企業(yè)數(shù)據(jù)中心的有狀態(tài)應(yīng)用來,更加簡單、可預(yù)測、更加游刃有余。
最近的一項調(diào)查證實,OpenEBS是最受歡迎的CAS存儲項目之一。與其他云原生的、適合Kubernetes的項目相似,OpenEBS在界面和功能上,避免了傳統(tǒng)存儲架構(gòu)“共享一切”的依賴項和可擴展性。而且,OpenEBS非常易于操作和使用。
OpenEBS依靠控制層面來提供卷,并執(zhí)行卷的相關(guān)操作。它包含了一個PV配置器,能夠動態(tài)地為正確節(jié)點上的卷副本Pod和目標(biāo)控制器Pod,創(chuàng)建特定的部署要求。同時,OpenEBS數(shù)據(jù)層面也包含了一個存儲引擎,該引擎能夠?qū)崿F(xiàn)集群卷的實際I/O路徑。當(dāng)然,它也可以在LocalPV模式下,啟用對存儲設(shè)備的本地或分解式訪問。如下圖所示,存儲引擎可以在用戶空間中作為微服務(wù)運行,通過靈活的配置和擴展,以滿足負(fù)載的需求。
如果您想了解更多有關(guān)基于CAS的OpenEBS不同組件的信息,請參見鏈接--https://docs.openebs.io/docs/next/architecture.html?__hstc=216392137.5bad910047ce69cba4f6eb08bb766f5e.1624011986371.1624024266165.1624031273026.3&__hssc=216392137.3.1624031273026&__hsfp=2402044620。當(dāng)然,您也可以通過加入OpenEBS社區(qū),以進一步了解OpenEBS如何為Kubernetes實現(xiàn)分解式存儲。
小結(jié)
分解式存儲通過將計算與存儲解耦,實現(xiàn)了高速、靈活、且具有高度可擴展的應(yīng)用程序。借助分解式存儲,用戶可以利用高速NVMe的SSD,受益于低延遲和增強的負(fù)載響應(yīng)能力??梢哉f,作為一種獨特的存儲解決方案,分解式存儲的速度、靈活性和低延遲,在優(yōu)化資源使用的同時,也降低了TCO。
原文標(biāo)題:A Detailed & Comprehensive Guide to Disaggregated Storage,作者: Sudip Sengupta
【51CTO譯稿,合作站點轉(zhuǎn)載請注明原文譯者和出處為51CTO.com】