文章目錄
-
-
- 1、fastdfs檔案系統原理簡述
- 2、storage server狀态
-
- 2.1 組内新增加一台storage server A時,由系統自動完成已有資料同步,處理邏輯如下:
-
- 第一步:
- 第二步:
- 第三步:
- 第四步:
- 3、同步時間管理
- 4、Binlog檔案
- 5、Storage Server具體同步過程
- 6、上傳和下載下傳流程
- 7、參考
-
1、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清單:
- 如果一個組内增加了新的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;
- 如果新增加一台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檔案為備份資料。
同步規則總結如下:
- 隻在本組内的storage server之間進行同步;
- 源頭資料才需要同步,備份資料不需要再次同步,否則就構成環路了;
- 上述第二條規則有個例外,就是新增加一台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同步資料:
- 打開對應92.168.1.2的mark檔案(192.168.1.2_23001.mark),從中讀取binlog_index、binlog_offset兩個字段值,如取到值為:0、1000,那麼就打開binlog.000檔案,seek到1000這個位置。
- 進入一個while循環,嘗試着讀取一行,若讀取不到則睡眠等待。若讀取到一行,并且該行的操作方式為源操作,如C、A、D、T(大寫的都是),則将該行指定的操作同步給對方(非源操作不需要同步),同步成功後更新binlog_offset标志,該值會定期寫入到192.168.1.2_23001.mark檔案之中。
6、上傳和下載下傳流程
7、參考
Chinaunix FastDFS讨論區