1. 程式人生 > 程式設計 >經典分散式論文閱讀:Frangipani

經典分散式論文閱讀:Frangipani

本文是Frangipani論文的閱讀筆記,Frangipani是一個建立在Petal之上的分散式檔案系統,採用分散式鎖來保證一致性。其中Petal是一個增量擴充套件、高可用可以自動管理的分散式虛擬磁碟。

總覽

Frangipani最為顯著的特性為——一組機器使用一個公共儲存,使用鎖進行同步訪問。要求的其他特性包括:

  1. 所有使用者看到檔案的一致檢視
  2. 更多的伺服器可以很方便地新增到叢集中來擴充套件容量和頻寬而不需要改變已有伺服器的配置甚至打斷它們執行
  3. 管理員可以新增使用者而不需要擔心資料如何被管理
  4. 可以在不打斷系統執行的情況下進行全域性一致備份
  5. 可以在不需要運維介入的情況下從機器故障、網路故障以及磁碟故障中恢復

系統結構

元件

使用者程式使用系統呼叫(檔案系統)訪問Frangipani檔案系統,任何修改快取在核心緩衝區中,直到呼叫fsync或者sync才被寫入,顯然Frangipani檔案系統模組需要執行在作業系統核心中。所有的檔案系統讀寫Petal上相同的資料結構,但是在虛擬磁碟上獨立儲存各自的redo日誌。Petal提供了巨大、可擴充套件、容錯的虛擬硬碟,而鎖服務實現了多讀單寫鎖。

安全性和客戶端/伺服器配置

Frangipani執行在可信環境中,並沒有設計安全措施。如果需要在不可信環境使用Frangipani,可以將包含Petal的Frangipani伺服器部署在可信環境,然後將不包含Petal的客戶端和Frangipani伺服器連線。

磁碟佈局

Petal為Frangipani提供了一個巨大的虛擬磁碟空間,地址空間大小為2^{64},虛擬磁碟使用方式如下:

  • 第一個區域(1TB)儲存共享的配置引數和內部資訊;
  • 第二個區域(1TB)儲存日誌,每個伺服器擁有私有的日誌,目前劃分了256個空間,因此最多支援256個Frangipani伺服器;
  • 第三個區域(3TB)儲存點陣圖,追蹤剩餘區域中的空閒塊;
  • 第四個區域(1TB)儲存i節點,每個i節點大小為512B;
  • 第五個區域(128TB)儲存小資料塊,每個資料塊為4KB;
  • 剩餘區域儲存大資料塊,每個資料塊為1TB。

比64KB小的檔案只儲存在小資料塊中,更大的檔案儲存在16個小資料塊加上1個大資料塊中,檔案大小不能超過16個小資料塊加上1個大資料塊的容量。

日誌和恢復

Frangipani儲存元資料的REDO日誌來簡化故障恢復和提升效能,使用者資料不會記錄。當Frangipani奔潰之後,系統檢測到故障,使用日誌進行恢復。為了保證日誌和恢復正常工作需要保證:

  1. 不同伺服器在同一資料上的操作必須是序列化的;
  2. 只會恢復那些擁有鎖狀態的日誌;
  3. 對於一個伺服器,只有一個恢復程式在工作。

同步和快取一致性

Frangipani使用了多讀取/單寫入鎖來保證同步性。讀取鎖允許伺服器從磁碟讀取資料並快取,在釋放讀取鎖之前需要讓快取失效。寫入鎖允許伺服器讀寫資料並快取,但是在釋放之前需要將快取中的髒資料寫入磁碟。作者將磁碟上的結構分割成可以加鎖的分塊,包括每個日誌,點陣圖、檔案、目錄以及符號連結。避免死鎖主要靠順序加鎖和解鎖,伺服器首先需要知道所有需要獲得的鎖,然後進行排序,按照順序獲取和解鎖。

鎖服務

鎖服務提供了多讀取/單寫入鎖,客戶端會一直持有鎖,直到別的有衝突的客戶端請求。鎖服務使用租期來處理故障,每個客戶端會請求一個租期,每個鎖會和租期對應,客戶端需要在過期之前重新整理租期,如果客戶端租期過期,那麼就認為已經崩潰了。

作者先後嘗試了三種鎖服務方案:

  • 中心化的服務:缺點是難以容錯
  • 儲存在Petal:缺點是效能比較差
  • 容錯可擴充套件儲存:和Petal伺服器繫結

增加和移除伺服器

增加伺服器非常簡單,只需要告知使用哪個Petal虛擬磁碟,以及如何找到鎖服務。新伺服器會聯絡鎖服務獲得租期,確定日誌儲存位置,然後開始處理操作。移除伺服器就更加簡單了,直接關閉即可。

備份

Petal能夠在任何時間建立一份虛擬磁碟的拷貝。如果想要實現檔案系統層面的備份,可以阻塞檔案系統呼叫後進行備份。

參考文獻

  1. Thekkath,Chandramohan A.,Timothy Mann,and Edward K. Lee. "Frangipani: A scalable distributed file system." SOSP. Vol. 97. 1997.