Gluster Storage System

Gluster - Dispersed 模式

Dispersed Volume 從 Gluster 3.6 版本開始提供;而商業版本是從 Red Hat Gluster Storage 3.1 開始提功此一功能。

簡單來說,Dispersed 最大特性是保有了 Stripe 與 Replicated 的特性,也可以看成網路架構的 RAID 5/6 模式。

Dispersed Volume 使用 Erasure Code 保護資料的完整性,當檔案寫入 Volume 後,會被拆解成指定數量的份數,而每一份包含有資料檢查碼以確保資料的完整性,在 Volume 中,可以同時損毀的數量為 Redundancy 的指定值,只要損毀的數量不超過 Redundancy 值則仍可繼續值行。

Dispersed Volume

特徵討論

資料分配

當一份 80MB 檔案寫入 Dispersed Volume 時,該檔案會被分散為其 Brick Data 個數,比方一個 Dispersed Volume 包含有 10 個 Brick,而資料量為 8 個 Brick;Redundancy 為 2 個 Brick,那麼資料在寫入的時候會被拆為 8 個部份,也就是 10MB,每個 Brick 都會包含了其它部份檢查碼(使用 EC)。

Disperse Read

假設資料分配為 8 + 2 且沒有損毀的條件下,資料塊讀取是由 Rabin IDA 方法從 8 個 Bricks 取出,而不取回 Redundancy 資訊。

因此在讀取時資料會較為快速。

Disperse Write

假設資料分配為 8 + 2 的配置條件下,資料塊寫入是會使用 Rabin IDA 法方寫入 10 個 Bricks,並加上 EC 資訊。

在寫入時會較讀取慢。

節點 / Brick 損毀

若在 Dispersed Volume 中配置為 Disperse 10;Redundancy 為 2 的情況之下,代表在同一時間可以有 2 個 Brick 損毀而不會照成資料移失,也就是說在資料可靠性的決定權是在於 Redundancy 的配置數量。

容量

Dispersed Volume 容量消耗比率計算方式為:R / B,R 為 Redundancy 數量;B 為所有 Brick 數量。

比方有 12 個 1TB Bricks;那麼在 10(Data)+ 2(Redundancy)、全部容量為 72TB 的配置下,一共會消耗 (2 / (10 + 2)) * 72 = 12TB 的大小,而總計可用空間總大小為 72TB - 12TB = 60TB。

效能

Gluster 的特點之一就是節點越多、傳送效能越好,但是如果在一個 Volume 中包含了高可靠性的需求,其效能就會減少一些。

一個包含有 Replicated 機制的 Volume,在檔案寫入時需要再耗費一倍的網路效能,而 Dispersed 是由 Bricks 的數量與 Redundancy 的數量計算其網路使用量。以下表簡單比較:

Network Load

假設原本的檔案為 20MB,在 Dispersed Volue 的情況下,只要節點數與 Brick 數量越多,其網路使用量也會降低。

開始設定 volume

Gluster Volume 設定

本例示範建立一個 Dispersed Volume,並且擁有 1 個 Redundancy(同一時間可損毀 1 個 Brick)。

  • gfs-01:/bricks/dispersed/brick
  • gfs-02:/bricks/dispersed/brick
  • gfs-03:/bricks/dispersed/brick
  • gfs-04:/bricks/dispersed/brick
  • gfs-05:/bricks/dispersed/brick

  • 建立 Volume

     root # gluster volume create disp_vol disperse 5 redundancy 1 \
     > gfs-01:/bricks/dispersed/brick/ \
     > gfs-02:/bricks/dispersed/brick/ \
     > gfs-03:/bricks/dispersed/brick/ \
     > gfs-04:/bricks/dispersed/brick/ \
     > gfs-05:/bricks/dispersed/brick/
    
  • 啟用 Volume

     root # gluster volume start disp_vol
    
  • 查看 Volume 資訊

     root # gluster volume info disp_vol
     Volume Name: disp_vol
     Type: Disperse
     Volume ID: e3daa687-8f7f-42c4-b458-c7821acccbef
     Status: Started
     Number of Bricks: 1 x (4 + 1) = 5
     Transport-type: tcp
     Bricks:
     Brick1: gfs-01:/bricks/dispersed/brick
     Brick2: gfs-02:/bricks/dispersed/brick
     Brick3: gfs-03:/bricks/dispersed/brick
     Brick4: gfs-04:/bricks/dispersed/brick
     Brick5: gfs-05:/bricks/dispersed/brick
     Options Reconfigured:
     nfs.disable: off
    

更換 Brick

因為 Dispersed Volume 本身擁有高可用性特性,所以您可以放心的將新的 Brick 取代舊有 Brick,使用 force 參數可以更快的完成 Brick 取代的作業。

本例使用 gfs-06:/bricks/dispersed/brick 來更換 gfs-02:/bricks/dispersed/brick

root # gluster volume replace-brick disp_vol \
> gfs-02:/bricks/dispersed/brick/ \
> gfs-06:/bricks/dispersed/brick/ \
> commit force

對於更換完成的 Brick,Gluster 會自動將檔案補齊,完成原先架構。在大部份的情況之下系統就會進行同步作業以確認檔案的完整性。

新增 Brick

與 Stripe 一樣,一旦您一開始設定了 Volume 架構,爾後新增 Brick 時只能跟原先的相同或是其倍數。

  • gfs-11:/bricks/dispersed/brick
  • gfs-12:/bricks/dispersed/brick
  • gfs-13:/bricks/dispersed/brick
  • gfs-14:/bricks/dispersed/brick
  • gfs-15:/bricks/dispersed/brick

      root # gluster volume add-brick disp_vol disperse 5 redundancy 1 \
      > gfs-11:/bricks/dispersed/brick/ \
      > gfs-12:/bricks/dispersed/brick/ \
      > gfs-13:/bricks/dispersed/brick/ \
      > gfs-14:/bricks/dispersed/brick/ \
      > gfs-15:/bricks/dispersed/brick/
    

完成新增後,新的一組組合將會以 Distributed 與原本的組合共同服務,所以完成後需要進行 rebalance 作業。

root # gluster volume rebalance disp_vol start