Gluster Storage System

Gluster - Replicated 模式

Replicated 模式的用義在於將同一份資料同時存到兩個不同的 Brick,這樣可以在其中一個 Brick 損壞時資料仍然可以正常存取。

為了提供正式環境(Production)的資料存取可靠性,可以設定兩個相同容量大小的 Brick 組成 Replicated 模式以確保儲存服務仍能繼續服務。

下圖說明了當有不同檔案寫入 Replicated Volume 的時候,其實檔案在所有的 Brick 都會存放一份。

Replicated Volume

特徵討論

資料分配

Replicated 在資料寫入的時候與 Distributed 不同,在只有兩個 Brick 做成的 Replicated Volume 會同時寫入 Brick,此時這兩個 Brick 會擁有相同的資料,通常在大型的儲存服務中較少只有兩個 Brick 整合為一個 Volume。

在 Replicated 的模式中,若有 100 個檔案寫入該 Volume,那麼該 Volume 實際上會被存放於兩個 Brick 成員。而在讀取的時候是依照反應較快的 Brick 優先取得檔案請求。

效能

在兩個 1GiB 的節點中,對整個 Volume 來看會有 200MB 的傳輸速度,但是在寫入的時候因為要同時寫入兩個不同的 Brick,所以寫入速度會減半成為 100MB。

檔案存取流程

與 Distributed 一樣,當 Client 在存取 Gluster Storage 時,使用 Native Client 與 NFS 有不同的存取流程:

  • Native Client:

    因為 Native Client 可以直接與 Gluster Storage 連接,在連接的時候 Native Client 會自動確認所屬的 Brick 是否正常而且可用,如果第一個 Birck 無法使用時會從第二個 Brick 取得檔案。使用 Native Client 掛載時其檔案在寫入時會同時直接存放於兩個 Brick,而在讀取時則直接到 Brick 取得檔案,如此一來可以真正的達到存取平行化,快速的讀寫效率以減少時間消耗。

  • NFS:

    每個 Volume 預設都可以使用 NFS 掛載(也可以設定停用),當檔案在寫入的時候會將檔案傳送至掛載的節點,再由該節點同時寫入兩個 Brick 存放;而讀取時也是由該節點取得檔案再回傳給 NFS Client。

節點 / Brick 損毀

如果您的檔案放在 Replicated Volume 上,經由上述的討論可以得知它們會在所有的 Brick 上都擁有一份相同的檔案,假設一個 Volume 的 Brick 成員為 brick_01 與 brick_02,在 brick_01 損毀的時候,Client 仍然會自動從 brick_02 取得,而且 Client 不會知道 brick_01 已經損毀,所有檔案也都存在。

當 brick_01 成功啟用之後,Gluster 會自動同步 brick_01 與 brick_02 的差異檔案,在此時 Client 只會從 brick_02 中取得資料直到 brick_01 與 brick_02 同步完成。

因此當一個 Replicated Volume 的其中一個 Brick 損毀時,檔案仍然可以存取,在損毀的 Brick 重新上線時一樣會保持有兩份相同的檔案。

容量

Replicated 是將同一份檔案寫成兩份,其作用如同磁碟陣列的 RAID 1 一樣,在上述的條件下 brick_01 與 brick_02 都擁有 10GB 的空間,因為同樣的資料要分別存入 Brick,所以所有的可用空間也會只有 10GB。

開始設定 volume

Gluster Volume 設定

在設定 Volume 時只需要在任何一個節點(必須在同一個 Storage Pool 中)設定即可,而不用在每一台節點設定。

延續著先前的環境條件,我們試著建立一個 volume 名稱為 repl_vol,而其 Brick 成員為 S1 - brick_02S2 - brick_02。因為每個 brick 已經被分配了 10GB 的空間,所以在 repl_vol 完成被 Client 掛載之後應該會有 10GB 的可用容量。

  1. 建立 Volume

     root # gluster volume create repl_vol \
     > S1:/bricks/brick_02/brick \
     > S2:/bricks/brick_02/brick
    

    如果在這個過程發生錯誤,請確認節點是否存在、目錄是確正確與節點是否已被加入 Storage Pool

  2. 啟用 Volume

     root # gluster volume start repl_vol
    
  3. 查看 Volume 狀態

     root # gluster volume info repl_vol
    

經過以上三個步驟就完成了 volume 的設定,非常簡短。

Client 存取設定

在 Red Hat Enterprise Linux 與 CentOS 下,可以使用 Native Client 直接與 Volume 連接,或是使用 NFS 掛載。

  • Native Client:

    在使用 Native Client 之前要先確認已經安裝了 glusterfs-fuse 的 RPM 套件,而連接 Volume 的方法就跟掛載磁碟一樣簡單:

      root # mount -t glusterfs rw S1:/repl_vol /mnt/repl_vol
    

    上述指令會將 S1 的 Volume(dist_vol)掛載到 /mnt/repl_vol,在掛載的同時 S1 也會傳送相關的 brick 資訊給 Client。

    如果要在開機的時候就掛載該 volume,那麼就需要在 /etc/fstab 中設定(該設定會啟用 ACL 功能):

      S1:/repl_vol    /mnt/repl_vol    glusterfs    _netdev,rw,acl    0    0
    
  • NFS:

    NFS 掛載的方法就如同以往一樣沒有改變:

      root # mount -t nfs rw S1:/repl_vol /mnt/dist_vol
    

    若要在開機時啟用則設定 /etc/fstab

      S1:/dist_vol    /mnt/repl_vol    nfs    rw    0    0
    

更換 Brick

通常建置完成好之後就很少會再更動設備,除非遇到設備更新或是損毀後的修複。不管任何原因,Gluster 都允許你進行線上更換 Brick,也就是在更換 Brick 的時候不用讓你的服務停止,而且使用者可以繼續操作檔案。

只要 Brick 有所變動,基本上就會在更換的時候耗用較大的 CPU 與網路流量,因為 Gluster 要把資料從來源端複製到新的 Brick 上,但時間與資源消耗要看資料量的大小來決定。Brick 變更的時候雖然不會影響使用者的操作,但是會增加些許的延遲時間,感覺得來就會覺得像時存取效能變慢,但在 Brick 轉換完成之後一切就會恢複正常。

Brick 在更換的過程中,是由 Server 端的主機做資料移轉而不是 Client,所以在整個後端資料流與網路會較為忙碌。

更換 Brick 可以使用 replace-brick 完成,其整體的語法如下:

root # gluster volume replace-brick [VOL_NAME] [OLD_BRICK] [NEW_BRICK] [start | status | commit]

直接替換 Brick

更換 Brick 前請先確定所屬節點已被加入 Storage Pool。

假設在名稱為 dist_vol 的 Volume 我們使用 S3:/bricks/brick_02/brick 替換 S1:/bricks/brick_02/brick,那麼實做的方法如下:

  1. 設定替換作業

     root # glsuter volume replace-brick repl_vol \
     S1:/bricks/brick_02/brick \
     S3:/bricks/brick_02/brick \
     start
    
  2. 查看 Brick 檔案移動狀態

     root # glsuter volume replace-brick repl_vol \
     S1:/bricks/brick_02/brick \
     S3:/bricks/brick_02/brick \
     status
     volume replace-brick: success: Number of files migrated = 1     Migration complete
    
  3. 通知 Volume 確認移除舊的 Brick

     root # glsuter volume replace-brick repl_vol \
     S1:/bricks/brick_02/brick \
     S3:/bricks/brick_02/brick \
     commit
    

    請使用 status 確認所有的檔案已經在完成(complete)狀態再進行 commit

  4. 確認 volume 成員

     root # gluster volume info repl_vol
    

新增 Brick

在只有兩個 Brick 的 Replicated Volume 無法新增 Brick。