您現在的位置是:首頁 > 網頁遊戲首頁網頁遊戲

QingStor 物件儲存架構設計及最佳實踐

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

生命的儲存單位是什麼

作者:物件儲存研發團隊

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

物件儲存本質上是一款儲存產品,與其他的儲存,如檔案儲存、塊儲存,功能是類似的,主要的功能都是資料的讀和寫。最大的不同在於物件儲存是把資料作為物件進行管理,這是它最主要的特徵,所有的資料在這裡面都當做一個物件處理。

物件儲存有一些非常鮮明的特點:

結構是扁平的,不像檔案儲存那樣有目錄層級,在讀寫資料時不需要對目錄進行層層查詢和開啟。

物件儲存具備海量資料儲存的能力,這裡的海量指的是不僅僅是幾百GB的量,而是說幾百TB甚至上PB的級別。

物件儲存適用於非結構化資料的儲存,非結構化具體指的是不對資料的型別和格式做任何假設,不管是簡單的文字,還是圖片、影片、音訊都可以存在物件儲存裡,當做物件來處理。

物件儲存透過Restful介面對外提供服務,也就是HTTP協議,這使得物件儲存的訪問非常方便,隨時隨地可以進行資料的上傳和下載。

1。核心優勢

QingStor 物件儲存架構設計及最佳實踐

上面講的幾點是物件儲存產品所具備的通用特徵,接下來介紹一下QingStor物件儲存獨有的核心優勢,主要包括三方面:

第一,對海量小檔案這個場景,我們在儲存及I/O上都做了針對性的最佳化。

第二,QingStor物件儲存的系統具有無限擴充套件的能力,當資料量、訪問量增加時,可以透過增加節點的方式提升計算和儲存能力。

第三,QingStor物件儲存是資料儲存與流轉的平臺,從兩方面來體現:

首先,所有功能的API都是開放的,可以透過任意呼叫API來完成業務邏輯。

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

2。全域性資料模型

QingStor 物件儲存架構設計及最佳實踐

上圖是QingStor物件儲存的全域性資料模型,可以理解成一個邏輯上的檢視。

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

QingStor物件儲存在Zone級別和Global級別都有相應的管理服務。

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

在同一個Zone下面可以有很多個儲存桶,儲存桶裡有各種各樣的物件資料,物件資料對型別大小沒有限制,單個儲存桶中物件的數量也沒有限制,可以無限量上傳物件資料。

3。架構解析

QingStor 物件儲存架構設計及最佳實踐

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

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

在接入子系統下是索引子系統,索引子系統用來儲存和管理物件的元資料,元資料指的是物件的Meta資訊,包括Object型別、大小、寫入時間之類的資訊,由索引子系統管理。

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

事件子系統主要工作是非同步事件處理和分散式任務排程,它是生命週期管理等功能的底層機制。

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

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

這幾個子系統構成了QingStor物件儲存後臺的主要模組。

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

QingStor物件儲存是一款儲存產品,其核心功能是做資料的讀寫,邏輯上必然不能太複雜。

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

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

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

第三,系統需要有良好的擴充套件性以應對不斷增加的資料量和請求量。

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

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

4。子系統實現

QingStor 物件儲存架構設計及最佳實踐

在接入子系統中最重要是Gateway服務,Gateway服務本質上是在後臺執行的Server,它執行在閘道器節點上。

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

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

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

使用者開始訪問物件儲存之前,會先訪問DNS伺服器,透過物件儲存服務的域名拿到一個虛擬IP地址,這個虛擬IP會指向某一臺閘道器節點,如果這個節點故障了,虛擬IP會自動遷移到另外存活的節點上。

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

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

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

透過這兩個機制,QingStor物件儲存可以保證訪問請求都可以得到響應。

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

QingStor 物件儲存架構設計及最佳實踐

接下來談談索引子系統的架構,索引子系統的主要功能是儲存和管理物件資料的元資料,元資料包括物件的型別、大小、寫入時間與儲存位置等資訊。

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

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

QingStor物件儲存是如何做到的?

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

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

新增新的節點透過協調服務進行,資料的拆分和再平衡過程是完全自動進行的。

QingStor物件儲存的Gateway服務實時跟協調服務保持連線,可以獲取最新的資料分佈情況。透過這種分片儲存機制,保證了海量資料情況下可以透過增加節點的方式來提升儲存能力。

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

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

QingStor物件儲存在單個節點上儲存元資料時使用KV儲存引擎,KV儲存引擎的索引結構是LSM,LSM索引結構最大的優勢是寫入非常快,可以提升系統的整體寫入效能。

除此之外,LSM還有一個特點,它底層的資料在磁碟上儲存時是有序的,也就是一個個sst檔案,可以提供高效的按順序查詢。

QingStor物件儲存在處理列出儲存桶中物件的查詢介面時,可以很好的應用這個儲存特性,高效地將資料按字母序列出來。因為它本身是有序儲存,所以讀取速度非常快,介面處理非常高效,這是採用KV儲存的優勢。

總體來看,QingStor物件儲存的索引子系統透過分片加協調服務的方式使其有很好的擴充套件性,同時透過副本保障資料的安全。

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

QingStor 物件儲存架構設計及最佳實踐

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

QingStor物件儲存在統一命名儲存空間下將儲存分成一個個儲存組,每個儲存組由各自的分散式檔案系統組成。

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

一是區分冷熱資料,也就是儲存分級,QingStor物件儲存提供兩種儲存級別:低頻儲存和標準儲存。

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

低頻儲存的資料量大,但訪問量會低一些。

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

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

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

QingStor物件儲存同時支援另一種擴容方式,將既有資料遷移一部分到新儲存組上,使得整個叢集比較均衡。

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

在單個儲存組內,應用QingStor檔案儲存的核心技術,採用三副本進行儲存,每次寫入資料,等到三副本寫入全部完成才會返回寫入成功,保證資料的強一致性和安全性。

本地檔案系統直接和底層的塊裝置打交道,省去了Linux本地檔案系統,使得I/O處理在效能上的得到提升。

QingStor物件儲存的資料傳輸採用RDMA高效傳輸協議,RDMA是一種在不同的節點之間傳輸資料的機制,它不需要經過CPU,直接透過硬體控制將資料從一個節點複製到另一個節點,和CPU的執行是並行的,是一種高效傳輸資料的方式。

QingStor 物件儲存架構設計及最佳實踐

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

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

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

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

Top