OpenStack - swift 組件

簡介

  • swift 是對象存儲的一種。

  • 比較適合存放靜態數據(長期不會發生更新、或更新頻率比較低的數據)。

  • 存儲的邏輯單元是對象。

架構

swift 從架構上可分爲訪問層存儲層

  • 訪問層包含 Proxy Node 和 Authentication兩部分,分別負責請求的處理和用戶身份認證。

    Proxy Node 上運行有 Proxy Server,Proxy Server 可以使用 Memcached 來進行數據和對象的緩存,以提高用戶訪問速度。

  • 存儲層由一系列的物理存儲節點組成,負責對象數據的存儲。Proxy Node 收到用戶的訪問請求時,會將其轉發到對應的存儲節點上。

    存儲層在物理上又分爲以下層次:

    • Region:地理上彼此隔絕的區域,如兩個省、兩個州。
    • Zone:在每個 Region 內部又劃分了不同的 Zone 來實現硬件上的隔絕。可簡單理解爲一個 Zone 代表一組獨立的存儲節點。
    • Storage Node:存儲對象數據的物理節點。
    • Device:可簡單理解爲磁盤。
    • Partition:Device 上的文件系統中的目錄。

    在這裏插入圖片描述


對象組織結構

每個 Storage Node 上存儲的對象在邏輯上又由三個層次組成:Account、Container 和 Object 。

  • Account:實現頂層隔離,表示一個租戶,一個 Account 可被多個賬戶共同使用。
  • Container:代表了一組對象的封裝,類似一個目錄,但不能嵌套。
  • Object:即具體的對象,由元數據和內容兩部分組成。

在這裏插入圖片描述

與上述三層對應,Storage Node 上運行有三種服務:

  • Account Server:提供 Account 相關的服務,如,獲取其所包含的 Container 列表。
  • Container Server:提供 Container 相關的服務,如,獲取其所包含的 Object 列表。
  • Object Server:提供對象的存取和元數據服務。每個對象的內容會以二進制文件的形式存儲在文件系統中,元數據則作爲文件的擴展屬性來存儲。

冗餘

swift 爲每個對象都建立了一定量的副本,並且每個副本存放在不同的 Zone 中。

副本是以 Partition 爲單位的。即,對象的副本是通過 Partition 的副本來實現的。

swift 通過以下三種服務來解決副本之間的數據一致性問題:

  • Auditor:持續掃描磁盤以檢查 Account、Container 和 Object 的完整性。當發現數據不一致時,會對文件進行隔離,然後通過 Replicator 進行恢復。
  • Updater:創建 Container 時,需要更新其對應的 Account;創建 Object 時,需要更新其對應的 Container。對於那些沒有成功的更新操作,swift 會使用 Updater 繼續處理。
  • Replicator:負責檢查各個節點上的副本是否一致。當發現不一致時,會將過時的的副本更新爲最新版本,並負責將那些標記爲刪除的數據從物理介質上刪除。

Ring

如何將對象與物理存儲位置相映射?swift 通過引入 Ring 來解決此問題。

  • Ring 記錄了對象與物理存儲位置之間的映射關係。

  • Account、Container 和 Object 都有自己獨立的 Ring。這些 Ring 由 Proxy Server 來維護。當 Proxy Server 接收到用戶請求時,會根據所操作的實體(Account、Container 或 Object)尋找對應的 Ring,來確定它們的物理存儲位置。

  • Ring 需要在 swift 部署時使用 swfit-ring-builer 工具構建,之後每次增減存儲節點時,都需要進行重平衡,以保證系統因此而發生遷移的文件數量最少。

在這裏插入圖片描述

爲了減少節點增減所帶來的代價,swift 採用一致性 HASH 算法來構建 Ring。從而使得,當節點數量發生改變時,儘量少地改變已存在的對象與節點間的映射關係,大大減少需要遷移的對象數量。

一致性 HASH 計算過程如下:

  • 設虛擬空間爲 2 的 32 次方,共有 2m2^m 個存儲節點;那麼將虛擬空間分爲成 2m2^m 等份,每份長度爲 2(32m)2^{(32-m)}

  • 計算每個對象名稱的 HASH 值,設結果爲 n,則其存儲節點爲 n/2(32m)n / 2^{(32-m)}。(即,將 n 向右位移 (32-m) 位)

以 m=2 爲例:
img

Ring 的數據結構包含以下三部分:

  • 設備列表:其中每一項都是一個字典,每個字典對應一個 Device,其包含的信息主要有:Device ID、所在的 Region、所在的 Zone、IP 地址、端口號、Device 的權重等。
  • Partition 分配表(設備查詢表):其中的每一項(行)都是一個數組,每個數組對應一個副本,數組的長度就是 Partition 的數量(即每一列對應一個 Partition),數組的每個元素就是 Device ID。
  • Partition 移位值:HASH 之後向右位移的位數。

在這裏插入圖片描述

在這裏插入圖片描述


Storage Policy

一個 Storage Policy 可簡單理解爲一種存儲方式或策略,如,爲每一個 Partition 創建兩個副本。

每一個 Container 都有對應的一個 Storage Policy 。在 Container 裏面創建的 Object 都將採用這個 Container 所關聯的 Storage Policy 。


發佈了118 篇原創文章 · 獲贊 18 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章