天天看點

Fastdfs分布式檔案系統原理淺析

文章目錄

      • 1、fastdfs檔案系統原理簡述
      • 2、storage server狀态
        • 2.1 組内新增加一台storage server A時,由系統自動完成已有資料同步,處理邏輯如下:
          • 第一步:
          • 第二步:
          • 第三步:
          • 第四步:
      • 3、同步時間管理
      • 4、Binlog檔案
      • 5、Storage Server具體同步過程
      • 6、上傳和下載下傳流程
      • 7、參考

1、fastdfs檔案系統原理簡述

Fastdfs分布式檔案系統原理淺析

tracker server的配置檔案中沒有出現storage server,而storage server的配置檔案中會列舉出所有的tracker server。

這就決定了storage server和tracker server之間的連接配接由storage server主動發起,storage server為每個tracker server啟動一個線程進行連接配接和通訊。

tracker server會在記憶體中儲存storage分組及各個組下的storage server,并将連接配接過自己的storage server及其分組

儲存到檔案中,以便下次重新開機服務時能直接從本地磁盤中獲得storage相關資訊。storage server會在記憶體中記錄本組的所有伺服器,

并将伺服器資訊記錄到檔案中。tracker server和storage server之間互相同步storage server清單:

  1. 如果一個組内增加了新的storage server或者storage server的狀态發生了改變,tracker server都會将storage server清單同步給該組内的所有storage server。以新增storage server為例,因為新加入的storage server主動連接配接tracker server,tracker server發現有新的storage server加入,就會将該組内所有的storage server傳回給新加入的storage server,并重新将該組的storage server清單傳回給該組内的其他storage server;
  2. 如果新增加一台tracker server,storage server連接配接該tracker server,發現該tracker server傳回的本組storage server清單比本機記錄的要少,就會将該tracker server上沒有的storage server同步給該tracker server。

同一組内的storage server之間是對等的,檔案上傳、删除等操作可以在任意一台storage server上進行。檔案同步隻在同組内的storage server之間進行,采用push方式,即源伺服器同步給目标伺服器。以檔案上傳為例,假設一個組内有3台storage server A、B和C,檔案F上傳到伺服器B,由B将檔案F同步到其餘的兩台伺服器A和C。我們不妨把檔案F上傳到伺服器B的操作為源頭操作,在伺服器B上的F檔案為源頭資料;檔案F被同步到伺服器A和C的操作為備份操作,在A和C上的F檔案為備份資料。

同步規則總結如下:

  1. 隻在本組内的storage server之間進行同步;
  2. 源頭資料才需要同步,備份資料不需要再次同步,否則就構成環路了;
  3. 上述第二條規則有個例外,就是新增加一台storage server時,由已有的一台storage server将已有的所有資料(包括源頭資料和備份資料)同步給該新增伺服器;

2、storage server狀态

FDFS_STORAGE_STATUS_INIT      :初始化,尚未得到同步已有資料的源伺服器
FDFS_STORAGE_STATUS_WAIT_SYNC :等待同步,已得到同步已有資料的源伺服器
FDFS_STORAGE_STATUS_SYNCING   :同步中
FDFS_STORAGE_STATUS_DELETED   :已删除,該伺服器從本組中摘除(注:本狀态的功能尚未實作)
FDFS_STORAGE_STATUS_OFFLINE   :離線
FDFS_STORAGE_STATUS_ONLINE    :線上,尚不能提供服務
FDFS_STORAGE_STATUS_ACTIVE    :線上,可以提供服務
           

2.1 組内新增加一台storage server A時,由系統自動完成已有資料同步,處理邏輯如下:

第一步:

storage server A連接配接tracker server,tracker server将storage server A的狀态設定為FDFS_STORAGE_STATUS_INIT。storage server A詢問追加同步的源伺服器和追加同步截至時間點,如果該組内隻有storage server A或該組内已成功上傳的檔案數為0,則沒有資料需要同步,storage server A就可以提供線上服務,此時tracker将其狀态設定為FDFS_STORAGE_STATUS_ONLINE,否則tracker server将其狀态設定為FDFS_STORAGE_STATUS_WAIT_SYNC,進入第二步的處理;

第二步:

假設tracker server配置設定向storage server A同步已有資料的源storage server為B。同組的storage server和tracker server通訊得知新增了storage server A,将啟動同步線程,并向tracker server詢問向storage server A追加同步的源伺服器和截至時間點。storage server B将把截至時間點之前的所有資料同步給storage server A;而其餘的storage server從截至時間點之後進行正常同步,隻把源頭資料同步給storage server A。到了截至時間點之後,storage server B對storage server A的同步将由追加同步切換為正常同步,隻同步源頭資料;

第三步:

storage server B向storage server A同步完所有資料,暫時沒有資料要同步時,storage server B請求tracker server将storage server A的狀态設定為FDFS_STORAGE_STATUS_ONLINE;

第四步:

當storage server A向tracker server發起heart beat時,tracker server将其狀态更改為FDFS_STORAGE_STATUS_ACTIVE。

3、同步時間管理

從上面了解了fastdfs檔案系統中組内的多個storage server之間同步的機制,那檔案同步是什麼時候進行呢?是檔案上傳成功後,其它的storage server才開始同步,其它的storage server怎麼去感覺,tracker server是怎麼通知storage server呢?

當一個檔案上傳成功後,用戶端馬上發起對該檔案下載下傳請求(或删除請求)時,tracker是如何標明一個适用的存儲伺服器呢?

其實每個存儲伺服器都需要定時将自身的資訊上報給tracker,這些資訊就包括了本地同步時間(即,同步到的最新檔案的時間戳)。

而tracker根據各個存儲伺服器的上報情況,就能夠知道剛剛上傳的檔案,在該存儲組中是否已完成了同步。在storage server中這些資訊是

以Binlog檔案的形式存在的。

4、Binlog檔案

當Storaged server啟動時會建立一個 base_path/data/sync 同步目錄,該目錄中的檔案都是和同組内的其它 Storaged server之間的同步狀态檔案,如192.168.1.2_23001.mark、 192.168.1.3_23001.mark、 binlog.000、binlog_index.dat;

Binlog檔案内容:在該檔案中是以binlog日志組成,比如:

1653482441 c M00/00/00/wKgCU2KOI8mAQ45iAAI2W1kwaRk715.jpg

1653482449 C M00/00/00/wKgCU2KOI9GAUF7DAAIFk_wQ4xI485.jpg

1653482449 d M00/00/00/wKgCU2KOI9GAJ6qIAABe0Hy7THE119.jpg

1653495360 D M00/00/00/wKgCU2KOVkCAA7jEAARNo91NgIc894.jpg

其中的每一條記錄都是使用空格符分成三個字段,分别為:

第一個字段 表示檔案upload時間戳 如:1653482441

第二個字段 表示檔案執行操作,值為下面幾種:

C表示源建立、c表示副本建立

A表示源追加、a表示副本追加

D表示源删除、d表示副本删除

T表示源Truncate、t表示副本Truncate

其中源表示用戶端直接操作的那個Storage即為源,其他的Storage都為副本.

第三個字段 表示檔案辨別, 如:M00/00/00/wKgCU2KOVkCAA7jEAARNo91NgIc894.jpg

5、Storage Server具體同步過程

Storaged server之間的同步都是由一個獨立線程負責的,這個線程中的所有操作都是以同步方式

執行的。比如一組伺服器有A、B、C三台機器,那麼在每台機器上都有兩個線程負責同步,如A機器,線程1負責同步資料到B,線程2負責同步資料到C。每個同步線程負責到一台Storage的同步,以阻塞方式進行。

以IP為192.168.1.1的Storaged severe的伺服器為例,它的同步目錄下有192.168.1.2_23001.mark、192.168.1.3_23002.mark、binlog.100等檔案。

現在192.168.1.1向192.168.1.2同步資料:

  1. 打開對應92.168.1.2的mark檔案(192.168.1.2_23001.mark),從中讀取binlog_index、binlog_offset兩個字段值,如取到值為:0、1000,那麼就打開binlog.000檔案,seek到1000這個位置。
  2. 進入一個while循環,嘗試着讀取一行,若讀取不到則睡眠等待。若讀取到一行,并且該行的操作方式為源操作,如C、A、D、T(大寫的都是),則将該行指定的操作同步給對方(非源操作不需要同步),同步成功後更新binlog_offset标志,該值會定期寫入到192.168.1.2_23001.mark檔案之中。

6、上傳和下載下傳流程

Fastdfs分布式檔案系統原理淺析

7、參考

Chinaunix FastDFS讨論區

繼續閱讀