成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

基于NVMe SSD的分布式文件存儲(chǔ)UFS性能提升技術(shù)解析

Cheng_Gang / 4141人閱讀

摘要:宋體是一款自主研發(fā)的分布式文件存儲(chǔ)產(chǎn)品,此前已推出容量型版本。宋體性能的提升不僅僅是因?yàn)榇鎯?chǔ)介質(zhì)的升級(jí),更有架構(gòu)層面的改進(jìn),本文將從協(xié)議索引存儲(chǔ)設(shè)計(jì)等幾方面來(lái)詳細(xì)介紹性能型升級(jí)改造的技術(shù)細(xì)節(jié)。

UFS (UCloud File System) 是一款 UCloud 自主研發(fā)的分布式文件存儲(chǔ)產(chǎn)品,此前已推出容量型 UFS 版本。UFS 以其彈性在線擴(kuò)容、穩(wěn)定可靠的特點(diǎn),為眾多公有云、物理云、托管云用戶提供共享存儲(chǔ)方案,單文件系統(tǒng)存儲(chǔ)容量可達(dá)百 PB 級(jí)。

為了應(yīng)對(duì) IO 性能要求很高的數(shù)據(jù)分析、AI 訓(xùn)練、高性能站點(diǎn)等場(chǎng)景,UFS 團(tuán)隊(duì)又推出了一款基于 NVMe SSD 介質(zhì)的性能型 UFS,以滿足高 IO 場(chǎng)景下業(yè)務(wù)對(duì)共享存儲(chǔ)的需求。性能型 UFS 的 4K 隨機(jī)寫(xiě)的延遲能保持在 10ms 以下,4K 隨機(jī)讀延遲在 5ms 以下。

性能的提升不僅僅是因?yàn)榇鎯?chǔ)介質(zhì)的升級(jí),更有架構(gòu)層面的改進(jìn),本文將從協(xié)議、索引、存儲(chǔ)設(shè)計(jì)等幾方面來(lái)詳細(xì)介紹性能型 UFS 升級(jí)改造的技術(shù)細(xì)節(jié)。

協(xié)議改進(jìn)

此前容量型 UFS 設(shè)計(jì)時(shí)支持的協(xié)議為 NFSv3,其設(shè)計(jì)理念是接口無(wú)狀態(tài),故障恢復(fù)的邏輯簡(jiǎn)單。此外 NFSv3 在 Linux 和 Windows 上被廣泛支持,更易于跨平臺(tái)使用。但是 NFSv3 的設(shè)計(jì)缺點(diǎn)導(dǎo)致的高延遲在高 IO 場(chǎng)景下是不可接受的,所以在性能型 UFS 中,我們選擇僅支持性能更好、設(shè)計(jì)更先進(jìn)的 NFSv4 協(xié)議。

NFSv4 與 NFSv3 相比,更先進(jìn)的特性包括:支持有狀態(tài)的 lock 語(yǔ)義、多協(xié)議間的 compound 機(jī)制等。特別是 compound 機(jī)制,可以讓多次 NFS 協(xié)議交互在一個(gè) RTT 中完成,很好地解決了 NFSv3 性能低效的問(wèn)題。一次典型的 open for write 操作,在 NFSv3 和 NFSv4 上分別是這樣的:

可以看到,在關(guān)鍵的 IO 部分,NFSv4 比 NFSv3 節(jié)省一半的交互次數(shù),可以顯著降低 IO 延遲。除了協(xié)議以外,性能型 UFS 的核心由業(yè)務(wù)索引和底層存儲(chǔ)兩部分組成,由于底層 IO 性能的提升,這兩部分都需要進(jìn)行深度改造以適應(yīng)這種結(jié)構(gòu)性的改變。下面我們將分別介紹這兩部分的改造細(xì)節(jié)。

業(yè)務(wù)索引

索引服務(wù)是分布式文件系統(tǒng)的核心功能之一。相比對(duì)象存儲(chǔ)等其它存儲(chǔ)服務(wù),文件存儲(chǔ)的索引需要提供更為復(fù)雜的語(yǔ)義,所以會(huì)對(duì)性能產(chǎn)生更大影響。

索引服務(wù)的功能模塊設(shè)計(jì)是基于單機(jī)文件系統(tǒng)設(shè)計(jì)思路的一種『仿生』,分為兩大部分:

??目錄索引:實(shí)現(xiàn)樹(shù)狀層級(jí)目錄,記錄各個(gè)目錄下的文件和子目錄項(xiàng)

??文件索引:記錄文件元數(shù)據(jù),包含數(shù)據(jù)塊存儲(chǔ)信息和訪問(wèn)權(quán)限等

索引服務(wù)各模塊的功能是明確的,主要解決兩個(gè)問(wèn)題:

??業(yè)務(wù)特性:除了實(shí)現(xiàn)符合文件系統(tǒng)語(yǔ)義的各類(lèi)操作外,還要保證索引數(shù)據(jù)的外部一致性,在各類(lèi)并發(fā)場(chǎng)景下不對(duì)索引數(shù)據(jù)產(chǎn)生靜態(tài)修改從而產(chǎn)生數(shù)據(jù)丟失或損壞

??分布式系統(tǒng)特性:包括系統(tǒng)拓展性、可靠性等問(wèn)題,使系統(tǒng)能夠應(yīng)對(duì)各類(lèi)節(jié)點(diǎn)和數(shù)據(jù)故障,保證系統(tǒng)對(duì)外的高可用性和系統(tǒng)彈性等

雖然功能有區(qū)別,目錄索引和文件索引在架構(gòu)上是類(lèi)似的,所以我們下面只介紹文件索引 (FileIdx) 架構(gòu)。在以上的目標(biāo)指導(dǎo)下,最終 FileIdx 采用無(wú)狀態(tài)設(shè)計(jì),依靠各索引節(jié)點(diǎn)和 master 之間的租約(Lease)機(jī)制來(lái)做節(jié)點(diǎn)管理,實(shí)現(xiàn)其容災(zāi)和彈性架構(gòu)。

租約機(jī)制和悲觀鎖

master 模塊負(fù)責(zé)維護(hù)一張路由表,路由表可以理解成一個(gè)由虛節(jié)點(diǎn)組成的一致性哈希環(huán),每個(gè) FileIdx 實(shí)例負(fù)責(zé)其中的部分虛節(jié)點(diǎn),master 通過(guò)心跳和各個(gè)實(shí)例節(jié)點(diǎn)進(jìn)行存活性探測(cè),并用租約機(jī)制告知 FileIdx 實(shí)例和各個(gè) NFSServer 具體的虛節(jié)點(diǎn)由誰(shuí)負(fù)責(zé)處理。如果某個(gè) FileIdx 實(shí)例發(fā)生故障,master 只需要在當(dāng)前租約失效后將該節(jié)點(diǎn)負(fù)責(zé)的虛節(jié)點(diǎn)分配給其他實(shí)例處理即可。

當(dāng) NFSServer 需要向文件服務(wù)請(qǐng)求具體操作 (比如請(qǐng)求分配 IO 塊) 時(shí),會(huì)對(duì)請(qǐng)求涉及的文件句柄做哈希操作確認(rèn)負(fù)責(zé)該文件的虛節(jié)點(diǎn)由哪個(gè) FileIdx 處理,將請(qǐng)求發(fā)至該節(jié)點(diǎn)。每個(gè)節(jié)點(diǎn)上為每個(gè)文件句柄維持一個(gè)處理隊(duì)列,隊(duì)列按照 FIFO 方式進(jìn)行執(zhí)行。本質(zhì)上這構(gòu)成了一個(gè)悲觀鎖,當(dāng)一個(gè)文件的操作遇到較多并發(fā)時(shí),我們保證在特定節(jié)點(diǎn)和特定隊(duì)列上的排隊(duì),使得并發(fā)修改導(dǎo)致的沖突降到最低。

更新保護(hù)

盡管租約機(jī)制一定程度上保證了文件索引操作的并發(fā)安全性,但是在極端情況下租約也不能保持并發(fā)操作的絕對(duì)互斥及有序。所以我們?cè)谒饕龜?shù)據(jù)庫(kù)上基于 CAS 和 MVCC 技術(shù)對(duì)索引進(jìn)行更新保護(hù),確保索引數(shù)據(jù)不會(huì)因?yàn)椴l(fā)更新而喪失外部一致性。

IO 塊分配優(yōu)化

在性能型 UFS 中,底層存儲(chǔ)的 IO 延遲大幅降低帶來(lái)了更高的 IOPS 和吞吐,也對(duì)索引模塊特別是 IO 塊的分配性能提出了挑戰(zhàn)。頻繁地申請(qǐng) IO 塊導(dǎo)致索引在整個(gè) IO 鏈路上貢獻(xiàn)的延遲比例更高,對(duì)性能帶來(lái)了損害。一方面我們對(duì)索引進(jìn)行了讀寫(xiě)分離改造,引入緩存和批量更新機(jī)制,提升單次 IO 塊分配的性能。

同時(shí),我們?cè)龃罅?IO 塊的大小,更大的 IO 數(shù)據(jù)塊降低了分配和獲取數(shù)據(jù)塊的頻率,將分配開(kāi)銷(xiāo)進(jìn)行均攤。后續(xù)我們還將對(duì)索引關(guān)鍵操作進(jìn)行異步化改造,讓 IO 塊的分配從 IO 關(guān)鍵路徑上移除,最大程度降低索引操作對(duì) IO 性能的影響。

底層存儲(chǔ)

  • 設(shè)計(jì)理念

存儲(chǔ)功能是一個(gè)存儲(chǔ)系統(tǒng)的重中之重,它的設(shè)計(jì)實(shí)現(xiàn)關(guān)系到系統(tǒng)最終的性能、穩(wěn)定性等。通過(guò)對(duì) UFS 在數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)操作等方面的需求分析,我們認(rèn)為底層存儲(chǔ) (命名為 nebula) 應(yīng)該滿足如下的要求:?簡(jiǎn)單:簡(jiǎn)單可理解的系統(tǒng)有利于后期維護(hù)?可靠:必須保證高可用性、高可靠性等分布式要求?拓展方便:包括處理集群擴(kuò)容、數(shù)據(jù)均衡等操作?支持隨機(jī) IO?充分利用高性能存儲(chǔ)介質(zhì)

Nebula: append-only 和中心化索引

基于以上目標(biāo),我們將底層存儲(chǔ)系統(tǒng) nebula 設(shè)計(jì)為基于 append-only 的存儲(chǔ)系統(tǒng) (immutable storage)。面向追加寫(xiě)的方式使得存儲(chǔ)邏輯會(huì)更簡(jiǎn)單,在多副本數(shù)據(jù)的同步上可以有效降低數(shù)據(jù)一致性的容錯(cuò)復(fù)雜度。更關(guān)鍵的是,由于追加寫(xiě)本質(zhì)上是一個(gè) log-based 的記錄方式,整個(gè) IO 的歷史記錄都被保存,在此之上實(shí)現(xiàn)數(shù)據(jù)快照和數(shù)據(jù)回滾會(huì)很方便,在出現(xiàn)數(shù)據(jù)故障時(shí),更容易做數(shù)據(jù)恢復(fù)操作。

在現(xiàn)有的存儲(chǔ)系統(tǒng)設(shè)計(jì)中,按照數(shù)據(jù)尋址的方式可以分為去中心化和中心化索引兩種,這兩者的典型代表系統(tǒng)是 Ceph 和 Google File System。去中心化的設(shè)計(jì)消除了系統(tǒng)在索引側(cè)的故障風(fēng)險(xiǎn)點(diǎn),并且降低了數(shù)據(jù)尋址的開(kāi)銷(xiāo)。但是增加了數(shù)據(jù)遷移、數(shù)據(jù)分布管理等功能的復(fù)雜度。出于系統(tǒng)簡(jiǎn)單可靠的設(shè)計(jì)目標(biāo),我們最終選擇了中心化索引的設(shè)計(jì)方式,中心化索引使集群擴(kuò)容等拓展性操作變得更容易。

數(shù)據(jù)塊管理:extent-based 理念

中心化索引面臨的性能瓶頸主要在數(shù)據(jù)塊的分配上,我們可以類(lèi)比一下單機(jī)文件系統(tǒng)在這方面的設(shè)計(jì)思路。早期文件系統(tǒng)的 inode 對(duì)數(shù)據(jù)塊的管理是 block-based,每次 IO 都會(huì)申請(qǐng) block 進(jìn)行寫(xiě)入,典型的 block 大小為 4KB,這就導(dǎo)致兩個(gè)問(wèn)題:1、4KB 的數(shù)據(jù)塊比較小,對(duì)于大片的寫(xiě)入需要頻繁進(jìn)行數(shù)據(jù)塊申請(qǐng)操作,不利于發(fā)揮順序 IO 的優(yōu)勢(shì)。2、inode 在基于 block 的方式下表示大文件時(shí)需要更大的元數(shù)據(jù)空間,能表示的文件大小也受到限制。

在 Ext4/XFS 等更先進(jìn)的文件系統(tǒng)設(shè)計(jì)中,inode 被設(shè)計(jì)成使用 extent-based 的方式來(lái)實(shí)現(xiàn),每個(gè) extent 不再被固定的 block 大小限制,相反它可以用來(lái)表示一段不定長(zhǎng)的磁盤(pán)空間,如下圖所示:

顯然地,在這種方式下,IO 能夠得到更大更連續(xù)的磁盤(pán)空間,有助于發(fā)揮磁盤(pán)的順序?qū)懩芰Γ⑶矣行Ы档土朔峙?block 的開(kāi)銷(xiāo),IO 的性能也得到了提升,更關(guān)鍵的是,它可以和追加寫(xiě)存儲(chǔ)系統(tǒng)非常好地結(jié)合起來(lái)。我們看到,不僅僅在單機(jī)文件系統(tǒng)中,在 Google File System、Windows Azure Storage 等分布式系統(tǒng)中也可以看到 extent-based 的設(shè)計(jì)思想。我們的 nebula 也基于這一理念進(jìn)行了模型設(shè)計(jì)。

  • 存儲(chǔ)架構(gòu)

Stream 數(shù)據(jù)流

在 nebula 系統(tǒng)中存儲(chǔ)的數(shù)據(jù)按照 stream 為單位進(jìn)行組織,每個(gè) stream 稱為一個(gè)數(shù)據(jù)流,它由一個(gè)或多個(gè) extent 組成,每次針對(duì)該 stream 的寫(xiě)入操作以 block 為單位在最后一個(gè) extent 上進(jìn)行追加寫(xiě),并且只有最后一個(gè) extent 允許寫(xiě)入,每個(gè) block 的長(zhǎng)度不定,可由上層業(yè)務(wù)結(jié)合場(chǎng)景決定。而每個(gè) extent 在邏輯上構(gòu)成一個(gè)副本組,副本組在物理上按照冗余策略在各存儲(chǔ)節(jié)點(diǎn)維持多副本,stream 的 IO 模型如下:

streamsvr 和 extentsvr

基于這個(gè)模型,存儲(chǔ)系統(tǒng)被分為兩大主要模塊:?streamsvr:負(fù)責(zé)維護(hù)各個(gè) stream 和 extent 之間的映射關(guān)系以及 extent 的副本位置等元數(shù)據(jù),并且對(duì)數(shù)據(jù)調(diào)度、均衡等做管控?extentsvr:每塊磁盤(pán)對(duì)應(yīng)一個(gè) extentsvr 服務(wù)進(jìn)程,負(fù)責(zé)存儲(chǔ)實(shí)際的 extent 數(shù)據(jù)存儲(chǔ),處理前端過(guò)來(lái)的 IO 請(qǐng)求,執(zhí)行 extent 數(shù)據(jù)的多副本操作和修復(fù)等

在存儲(chǔ)集群中,所有磁盤(pán)通過(guò) extentsvr 表現(xiàn)為一個(gè)大的存儲(chǔ)池,當(dāng)一個(gè) extent 被請(qǐng)求創(chuàng)建時(shí),streamsvr 根據(jù)它對(duì)集群管理的全局視角,從負(fù)載和數(shù)據(jù)均衡等多個(gè)角度選取其多副本所在的 extentsvr,之后 IO 請(qǐng)求由客戶端直接和 extentsvr 節(jié)點(diǎn)進(jìn)行交互完成。在某個(gè)存儲(chǔ)節(jié)點(diǎn)發(fā)生故障時(shí),客戶端只需要 seal 掉當(dāng)前在寫(xiě)入的 extent,創(chuàng)建一個(gè)新的 extent 進(jìn)行寫(xiě)入即可,節(jié)點(diǎn)容災(zāi)在一次 streamsvr 的 rpc 調(diào)用的延遲級(jí)別即可完成,這也是基于追加寫(xiě)方式實(shí)現(xiàn)帶來(lái)的系統(tǒng)簡(jiǎn)潔性的體現(xiàn)。

由此,存儲(chǔ)層各模塊的架構(gòu)圖如下:

至此,數(shù)據(jù)已經(jīng)可以通過(guò)各模塊的協(xié)作寫(xiě)入到 extentsvr 節(jié)點(diǎn),至于數(shù)據(jù)在具體磁盤(pán)上的存儲(chǔ)布局,這是單盤(pán)存儲(chǔ)引擎的工作。

  • 單盤(pán)存儲(chǔ)引擎

前面的存儲(chǔ)架構(gòu)講述了整個(gè) IO 在存儲(chǔ)層的功能分工,為了保證性能型 UFS 的高性能,我們?cè)趩伪P(pán)存儲(chǔ)引擎上做了一些優(yōu)化。

線程模型優(yōu)化

存儲(chǔ)介質(zhì)性能的大幅提升對(duì)存儲(chǔ)引擎的設(shè)計(jì)帶來(lái)了全新的需求。在容量型 UFS 的 SATA 介質(zhì)上,磁盤(pán)的吞吐較低延遲較高,一臺(tái)存儲(chǔ)機(jī)器的整體吞吐受限于磁盤(pán)的吞吐,一個(gè)單線程 / 單進(jìn)程的服務(wù)就可以讓磁盤(pán)吞吐打滿。隨著存儲(chǔ)介質(zhì)處理能力的提升,IO 的系統(tǒng)瓶頸逐漸從磁盤(pán)往處理器和網(wǎng)絡(luò)帶寬方面轉(zhuǎn)移。

在 NVMe SSD 介質(zhì)上由于其多隊(duì)列的并行設(shè)計(jì),單線程模型已經(jīng)無(wú)法發(fā)揮磁盤(pán)性能優(yōu)勢(shì),系統(tǒng)中斷、網(wǎng)卡中斷將成為 CPU 新的瓶頸點(diǎn),我們需要將服務(wù)模型轉(zhuǎn)換到多線程方式,以此充分發(fā)揮底層介質(zhì)多隊(duì)列的并行處理能力。為此我們重寫(xiě)了編程框架,新框架采用 one loop per thread 的線程模型,并通過(guò) Lock-free 等設(shè)計(jì)來(lái)最大化挖掘磁盤(pán)性能。

block 尋址

讓我們思考一個(gè)問(wèn)題,當(dāng)客戶端寫(xiě)入了一片數(shù)據(jù) block 之后,讀取時(shí)如何找到 block 數(shù)據(jù)位置?一種方式是這樣的,給每個(gè) block 分配一個(gè)唯一的 blockid,通過(guò)兩級(jí)索引轉(zhuǎn)換進(jìn)行尋址:

?第一級(jí):查詢 streamsvr 定位到 blockid 和 extent 的關(guān)系

?第二級(jí):找到 extent 所在的副本,查詢 blockid 在 extent 內(nèi)的偏移,然后讀取數(shù)據(jù)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/117611.html

Failed to recv the data from server completely (SIZE:0/8, REASON:closed)