Curve簡介
Curve是網易數帆於今年7月份開源的一個高性能、高可用、高可靠的分佈式存儲系統,主打高性能、低延遲。node
Curve設計能夠做爲多種存儲場景的底層存儲:例如塊存儲,對象存儲,雲原生數據庫,EC等。git
當前Curve已實現高性能塊存儲,而且基於這⼀場景對接了OpenStack 和 Kubernetes。OpenStack 上主要是用作雲主機的系統盤和雲盤,目前已經在線上穩定一年多了。Kubernetes上主要是想做爲計算節點的數據目錄,這個場景目前在灰度環境中測試驗證中。github
-
github主頁:https://opencurve.github.io/數據庫
-
github代碼倉庫:https://github.com/opencurve/curve緩存
如上圖所示,Curve存儲系統的基礎設計框架與經典的GFS基本相似,採用有中心節點的架構,核心服務由三個部分組成:服務器
-
元數據節點MDS,主要有兩個職責,一方面管理和存儲元數據信息,另外一方面感知集羣狀態並進行調度。元數據存儲在etcd中。微信
-
數據節點ChunkServer, 一方面負責數據的存儲,另外一方面負責數據一致性(若是底層是多副本,須要負責副本間的數據一致性)。網絡
-
客戶端Client, 向上層應用提供對文件的操做接口(open、read、write等), 會和MDS以及ChunkServer交互,與MDS交互實現對元數據的增刪改查;與ChunkServer交互實現對數據的增刪改查。架構
還有一個快照克隆服務器:框架
-
快照克隆服務器獨立於核心服務,對外提供了http接口,用於處理和管理快照克隆任務。
這篇文章會介紹Curve的元數據的管理,主要是MDS的元數據的管理。
MDS是Curve的元數據管理服務,負責整個集羣的元數據管理。MDS的全部元數據信息都會持久化到kv存儲中,Curve選擇了etcd做爲元數據的存儲。
爲了加快元數據的訪問,mds還在內存維護了一個元數據的cache。cache採用LRU(Least Recently Used)淘汰策略,cache最多緩存的記錄條目數量,經過mds的配置文件進行配置。
mds存儲的元數據包含拓撲信息的元數據,namespace的元數據。全部的信息都是通過必定的編碼,以kv的方式保存在元數據中。不一樣類型的元數據的編碼方式不一樣,全部保存在mds的元數據的key都是以 「prefix + 其餘字段」的方式進行編碼。value則是對應的元數據序列化爲字符串。
不一樣類型的元數據的前綴不一樣,這些前綴好比:
const char FILEINFOKEYPREFIX[] = "01";const char SEGMENTINFOKEYPREFIX[] = "02";const char SNAPSHOTFILEINFOKEYPREFIX[] = "03";const char CHUNKSTOREKEY[] = "05";const char TOPOLOGYITEMPRIFIX[] = "10";
拓撲元數據信息
curve的拓撲信息由mds的topology模塊管理,topology管理集羣的 topo元數據信息。用於管理和組織機器,利用底層機器的放置、網絡的規劃以面向業務提供以下功能和非功能需求。
-
故障域的隔離:好比副本的放置分佈在不一樣機器,不一樣機架,或是不一樣的交換機下面。
-
隔離和共享:不一樣用戶的數據能夠實現固定物理資源的隔離和共享。
下圖是一個topology的層級關係圖。一個集羣能夠支持1到多個Pool,每一個Pool下有多個zone,每一個zone由多個server組成,每一個server上有多個chunkserver。
介紹一下各個組件的概念。
-
pool: 用於實現對機器資源進行物理隔離,server不能跨Pool交互。運維上,建議以pool爲單元進行物理資源的擴容。
-
zone: 故障隔離的基本單元,通常來講屬於不一樣zone的機器至少是部署在不一樣的機架,一個server必須歸屬於一個zone。
-
server: 用於抽象描述一臺物理服務器,chunkserver必須歸屬一個於server。
-
Chunkserver: 用於抽象描述物理服務器上的一塊物理磁盤(SSD),chunkserver以一塊磁盤做爲最小的服務單元。
curve在上物理pool之上又引入了邏輯pool的概念,以實現統一存儲系統的需求,即在單個存儲系統中能夠同時支持塊存儲、對象存儲、進行對象存儲。
Curve底層經過不一樣的文件類型支撐不一樣上層應用, curve的數據組織形式是文件。Curve提供三種文件類型,PageFile、AppendFile、AppendECFile
-
PageFile支持塊設備。
-
AppendFile支持在線對象存儲(規劃中)。
-
AppendECFile支持近線對象存儲能夠共存(規劃中)。
目前咱們只實現了對塊存儲的支持。
以下圖所示LogicalPool與物理pool爲多對一的關係,一個物理pool能夠存放各類類型的file。固然因爲curve支持多個pool,能夠選擇一個logicalPool獨享一個pool。
topo的元數據信息的來源有兩種:一部分是curve集羣上線時肯定的;還有一部分是集羣在運行的過程當中,經過心跳上報的信息。
集羣上線的topo信息,這個是集羣上線時,在配置文件中指定。好比下面是一個新集羣上線的例子,一個簡單的配置文件以下。在這個集羣中,有一個物理pool pool1,這個物理pool由3個zone組成,分別爲zone1, zone2, zone3。每一個zone有一臺server。在物理pool上,還建立了一個邏輯pool,邏輯pool使用3個zone,採用3副本。
cluster_map: servers: - name: server1 internalip: 192.168.0.1 internalport: 8200 externalip: 192.168.0.1 externalport: 8200 zone: zone1 physicalpool: pool1 - name: server2 internalip: 192.168.0.2 internalport: 8200 externalip: 192.168.0.2 externalport: 8200 zone: zone2 physicalpool: pool1 - name: server3 internalip: 192.168.0.3 internalport: 8200 externalip: 192.168.0.3 externalport: 8200 zone: zone3 physicalpool: pool1 logicalpools: - name: logicalPool1 physicalpool: pool1 type: 0 replicasnum: 3 copysetnum: 100 zonenum: 3 scatterwidth: 0
心跳上報的topo信息,主要是chunkserver和mds之間的心跳信息。chunkserver會按期向mds發行心跳信息,在心跳信息中其實帶有chunkserver的狀態信息,好比chunkserver上的負載、容量、副本狀態、是否可用等信息。mds根據收到上報的信息,更新拓撲元數據。若是mds一段時間沒有收到chunkserver心跳,還會修改chunkserver的狀態。
-
Online: chunk server在線,正常服務。
-
Unstable: chunk server一段時間沒收到心跳(默認30s),可是尚未到達offline的時間(默認30min),chunkserver狀態改成unstable狀態,打印一條warning日誌。
-
Offline :chunk server超過offline的時間沒有收到心跳(默認30min), chunkserver狀態改成offline,打印一條error日誌。調度模塊感知到offline狀態,觸發chunk server的recover修復。
namespace元數據信息
curve目前僅支持塊存儲,每一個塊設備在mds都有一個對應的文件。爲了方便管理,curve還引入相似於文件系統那種層次結構。一個curve集羣在curvefs中有且僅有一個根目錄「/」,根目錄在系統初始化的時候自動建立。目錄能夠嵌套,目錄下能夠存放子目錄或者文件。
curve的namespace信息一方面保存着文件和目錄的元數據信息,一方面還保存着文件和目錄的層次關係。
不管是目錄,仍是文件,統一都用FileInfo表示,區別在於他們的類型不同。
FileInfo的編碼方式:
-
key:prefix(2Byte)+parentId(8Byte)+fileName;
-
Value:FileInfo序列化後的字符串。
FileInfo的各個字段含義以下:
以下圖所示的一個curvefs的目錄層次結構,根目錄下有目錄home和文件tmp,home下有目錄dir1,目錄dir2,文件filez,dir1下有文件filex,dir2下有文件filey。
如上圖所示。這些文件和目錄通過編碼,以kv的方式保存在etcd中。文件和目錄的key的前綴都相同,這裏省略了prefix,在KV中,Key是ParentID + "/"+ BaseName
,Value是自身的文件ID;這種方式能夠很好地平衡幾個需求:
-
文件列目錄:列出目錄下的全部文件和目錄
-
文件查找:查找一個具體的文件
-
目錄重命名:對一個目錄/文件進行重命名
地址空間映射元數據信息:
curve的空間採用瘦分配(thin provisioning)的方式進行空間分配,也就是說卷在開始建立的時候,是沒有實際分配空間的,僅僅是在元數據中記錄了文件的長度和空間分配的粒度,真正的空間分配只有在地址第一次真正訪問到的時候纔會觸發。
curve的底層按照chunk進行空間管理,可是chunk的切分粒度比較小,若是按照chunk進行分配,大量chunk分配會對元數據形成必定的壓力,並且對性能也有影響。全部chunk的分配按照批量分配的原則,也就是一次性分配一批chunk。在chunk之上引入了一個segment的概念。Segment是⼀個邏輯概念,也是空間分配的基本單元。在curve中,一個curve文件會按照segment爲粒度去進行空間分配。chunk外⾯包⼀層segment的好處是減小元數據量。
以下圖所示,一個curve的文件由若干個segment組成,segment的大小由配置文件指定,目前curve默認segment的粒度爲1GB,因此curve的文件大小必須是1GB的整數倍。一個segment由若干個chunk組成。
client在對空間進行讀寫請求以前,會先去mds查詢指定offset和length的空間所在的segment的元數據信息。並把這個元數據信息緩存在client本地,之後client就可使用緩存在本地的元數據信息對數據進行訪問。segment元數據信息包含了如下的字段。
全部的文件在curve中都是由多個Segment組成的。每一個segment的元數據記錄着該segment是從哪一個logicalpool分配出來,這個segment的size,組成這個segment的chunk的size,這個segment在文件中的偏移,以及這個組成這個segment的每個chunk的信息。
Segment的持久化,Segment的編碼方式:
-
key:prefix(2Byte)+文件的inodeid(8Byte)+offset(8Byte);
-
Value:PageFileSegment序列化後的字符串。
Segment是由多個chunk組成的,這裏的chunk是實際的物理存儲單元,對應着chunk server上的⼀個物理⽂件。chunk的元數據,包含了chunk所屬的copyset id和chunkid。
每一個chunk實際上由多個副本的組成的,chunk的實際的存儲位置,由copyset肯定。copy保存着chunk的複製組的成員關係,在copyset中,記錄着chunk的3個副本實際上分佈在哪些chunkserver節點上。copyeset相似於ceph中的pg。爲何不直接記錄chunk的3個副本,而是經過chunk→copyset,copyset→三個副本的方式存儲元數據呢?
這裏簡要介紹下引入copyset的好處,後期curve團隊還會對copyset進行更加詳細的介紹。
-
減小元數據量:通常來講實際物理文件chunk不會設置的太大,都是M級別的。若是直接去記錄這些chunk的信息,元數據量會很大。引入copyset能夠認爲就是分組,對於chunk的信息記錄就是組信息+組內信息,數據量會少不少。若是爲每一個Chunk去保存複製組成員關係,須要至少 ChunkID+3×NodeID=20 個byte,而若是在Chunk到複製組之間引入一個CopySet,每一個Chunk能夠用ChunkID+CopySetID=12個byte。
-
減小複製組數量:若是一個數據節點存在 256K個複製組,複製組的內存資源佔用將會很是恐怖;複製組之間的通訊將會很是複雜,例如複製組內Primary給Secondary按期發送心跳進行探活,在256K個複製組的狀況下,心跳的流量將會很是大;而引入CopySet的概念以後,能夠以CopySet的粒度進行探活、配置變動,下降開銷。
-
提升數據可靠性:在數據複製組過分打散的狀況下,在發生多個節點同時故障的狀況下,數據的可靠性會受到影響。引入CopySet,可提升分佈式存儲系統中的數據持久性,下降數據丟失的機率。
小結
至此,這篇文章分別從拓撲信息的元數據、namespace元數據、地址空間映射元數據三個方面,介紹了Curve的MDS的元數據的管理,介紹了拓撲信息的組成,元數據的持久化,空間的分配等。
更多Curve MDS技術解讀,參考如下視頻:
後續Curve團隊還會陸續對Curve其餘部分進行介紹,歡迎你們持續關注。
做者簡介
陳威,網易數帆存儲團隊資深開發工程師,有多年存儲陣列、分佈式存儲研發運維經驗。
-
Curve項目已經徹底開源到github:https://github.com/opencurve/curve,歡迎感興趣的小夥伴去star&&fork。如對curve有疑問或者想參加curve的開發,歡迎給咱們提issue或者pr。
-
Curve微信交流羣,7*24h爲你們答疑解惑,歡迎搜索微信號opencurve加好友後拉進羣。
-
Curve系列技術課程,每週五晚19:00 B站直播,本週五主題爲 Curve 快照克隆,敬請收看!