第二章、 文獻探討
4、 雲端儲存技術及其發展
4.3 OpenStack Swift
OpenStack 是一個開放原始碼的雲端運算管理平台專案,有幾個主要的元件 組合起來完成具體工作,而 Swift 則為其中的物件儲存(Object Storage)元件。有 別於傳統檔案系統,OpenStack Swift 就像 Amazon S3 一樣,是一個儲存,例如:
虛擬機映像檔、照片、email、備份和檔案與其他非結構化資料的分散式儲存系 統,並提供良好的可擴充性(Scalable)、冗餘性(Redundancy)和牢靠性(Durable)。
OpenStack Swift 可以安裝在一般的商用硬體上,這表示標準、低成本的伺服 器組件可以用來建置儲存系統。藉由 Swift 提供邏輯上的資料管理而不是廠商專 有的硬體,可以輕易的彈性部署、擴充儲存系統,這就是軟體定義儲存本質上所 定義的。
OpenStack Swift 由八個處理程序(Processes)和服務(Services)組成其架構,分 別為:Proxy Server、The Ring、Object Server、Container Server、Account Server、
Replicator、Updaters 和 Auditors,以下將以 Swift 功能面分別探討各元件。
( 1 ). 伺服器處理程序
Swift 的伺服器處理程序(Server Processes)包含 Proxy、Account、Container 和 Object。當一個節點上單獨執行 Proxy Server,則稱該節點為代理節點(Proxy Node),而當一個節點上至少執行了 Account、Container 和 Object Server 三者其
中一項,則稱之為儲存節點(Storage Node),如圖七所示,儲存節點上還會執行 其他服務以維持資料的一致性。
圖 十三:儲存節點(引用自 SwiftStack 官方網站)
Proxy Server
代理伺服器(Proxy Server)為 Swift 架構中對內的溝通橋梁,且是對外部的客 戶端溝通的唯一管道,在上面的所有訊息傳遞都是透過標準的 HTTP 動詞,例如:
GET、PUT、POST 以及 DELETE。代理伺服器採用 shared-nothing 架構,表示其 一個部署的代理節點(Proxy Node)都是獨立、自給的,且它可以根據負載需求來 進行擴充,在一個 Swift 叢集之中應該至少要部署兩個代理節點,當其中一個出 問題,另一個可以接手。
Account Server
帳號伺服器(Account Server)提供每一個帳號(Account)的 Metadata 和帳號內 的容器(Container)列表,其資料存在於 SQLite 資料庫中。
Container Server
容器伺服器(Container Server)的主要工作為管理其 Metadata 和提供容器內所 擁有的物件(Object)列表。容器伺服器不知道物件的存放位置,只知道物件所屬 的容器,其資料存在於 SQLite 資料庫中。
Object Server
物件伺服器(Object Server)提供了二進位大型物件(Blob)儲存服務,可以儲存、
檢索和刪除位於節點硬碟上的物件。物件是使用其包含 Partition 的路徑和操作的 時間戳記(Timestamp)在硬碟上存為二進位檔案,時間戳記可以讓物件伺服器儲 存該物件的多個版本,並找到最新版本。除此之外,物件的 Metadata 是存放在 檔案的延伸屬性(xattrs),這樣的設計可以確保物件資料和 Metadata 儲存在一起。
( 2 ). 一致性處理程序
OpenStack Swift 是很 牢靠的,主要是因 為 一致性處理程序 (Consistency Processes),其是用來處理故障,並且能夠找到和更正無論是資料損壞或是硬體 故障所引起的錯誤。一致性處理程序主要包含兩個服務 Auditors 和 Replicators,
這兩個服務會在儲存節點上執行以確保資料整合性和可用性。
Auditors
稽核器(Auditors)會在所有儲存節點上背景執行,帳號、容器和物件伺服器 皆會有相對應的稽核器服務,其會不斷掃瞄所在節點上整個硬碟內儲存資料的完 整性,確保沒有資料損壞。當錯誤發生稽核器會把損壞的資料移動到隔離區。
Replicators
複寫器(Replicators)會在所有儲存節點(Storage Node)上背景執行,帳號、容 器和物件伺服器皆會有相對應的複寫器服務,其會不斷檢查所在節點上的資料和 叢集內其他節點上對應的資料,如果其他節點上的資料是比較舊的或是遺失,則 複寫器會推送(Push)一份所在節點上的資料過去更新,而如果所在節點上的資料 是比較舊或是遺失,則不會從其他節點拉(Pull)一份資料過來。
複寫器也處理物件和容器的刪除,物件刪除藉由建立一個 0 位元組的且以.ts 為副檔名的墓碑檔案作為該檔案的最新版本,而複寫器會把該墓碑檔案推送到其 他節點也作為此檔案的最新版本,如此該物件就代表被整個系統所刪除。容器刪 除則藉由把該容器標記為已刪除,複寫器則會把這個版本推送到其他節點,如此
該容器就代表被整個系統所刪除。
Updaters
分為容器更新器(Container Updater)和物件更新器(Object Updater),容器更新 器主要工作是確保帳號的容器列表是最新的,除此之外,還會更新存放在帳號的 Metadata,包含物件數量、容器數量和總共使用了多少位元組。物件更新器則是 作為一個備援機制,更新容器內的物件清單,該工作主要是由物件伺服器來執行,
當失敗時才會由物件更新器來執行確認物件清單並進行更新存放在容器的 Metadata 的物件數量和總共使用的位元組資料。
( 3 ). 資料存取
Swift 為了有效的跨叢集來存放資料,並可以快速存取,其資料存放模型如 圖八,其中一個儲存節點內可能會有很多個硬碟(Disk),而 Partition 則是目錄的 概念,所以每一個硬碟內則會有多個 Partition。
圖 十四:儲存節點、硬碟和 Partition 關係(引用自 SwiftStack 官方網站) 帳號、容器和物件資料是分散存放在多個節點之上,當伺服器處理程序和一 致性處理程序需要對資料進行操作時,會利用資料的儲存位置,例如:(/account, /account/container, /account/container/object)向 對應的 Account Ring 、 Container Ring 和 Object Ring 來找到資料所在的位置。
The Ring
Ring 用於記錄儲存實體與物理位置之間的對應(Mapping)關係,並由一致性
雜湊(Hash)演算法所產生。Ring 存在於叢集內的每一個節點上,Ring 中每一個 Partition 在叢集中都預設有 3 個副本(Replica),且 Ring 會維護其位置。