老司機帶你探知存儲伸縮之道

作者 | 王炎
編輯 | 迷鹿

王炎,2013年加入騰訊架構平臺部,從事分佈式存儲平臺的開發和運營。目前負責冷數據存儲的相關研發工作,主要應對雲存儲數據快速增長場景下,持續完善分級存儲系統,優化總體存儲成本。

一、概要

騰訊分佈式文件存儲(TFS)的數據量在短短數年時間裏從0增加至EB級別,使用了幾十萬塊磁盤,增長速度非常迅猛。另外,TFS承載的幾乎都是互聯網在線存儲業務,需要在保證業務正常訪問的情況下經常性快速擴容。在這種情況下,存儲系統的伸縮性顯得尤爲重要,擴容過程的高效、穩定就成爲必須要解決的問題。

下面介紹TFS平臺實現EB級存儲伸縮的幾個關鍵技術。

二、存儲Set模型

在系統快速擴容的過程中,必須要解決的問題是:系統以何種方式進行擴容,擴容的時候如何保證擴容操作和流程簡單、快速、可靠。TFS的數據層使用了存儲Set來解決這些問題。

存儲Set是TFS系統內部快速擴容的一個標準單位。TFS整體的系統架構採用了文件索引和文件數據內容分離存儲的設計方式,整個數據集羣劃分爲多個存儲Set,各個存儲Set獨立運營,之間沒有任何依賴。每次需要擴容的時候,只要增加存儲Set到TFS存儲系統中即可。

1、存儲Set定義

存儲Set內部自成存儲集羣。每個Set內部有控制節點(ChxMaster)和若干存儲節點(Chxd)組成。其中ChxMaster節點負責整個子系統內部的集羣控制、路由、數據調度等控制層邏輯;而Chxd則部署到各個存儲服務器上,負責本地數據的存取,Set內部的數據複製與重建,底層磁盤管理等數據層的邏輯。

存儲Set有以下特點:

◆ 每個存儲Set對外提供了獨立的數據讀寫功能,數據上傳之後,ChxMaster會返回一個存儲Set內部的Key供客戶端後續訪問。

◆ 存儲Set內部的各個存儲節點採用了同構設計,一個存儲Set內部只有一種類型的存儲服務器硬件,這樣可以大大簡化存儲Set內部的負載均衡和空間管理。各個存儲Set之間採用同樣數量的硬件。比如典型3備份的存儲Set都使用了30臺存儲服務器。

2、存儲Set的使用優點

當集羣規模變大之後,不可避免地會遇到人工操作失誤、評估困難、資源調整、軟硬件更新換代等問題。而TFS把數據集羣拆分成各個標準化的存儲Set之後,可以帶來以下好處:

1)標準化部署

因爲每次需要擴容的時候,只需要再多部署指定數量的存儲Set。這種例行的擴容操作就很容易標準化下來。對於系統規格的評估也變得相對簡單,可以簡化爲每個Set可以提供多少存儲容量,以及對應的性能規格。這樣人工操作失誤導致事故的概率就大大降低,也很容易從系統層面自動進行校驗,提前發現風險。

2)故障隔離

數據的複製、流動限制在存儲Set內部,所以單個節點故障造成的影響只會限制在單個存儲Set內部,不會影響到整個TFS系統。這樣就可以起到很好的故障隔離效果,解決大規模集羣下,錯誤擴散的問題。

3)單獨的讀寫控制

因爲各個存儲Set各自相對獨立,我們很容易在接入層對各個存儲Set的寫負載進行單獨控制。在進行新的軟件版本測試和灰度上線的時候,就可以逐步放量,比較容易控制節奏。

4)高效數據遷移

TFS系統已經運行好多年,幾乎每年都會有機房裁撤和機器退役導致的數據遷移需求。存儲Set模型固定之後就可以使用兩個存儲Set之間數據對拷的方式,而不用修改文件索引層,大大降低數據遷移的成本。

三、彈性小表

TFS的文件索引部分使用的是基於一致性哈希設計的分佈式Key-Value系統(TSSD)。TSSD通過將哈希空間等分爲N份,每份作爲一個虛擬節點,在TFS系統中使用稱爲小表的邏輯結構來承載。在進行數據遷移和擴容的時候,小表是最小的調度單元。

TFS的索引系統無法像數據層那樣分爲各個Set,只能使用中心服務式的設計,在彈性方面要能夠從3臺服務器擴展到上千臺。在雲服務的場景下,除了常規的擴容之外,還需要解決多租戶、以及成本優化等問題。

1、資源隔離

作爲雲存儲的平臺,TSSD需要支持多租戶特性。在多個租戶共享一個存儲集羣的時候,各個租戶之間在容量和訪問性能上難免會有衝突。

TSSD給底層的小表分配各自獨立的物理存儲空間,同時每個小表的IO性能也從存儲引擎層面做了限制。通過將不同的小表分配給不同的租戶的方式,解決了雲平臺多租戶數據物理隔離的問題,並且爲每個租戶提供了基礎性能保證。

2、按需分配

在進行容量配額管理的時候,從一開始就爲每個小表指定好一段連續的物理存儲空間是最簡單的實現方式。但是在實際運營的過程中,往往會遇到容量預估不準確等問題。另外在進行擴容的時候,爲了保證遷移粒度不至於過大,需要進行小表分裂。但是當分裂剛完成的時候,空間利用率又會有突然下降。這樣每個小表都需要各自獨立的預留空間,存儲空間利用率很低。

爲解決這個問題,我們對每個小表的存儲空間採用按需分配的策略。只有當數據真實寫入的時候,才從整個SSD線型空間上分配一個Block給這個小表。這樣在進行小表分裂的時候,各個小表未使用的空間不必預先佔用,從整體上提高了TSSD系統的存儲利用率,並且又不會喪失在物理上資源隔離的優點。

四、TDisk系統

TFS系統使用了非常多的大容量廉價機械磁盤,同時這些磁盤是整個TFS系統中故障率最高的硬件部件。另外,在系統不斷變遷的同時,不可避免會引入不同規格、不同供應商提供的各種硬件。如何高效使用這些硬件,並提供統一的錯誤處理,是整個存儲系統保證穩定可靠必須要解決的問題。

TFS系統使用了TDisk作爲底層磁盤的一個管理系統,將底層不穩定、異構的硬件介質屏蔽爲相對統一、穩定的資源,在擴容的時候良好地支持各種存儲類型的硬件。

1、盤符管理

Linux OS的盤符漂移一直以來都是分佈式存儲系統需要解決的一個問題。但是傳統存儲系統中,修改內核固定盤符的做法過於笨重,每當需要適配新內核版本的時候,盤符管理的部分也需要隨着更新一次。並且添加新的硬件類型支持也不容易。

TDisk使用的是純用戶態處理的方式,使用udev機制,將現有系統的盤符重新映射,爲上層軟件提供必需的硬件槽位信息。這種做法沒有OS內核版本的限制,對於硬件的兼容性也較好。在插拔硬盤的時候,即使不重啓存儲服務器,邏輯盤符也不會發生變動,也很大程度上降低了運維的壓力,以及壞盤對系統帶來的衝擊。

!

2、IO棧定製

Linux默認的IO棧爲了通用性考慮,比較複雜。目前開源的分佈式存儲系統普遍基於文件系統進行設計,整個鏈路過長,出問題的話定位起來也很困難。如果存儲進程因爲IO未響應卡住,必須重啓服務器纔可以解決,影響範圍較大。

TDisk採用了定製的IO棧,繞過了PageCache等部分,並且提供了IO超時處理,防IO掛死等強化設計,使得整個底層IO路徑更加簡單可靠。

3、磁盤掃描

機械磁盤上的數據在長久存儲之後,會因爲磁盤壞道等原因造成部分數據丟失或損壞。但是如果沒有業務訪問來觸發這個錯誤的話,很可能無法及時修復,造成數據可靠性降低,有數據丟失的風險。這個問題在數據規模越來越大,數據越來越“冷”的情況下顯得尤爲嚴重。

TDisk提供了磁盤定期掃描的功能來解決數據靜默錯誤的問題。每個月會將磁盤上的數據完整掃描一遍,發現磁盤壞扇區,並針對這些區域進行自動修復。提升了TFS數據的可靠性,並避免整盤替換帶來的系統衝擊。

另外,磁盤掃描的時候,會對業務IO的性能表現造成影響,所以TDisk會實時監控業務訪問的壓力。當磁盤比較空閒的時候全速掃描,業務有壓力的時候降低掃描的壓力,如果業務壓力過大則暫停。

五、總結

TFS存儲系統通過Set模型、彈性小表、TDisk等關鍵的技術和設計,切實地解決了大規模存儲系統在快速擴容時遇到的一系列問題,有效地支撐了TFS存儲系統的高速發展,爲所有使用TFS存儲系統的業務保駕護航。

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