對象存儲概念及特性

在介紹 QingStor:registered:對象存儲內部的的架構和設計原理之前,我們首先來了解一下對象存儲的概念,也就是從外部視角看,對象存儲有什麼特性,我們應該如何使用。

對象存儲本質上是一款存儲產品,與其他的存儲,如文件存儲、塊存儲,功能是類似的,主要的功能都是數據的讀和寫。最大的不同在於對象存儲是把數據作爲對象進行管理,這是它最主要的特徵,所有的數據在這裏面都當做一個對象處理。

對象存儲有一些非常鮮明的特點:

  • 它的結構是扁平的,不像文件存儲那樣有目錄層級,在讀寫數據時不需要對目錄進行層層查找和打開。

  • 對象存儲具備海量數據存儲的能力,這裏的海量指的是不僅僅是幾百 GB 的量,而是說幾百 T 甚至上 PB 的級別。

  • 對象存儲適用於非結構化數據的存儲,非結構化具體指的是不對數據的類型和格式做任何假設,不管是簡單的文本,還是圖片、視頻、音頻都可以存在對象存儲裏,當做對象來處理。

  • 對象存儲通過 Restful 接口對外提供服務,也就是 HTTP 協議,這使得對象存儲的訪問非常方便,隨時隨地可以進行數據的上傳和下載。

QingStor:registered:對象存儲核心優勢

![0_1591683403636_1.png]( https://community.qingcloud.com/assets/uploads/files/1591683404995-1-resized.png

上面講的幾點是對象存儲產品所具備的通用特徵,接下來介紹一下青雲QingCloud 自研的存儲產品 QingStor:registered:對象存儲獨有的核心優勢,主要包括三方面:

第一,對海量小文件這個場景,我們在存儲及 IO 上都做了針對性的優化優化。

第二,QingStor:registered:對象存儲的系統具有無限擴展的能力,當數據量、訪問量增加時,可以通過增加節點的方式提升計算和存儲能力。

第三,QingStor:registered:對象存儲是數據存儲與流轉的平臺,從兩方面來體現:

  • 首先,所有功能的 API 都是開放的,可以通過任意調用 API 來完成業務邏輯。

  • 其次,提供一些非常有特色的功能,像生命週期管理、跨區域複製以及自定義回調等,可以適配更多的業務場景。

QingStor:registered:對象存儲全局數據模型

上圖是 QingStor:registered:對象存儲的全局數據模型,可以理解成一個邏輯上的視圖。

這包括幾個主要概念:Global 是全局的意思,Global 由多個 Zone 組成,Zone 是區域的意思,可以把它理解成數據中心,例如在北京區域部署了一套對象存儲,同時在上海數據中心也部署了一套,這兩套對象存儲屬於同一個 Global。

QingStor:registered:對象存儲在 Zone 級別和 Global 級別都有相應的管理服務。

Zone 由很多個 Bucket(存儲桶)組成,在使用對象存儲時,必須要先申請一個存儲桶,然後才能向存儲桶中上傳對象數據,以存儲桶爲單位來存儲和管理對象數據。

在同一個 Zone 下面可以有很多個存儲桶,存儲桶裏有各種各樣的對象數據,對象數據對類型大小沒有限制,單個存儲桶中對象的數量也沒有限制,可以無限量上傳對象數據。

QingStor:registered:對象存儲架構解析

這是 QingStor:registered:對象存儲的後臺系統架構,這個架構圖經過了一些簡化和抽象。

首先是接入子系統,對象存儲提供的是在線服務,通過 Restful 進行訪問,本質上相當於在線服務的後臺,需要有接入子系統來完成接收請求、解析協議等工作。

在接入子系統下是索引子系統,索引子系統用來存儲和管理對象的元數據,元數據指的是對象的 Meta 信息,包括 Object 類型、大小、寫入時間之類的信息,由索引子系統管理。

存儲子系統負責存儲和管理數據實體本身,保證數據的可靠持久化存儲。

事件子系統主要工作是異步事件處理和分佈式任務調度,它是生命週期管理等功能的底層機制。

圖中幾條實線箭頭顯示了數據的流向或者說是請求處理流程,請求從接入子系統下來,接入子系統會和索引子系統及存儲子系統交互,獲取元數據以及數據實體,這是核心的讀寫流程。

虛線表示在開啓了一些功能的情況下,可能會產生事件發送到事件子系統。這裏有兩個虛線箭頭,一是讀寫流程中會觸發一些事件,會將事件發送至子系統;二是用戶可以主動提交一些事件,經過接入子系統進入事件子系統。

這幾個子系統構成了 QingStor:registered:對象存儲後臺的主要模塊。

從這個架構圖來看,其內部實現並不是特別複雜。

QingStor:registered:對象存儲是一款存儲產品,其核心功能是做數據的讀寫,邏輯上必然不能太複雜。

但是要把這個系統做好並不是那麼容易,因爲對象存儲主要應對的是海量數據的場景,在這個場景下有很多架構設計上的挑戰。

首先,數據都要做可靠的存儲、可靠的持久化,防止任何數據丟失;

第二,在訪問量很大的情況下,需要保證系統的持續服務能力;

第三,系統需要有良好的擴展性以應對不斷增加的數據量和請求量。

此外,QingStor:registered:對象存儲是一個分佈式系統,由多個節點共同協調提供服務,這種情況下,單個節點的故障是常有的,我們需要做到單個節點故障的情況下,保證服務的可用性以及數據的可靠存儲,這些都是在設計架構時需要重點考慮的問題。

接下來,依次來解讀這幾個子系統是如何實現的。

QingStor:registered:對象存儲子系統實現

在接入子系統中最重要是 Gateway 服務,Gateway 服務本質上是在後臺運行的 Server,它運行在網關節點上。

Gateway 服務的主要功能是接收上游發下來的請求,做協議解析以及數據處理與數據讀寫,對象存儲中最重要的數據讀寫功能基本在這裏完成。

Gateway 服務本身是無狀態的,也就是請求被哪一個 Gateway 是服務處理都是一樣的,因此 Gateway 可以非常輕鬆進行擴展,也就是服務實例的增加與減少。

從整體的鏈路上看一下接入層是如何保證高可用的。

用戶開始訪問對象存儲之前,會先訪問 DNS 服務器,通過對象存儲服務的域名拿到一個虛擬 IP 地址,這個虛擬 IP 會指向某一臺網關節點,如果這個節點故障了,虛擬 IP 會自動遷移到另外存活的節點上。

也就是 QingStor:registered:對象存儲可以保證用獲取到的 IP 永遠指向一個存活的節點,業務永遠是可用的。

在請求到達節點後,對象存儲會進一步做負載均衡,把請求分到多個節點的 Gateway 服務上。

當請求轉到一個 Gateway 上,發現這個 Gateway 出了問題,系統自動會將這個請求重新轉發,這是請求級別的Failover。

通過這兩個機制,QingStor:registered:對象存儲可以保證訪問請求都可以得到響應。

此外,將 Gateway 實現爲無狀態服務,可以非常方便地進行水平擴展,通過增加 Gateway 服務實例個數來頂住高併發的訪問量,保證服務可用。

接下來談談索引子系統的架構,索引子系統的主要功能是存儲和管理對象數據的元數據,元數據包括對象的類型、大小、寫入時間與存儲位置等信息。

這些信息是非常重要的,如果元數據丟失,數據本身就無法讀取,因此要保證元數據絕對安全可靠的存儲。

另一方面,海量數據的場景需要支撐海量數據的索引,索引子系統必須要能夠處理數據量不斷增大的情況。在此基礎之上還要儘可能提升系統的處理性能。

QingStor:registered:對象存儲是如何做到的?

首先通過數據分片的方式來應對海量數據。把數據按切片存儲,切片的意思是按照對象名稱字母序進行切片。比如第一個節點存 A-F 對象,第二個節點存 U-Z 對象,每一個節點會負責一個區間的數據,然後使用一個協調服務記錄節點及其所負責的區域對應關係。

通過這種方式,可以很方便地橫向擴展,如果 A-F 的對象數據太多,系統會把它拆成兩個,增加一個節點進來,將 A-F 拆分爲 A-D,A-D 保留在原有的節點,D-F 放在新的節點,通過這種方式可以處理更多的數據,也提升了處理讀寫的能力。

添加新的節點通過協調服務進行,數據的拆分和再平衡過程是完全自動進行的。

QingStor:registered:對象存儲的 Gateway 服務實時跟協調服務保持連接,可以獲取最新的數據分佈情況。通過這種分片存儲機制,保證了海量數據情況下可以通過增加節點的方式來提升存儲能力。

在數據安全可靠方面,QingStor:registered:對象存儲採用副本機制,每一份元數據都採用三副本方式進行存儲,如果有一個副本所在的機器發生故障,可以從其他的副本上讀取數據,在訪問的時候保證永遠可用。

如果數據所在節點發生變化,Gateway 會立即通過協調服務知道應該訪問哪個節點得到數據。此外,三副本都進行了持久化存儲,保證數據是安全可靠的。

QingStor:registered:對象存儲在單個節點上存儲元數據時使用 KV 存儲引擎,KV 存儲引擎的索引結構是 LSM,LSM 索引結構最大的優勢是寫入非常快,可以提升系統的整體寫入性能。

除此之外,LSM 還有一個特點,它底層的數據在磁盤上存儲時是有序的,也就是一個個 sst 文件,可以提供高效的按順序查詢。

QingStor:registered:對象存儲在處理列出存儲桶中對象的查詢接口時,可以很好的應用這個存儲特性,高效地將數據按字母序列出來。因爲它本身是有序存儲,所以讀取速度非常快,接口處理非常高效,這是採用 KV 存儲的優勢。

總體來看,QingStor:registered:對象存儲的索引子系統通過分片加協調服務的方式使其有很好的擴展性,同時通過副本保障數據的安全。

此外,在單個節點上採用 KV 存儲引擎提升寫入效率,同時支持 list 接口的高效查詢。

存儲子系統存的是對象數據本身,對象存儲應對的是海量場景,數據量非常大,而且會持續增加,訪問量也會非常大,而且有增加的可能性,因此架構的設計要保障系統可以不斷提升性能。此外,還需要保證數據的安全性和集羣的穩定性。

QingStor:registered:對象存儲在統一命名存儲空間下將存儲分成一個個存儲組,每個存儲組由各自的分佈式文件系統組成。

採用存儲組設計的優勢主要包括三方面:

一是區分冷熱數據,也就是存儲分級,QingStor:registered:對象存儲提供兩種存儲級別:低頻存儲和標準存儲。

標準存儲相對於低頻存儲來講,其訪問量高一些,數據量可能會少一些。

低頻存儲的數據量大,但訪問量會低一些。

針對兩種不同的存儲需求可以使用不同的存儲組,組和組之間是沒有關係的,因此不同的存儲組可以採用異構的硬件設備。對於低頻存儲,可以使用大容量的磁盤和低一點CPU的配置,進一步優化成本。

第二,採用存儲組可以使得集羣擴展起來更加靈活方便,比如系統要進行擴容,如何做?

加一個存儲組即可,可以直接把新數據寫到新的存儲組中,不需要對歷史數據做移動和遷移等複雜操作。

QingStor:registered:對象存儲同時支持另一種擴容方式,將既有數據遷移一部分到新存儲組上,使得整個集羣比較均衡。

第三,採用存儲組具有故障隔離的效果。如果存儲組 1 出現節點的故障或者整個存儲組壞掉,對其他存儲組沒有影響,其他存儲組可以正常處理數據,具有故障隔離的效果。

在單個存儲組內,應用 QingStor:registered:文件存儲的核心技術,採用三副本進行存儲,每次寫入數據,等到三副本寫入全部完成纔會返回寫入成功,保證數據的強一致性和安全性。

本地文件系統直接和底層的塊設備打交道,省去了 Linux 本地文件系統,使得 IO 處理在性能上的得到提升。

QingStor:registered:對象存儲的數據傳輸採用 RDMA 高效傳輸協議,RDMA 是一種在不同的節點之間傳輸數據的機制,它不需要經過 CPU,直接通過硬件控制將數據從一個節點拷貝到另一個節點,和 CPU 的執行是並行的,是一種高效傳輸數據的方式。

事件子系統在 QingStor:registered:對象存儲的架構中,不處於數據讀寫的核心流程上,但它提供了很多非常重要的功能,生命週期管理、跨區域複製以及自定義回調都是基於事件子系統來進行設計的。

事件子系統的基本邏輯比較簡單,產生事件和處理事件,這裏事件可以理解成消息系統。

產生消息有兩條鏈路,一條鏈路在做數據讀寫時,當你完成一條數據的讀、寫入、刪除或者更新,索引子系統會產生事件,發送到事件子系統中;還有一條鏈路是用戶直接通過接入子系統提交一個事件,可以進入事件子系統中。

事件子系統有很多預置的消費者進程,消費者會處理事件,這些事件是通過分佈式消息隊列保存的,消費者按照預設的邏輯讀取事件並對其進行處理。比如有一個消費者專門處理生命週期的功能,有一個消費者專門處理自定義回調的功能。

QingStor:registered:對象存儲海量小文件優化實踐

接下來談談 QingStor:registered:對象存儲對海量小文件場景的優化。

爲什麼需要對海量小文件進行優化呢?

海量小文件是很多存儲產品中都是比較難以應對的問題,其難點主要體現在幾個方面:

第一,小文件非常多的時候,會導致很多隨機讀寫,相比於順序讀寫,隨機讀寫的性能會差很多。

第二,小文件在底層資源利用率比較低。如何理解?小文件最終存儲時落到磁盤上,大多數時候底層都是採用文件系統存儲,每一個小文件都會對應一個文件,文件系統會單獨使用一個結構,也就是 inode,來記錄每一個小文件的元信息,包括執行權限、用戶組等信息,但是這些信息對用戶來說往往是無意義的。

這導致在海量的場景下,可能出現一個情況:文件本身的數據不是那麼多,但是不必要的元數據卻非常多,佔用大量存儲空間,就會造成底層資源利用率較低。

針對這個問題,QingStor:registered:對象存儲做了一些優化,主要分爲兩方面:

在提升存儲利用率方面,QingStor:registered:對象存儲把很多小文件合併成一個大文件。

如上圖所示,這裏有一個合併文件,裏面包括很多小文件,包括x、a、b、c,它們都是單個 Object 小文件,都會寫到同一個文件中。通過這種方式減少額外的元數據存儲,提升資源利用率。

在使用這種方式時,如果需要刪除前面的小文件,QingStor:registered:對象存儲只做一個標記,後臺會有進程,實時、定期對合並文件進行壓縮,將刪除的資源進行釋放。

在提升寫入性能方面,QingStor:registered:對象存儲在寫入一個小文件時,只把它向合併文件的尾部進行追加寫入,不會在打開文件後對指定的 Offset 進行寫入,也就是不做隨機寫,保證寫入全是順序寫,大大提升寫入性能。

此外,如果有併發的寫入請求,比如 a、b、c三個都是小文件,有一個寫入請求到了 Gateway,Gateway 會把這三個請求打包成一個,本來需要寫三次,這裏直接合併成一次。

把三次 IO 減到一次 IO,能做這樣的合併是因爲底層是採用合併方式的存儲,併發 IO 的合併進一步提升 QingStor:registered:對象存儲的寫入性能。

在讀取時,QingStor:registered:對象存儲通過合併文件的 Path 加上小文件中的 Offset,找到這個文件的數據進行讀取。

舉個例子,現在同時要讀 x 和 a、b、c,在讀完 x,打開文件句柄是可以重複利用的,不需要每一次讀都打開文件,這種方式使得 QingStor:registered:對象存儲的小文件讀取性能得到提升。

QingStor:registered:對象存儲重點功能介紹

QingStor:registered:對象存儲支持兩種部署方式:一種是標準部署,集羣由網關節點和存儲節點組成。

接入與索引與事件子系統會部署在網關節點上,存儲節點只部署存儲服務,把計算和存儲分離,支持最小是六個節點規模的部署,這種方式比較適合數據量比較大,請求量也比較大的場景,網關節點與存儲節點都可以進行獨立擴容。

第二種是融合部署,集羣由全能節點組成,把所有服務部署在全能節點上,這種方式是適合規模比較小,數據量比較小,訪問量也不大的場景,如果數據量增長,可以非常方便以單個節點的方式進行存儲與索引服務的擴容。

首先是生命週期管理功能,生命週期可以對存儲的數據預設一些邏輯,過一段時間後自動對數據進行處理。

生命週期有一些典型的應用場景,例如對過期日誌的處理,很多時候存儲的日誌是爲了滿足政策的要求,過幾個月後就可以刪除了。

生命週期管理可以設置自動規則,到期後自動刪除過期的日誌數據。此外,生命週期管理功能還能進行冷熱數據分離,舉個例子,業務只需要對近兩個月的數據進行分析,更久遠的數據就不需要。

但是爲了合規需要,更久遠的數據也需要保存,不能丟失,這時候生命週期管理功能可以做冷熱數據的區分,自動設置數據經過一段時間後轉移到更低成本的低頻存儲中。

QingStor:registered:對象存儲的生命週期功能是以存儲桶爲單位來進行,其核心是事件子系統進行消息的處理和分發。

用戶寫入一個對象後會產生一個事件,事件子系統會分析這個事件要怎麼處理,比如經過一週、一個月進行刪除,或者轉移到低頻,從而對數據進行相應的處理。

如果在開啓生命週期功能管理之前,系統已經有一些歷史數據,事件子系統會主動拉取這些歷史數據,對它進行分析和處理。

QingStor:registered:對象存儲另一個重要的功能是跨區域複製,適用於數據的備份與容災場景。

跨區域複製的應用場景主要包括:

備份和容災:爲了保證數據安全性,在本地有一份之外,需要在另一個機房做備份,本地機房的數據丟失了,可以用遠端的數據來恢復。

就近訪問:如果業務的用戶分佈在不同的區域,每個用戶在訪問其圖片、視頻資源時,希望更快地獲取數據。

QingStor:registered:對象存儲可以按照地域來存儲數據,北京一份,上海一份,數據可以寫入到北京,跨區域複製到上海,滿足就近訪問的需求。

提升計算效率:如果有多個機器學習、數據挖掘的應用程序或業務程序要訪問同一份數據,這些業務程序可能部署在不同的地方。爲了保證計算效率,QingStor:registered:對象存儲可以通過跨區域複製,就近複製一份數據。

跨區域複製的功能核心仍然是事件子系統,用戶寫入一個對象後,就會產生一個事件,事件子系統會處理這個事件,將數據複製到遠端指定目標的存儲桶裏。

如果在配置這個功能之前系統已經有一些歷史數據,在配置之後,事件子系統會主動拉取這些數據,將它複製到遠端的位置。

接下來重點介紹QingStor:registered:對象存儲的數據處理功能。

用戶要對存儲在對象存儲中的數據進行處理,包括視頻轉碼、縮略圖、圖片加水印等,可以將要做的動作打包成一個任務進行提交,通過 Gateway 服務進入事件子系統,事件子系統將按照指定的動作將數據讀出來,進行處理與寫入目標位置。

做數據處理的前提是數據存放在對象存儲的存儲桶中,這是數據處理的流程,其核心依然是QingStor:registered:對象存儲的事件子系統。

下面從用戶的角度來看 QingStor:registered:對象存儲是否夠方便,是否容易上手。

QingStor:registered:對象存儲的所有功能 API 都是開放的,可以進行調取和訪問,同時提供 8 種主流的SDK,涵蓋主流的編程語言,這些 SDK 代碼都是開源的,都在 GitHub 上,大家可以直接拿來使用。

此外,QingStor:registered:對象存儲提供兩個高級命令行工具:

第一種是 qsctl,提供強大的類 Unix 命令,用於管理本地數據資源以及 QingStor:registered:對象存儲中遠程的數據資源,可以非常方便地對數據進行操作,包括 RM、CP 等操作,提供一鍵同步,將你本地的數據與對象存儲中的數據進行同步。

第二種命令行工具是 qscamel,用於在不同對象存儲系統間進行高效的數據遷移,比如現在有數據在阿里雲的 OSS 裏,你想把它遷移到 QingStor 中,可以使用這個工具來完成。這個工具目前支持主流的對象存儲,包括 QingStor、AliyunOSS、AWSS3 以及 GoogleCloud Storage 等,可以在這些系統之間進行數據的遷移。

S3 是亞馬遜對象存儲服務訪問接口的標準,QingStor:registered:對象存儲是對 S3 兼容得非常好,很多已經基於 S3 開發的應用程序、SDK 和第三方服務,都可以在不修改代碼的前提下非常容易地接入 QingStor:registered:對象存儲,包括 Hadoop、Spark、ElasticSearch 以及 Docker 等。

QingStor:registered:對象存儲交通行業最佳實踐

最後我們從智能交通平臺這個場景出發,看看如何在業務中使用 QingStor:registered:對象存儲。智能交通平臺的主要應用是高速公路上的視頻監控,以及在收費站進行拍照、收費、車牌識別等業務。

這是一個典型的高併發訪問場景,高速攝像頭非常多,收費站也是非常多的。每一個攝像頭、每一個收費站都會產生海量圖片、視頻資源,要發送 QingStor:registered:對象存儲中。

數據是非常重要的,高速公路上的每一段視頻,事後可能要用於查看當時發生的情況,數據一定要做可靠的存儲。

另一方面,要求存儲系統可以與第三方業務應用無縫對接,例如在收費站拍了車輛照片,需要識別其車牌號,查詢從哪裏開過來,這就要求 QingStor:registered:對象存儲與其他業務系統進行對接。

QingStor:registered:對象存儲的接入服務可以通過擴展的方式支持高併發場景,採用多副本提供可靠的強一致存儲。

數據寫入後,QingStor:registered:對象存儲會產生事件,這個事件會到事件子系統,按照預設的邏輯進行數據處理,用戶可以自定義第三方接口。比如做一個車牌識別,或者做扣費邏輯,都可以通過自定義接口與業務系統進行關聯。

此外,QingStor:registered:對象存儲的數據沉澱,後期可以支持業務的大數據分析和決策。

最後做個總結,QingStor:registered:對象存儲是一款面向海量非結構化數據的企業級通用數據存儲平臺,具備無限擴容與跨地域的服務能力,可完美支撐各類互聯網應用、大數據分析、音視頻影像、備份系統等企業級應用場景下的存儲需求,幫您構建面向未來、賦能業務的數據存儲平臺。

相關文章