作者:對象存儲研發團隊
5. 海量小文件優化實踐
接下來談談 QingStor 對象存儲對海量小文件場景的優化。
為什么需要對海量小文件進行優化呢?
海量小文件是很多存儲產品中都是比較難以應對的問題,其難點主要體現在幾個方面:
第一,小文件非常多的時候,會導致很多隨機讀寫,相比于順序讀寫,隨機讀寫的性能會差很多。
第二,小文件在底層資源利用率比較低。如何理解?小文件最終存儲時落到磁盤上,大多數時候底層都是采用文件系統存儲,每一個小文件都會對應一個文件,文件系統會單獨使用一個結構,也就是 inode,來記錄每一個小文件的元信息,包括執行權限、用戶組等信息,但是這些信息對用戶來說往往是無意義的。
這導致在海量的場景下,可能出現一個情況:文件本身的數據不是那么多,但是不必要的元數據卻非常多,占用大量存儲空間,就會造成底層資源利用率較低。
針對這個問題,QingStor 對象存儲做了一些優化,主要分為兩方面:
在提升存儲利用率方面,QingStor 對象存儲把很多小文件合并成一個大文件。
如上圖所示,這里有一個合并文件,里面包括很多小文件,包括x、a、b、c,它們都是單個 Object 小文件,都會寫到同一個文件中。通過這種方式減少額外的元數據存儲,提升資源利用率。
在使用這種方式時,如果需要刪除前面的小文件,QingStor 對象存儲只做一個標記,后臺會有進程,實時、定期對合并文件進行壓縮,將刪除的資源進行釋放。
在提升寫入性能方面 ,QingStor 對象存儲在寫入一個小文件時,只把它向合并文件的尾部進行追加寫入,不會在打開文件后對指定的 Offset 進行寫入,也就是不做隨機寫,保證寫入全是順序寫,大大提升寫入性能。
此外,如果有并發的寫入請求,比如 a、b、c三個都是小文件,有一個寫入請求到了 Gateway,Gateway 會把這三個請求打包成一個,本來需要寫三次,這里直接合并成一次。
把三次 I/O 減到一次 I/O,能做這樣的合并是因為底層是采用合并方式的存儲,并發 I/O 的合并進一步提升 QingStor 對象存儲的寫入性能。
在讀取時,QingStor 對象存儲通過合并文件的 Path 加上小文件中的 Offset,找到這個文件的數據進行讀取。
舉個例子,現在同時要讀 x 和 a、b、c,在讀完 x,打開文件句柄是可以重復利用的,不需要每一次讀都打開文件,這種方式使得 QingStor 對象存儲的小文件讀取性能得到提升。
6. QingStor 對象存儲重點功能介紹
QingStor 對象存儲支持兩種部署方式: 一種是標準部署,集群由網關節點和存儲節點組成。
接入與索引與事件子系統會部署在網關節點上,存儲節點只部署存儲服務,把計算和存儲分離,支持最小是六個節點規模的部署,這種方式比較適合數據量比較大,請求量也比較大的場景,網關節點與存儲節點都可以進行獨立擴容。
第二種是融合部署,集群由全能節點組成 ,把所有服務部署在全能節點上,這種方式是適合規模比較小,數據量比較小,訪問量也不大的場景,如果數據量增長,可以非常方便以單個節點的方式進行存儲與索引服務的擴容。
首先是生命周期管理功能,生命周期可以對存儲的數據預設一些邏輯,過一段時間后自動對數據進行處理。
生命周期有一些典型的應用場景,例如對過期日志的處理,很多時候存儲的日志是為了滿足政策的要求,過幾個月后就可以刪除了。
生命周期管理可以設置自動規則,到期后自動刪除過期的日志數據。此外,生命周期管理功能還能進行冷熱數據分離,舉個例子,業務只需要對近兩個月的數據進行分析,更久遠的數據就不需要。
但是為了合規需要,更久遠的數據也需要保存,不能丟失,這時候生命周期管理功能可以做冷熱數據的區分,自動設置數據經過一段時間后轉移到更低成本的低頻存儲中。
QingStor 對象存儲的生命周期功能是以存儲桶為單位來進行,其核心是事件子系統進行消息的處理和分發。
用戶寫入一個對象后會產生一個事件,事件子系統會分析這個事件要怎么處理,比如經過一周、一個月進行刪除,或者轉移到低頻,從而對數據進行相應的處理。
如果在開啟生命周期功能管理之前,系統已經有一些歷史數據,事件子系統會主動拉取這些歷史數據,對它進行分析和處理。
QingStor 對象存儲另一個重要的功能是跨區域復制,適用于數據的備份與容災場景。
跨區域復制的應用場景主要包括:
備份和容災: 為了保證數據安全性,在本地有一份之外,需要在另一個機房做備份,本地機房的數據丟失了,可以用遠端的數據來恢復。
就近訪問: 如果業務的用戶分布在不同的區域,每個用戶在訪問其圖片、視頻資源時,希望更快地獲取數據。
QingStor 對象存儲可以按照地域來存儲數據,北京一份,上海一份,數據可以寫入到北京,跨區域復制到上海,滿足就近訪問的需求。
提升計算效率: 如果有多個機器學習、數據挖掘的應用程序或業務程序要訪問同一份數據,這些業務程序可能部署在不同的地方。為了保證計算效率,QingStor 對象存儲可以通過跨區域復制,就近復制一份數據。
跨區域復制的功能核心仍然是事件子系統,用戶寫入一個對象后,就會產生一個事件,事件子系統會處理這個事件,將數據復制到遠端指定目標的存儲桶里。
如果在配置這個功能之前系統已經有一些歷史數據,在配置之后,事件子系統會主動拉取這些數據,將它復制到遠端的位置。
接下來重點介紹QingStor 對象存儲的數據處理功能。
用戶要對存儲在對象存儲中的數據進行處理,包括視頻轉碼、縮略圖、圖片加水印等,可以將要做的動作打包成一個任務進行提交,通過 Gateway 服務進入事件子系統,事件子系統將按照指定的動作將數據讀出來,進行處理與寫入目標位置。
做數據處理的前提是數據存放在對象存儲的存儲桶中,這是數據處理的流程,其核心依然是QingStor 對象存儲的事件子系統。
下面從用戶的角度來看 QingStor 對象存儲是否夠方便,是否容易上手。
QingStor 對象存儲的所有功能 API 都是開放的,可以進行調取和訪問, 同時提供8 種主流的SDK ,涵蓋主流的編程語言,這些 SDK 代碼都是開源的,都在 GitHub 上,大家可以直接拿來使用。
此外,QingStor 對象存儲提供兩個高級命令行工具:
第一種是 qsctl,提供強大的類 Unix 命令,用于管理本地數據資源以及 QingStor 對象存儲中遠程的數據資源,可以非常方便地對數據進行操作,包括 RM、CP 等操作,提供一鍵同步,將你本地的數據與對象存儲中的數據進行同步。
第二種命令行工具是 qscamel,用于在不同對象存儲系統間進行高效的數據遷移,比如現在有數據在阿里云的 OSS 里,你想把它遷移到 QingStor 中,可以使用這個工具來完成。這個工具目前支持主流的對象存儲,包括 QingStor、AliyunOSS、AWS S3 以及 GoogleCloud Storage 等,可以在這些系統之間進行數據的遷移。
S3 是亞馬遜對象存儲服務訪問接口的標準,QingStor 對象存儲是對 S3 兼容得非常好,很多已經基于 S3 開發的應用程序、SDK 和第三方服務,都可以在不修改代碼的前提下非常容易地接入 QingStor 對象存儲,包括 Hadoop、Spark、ElasticSearch 以及 Docker 等。
7. 交通行業最佳實踐
最后我們從智能交通平臺這個場景出發,看看如何在業務中使用 QingStor對象存儲。智能交通平臺的主要應用是高速公路上的視頻監控,以及在收費站進行拍照、收費、車牌識別等業務。
這是一個典型的高并發訪問場景,高速攝像頭非常多,收費站也是非常多的。每一個攝像頭、每一個收費站都會產生海量圖片、視頻資源,要發送 QingStor 對象存儲中。
數據是非常重要的,高速公路上的每一段視頻,事后可能要用于查看當時發生的情況,數據一定要做可靠的存儲。
另一方面,要求存儲系統可以與第三方業務應用無縫對接,例如在收費站拍了車輛照片,需要識別其車牌號,查詢從哪里開過來,這就要求 QingStor對象存儲與其他業務系統進行對接。
QingStor 對象存儲的接入服務可以通過擴展的方式支持高并發場景,采用多副本提供可靠的強一致存儲。
數據寫入后,QingStor 對象存儲會產生事件,這個事件會到事件子系統,按照預設的邏輯進行數據處理,用戶可以自定義第三方接口。比如做一個車牌識別,或者做扣費邏輯,都可以通過自定義接口與業務系統進行關聯。
此外,QingStor 對象存儲的數據沉淀,后期可以支持業務的大數據分析和決策。
最后做個總結,QingStor 對象存儲是一款面向海量非結構化數據的企業級通用數據存儲平臺,具備無限擴容與跨地域的服務能力,可完美支撐各類互聯網應用、大數據分析、音視頻影像、備份系統等企業級應用場景下的存儲需求,幫您構建面向未來、賦能業務的數據存儲平臺。