天天看點

FastDFS上傳下載下傳原了解析FastDFS分布式檔案系統概述fastDFS架構原理fastDFS上傳fastDFS下載下傳fastDFS同步

FastDFS分布式檔案系統概述

概述

  • FastDFS是一個輕量級的開源分布式檔案系統
  • FastDFS主要解決了大容量的檔案存儲和高并發通路的問題,檔案存取時實作了負載均衡
  • FastDFS實作了軟體方式的RAID,可以使用廉價的IDE硬碟進行存儲
  • 支援存儲伺服器線上擴容
  • 支援相同内容的檔案隻儲存一份,節約磁盤空間
  • FastDFS隻能通過Client API通路,不支援POSIX通路方式
  • FastDFS特别适合大中型網站使用,用來存儲資源檔案(如:圖檔、文檔、音頻、視訊等等)

FastDFS與集中存儲方案的對比 

FastDFS上傳下載下傳原了解析FastDFS分布式檔案系統概述fastDFS架構原理fastDFS上傳fastDFS下載下傳fastDFS同步

fastDFS架構原理

組成

  1. 用戶端
  2. 通路伺服器(TrackerServer)
  3. 存儲伺服器(StorageServer)
FastDFS上傳下載下傳原了解析FastDFS分布式檔案系統概述fastDFS架構原理fastDFS上傳fastDFS下載下傳fastDFS同步

1、用戶端

  1. 通常是隻開發人員編寫的應用程式,通過api用來調用tracker和storage

2、通路伺服器TrackerServer

trackerServer是通路伺服器,是通路storageServer的入口

作用

  1. 管理storage叢集,storgae啟動時,可自行注冊狀态到跟蹤伺服器上,并定期報告自身資訊,包括磁盤存儲空間、檔案同步狀況、檔案上傳下載下傳次數統計等
  2. 服務入口,用戶端通路storage之前,必須通過tracker,動态擷取storage的連接配接資訊
  3. TrackerServer的高可用
  4. 一個fastdfs叢集可以有多個tracker節點,自主選擇一個leader節點

3、存儲伺服器StorageServer

  1. storage是資料存儲伺服器,檔案和中繼資料都儲存在存儲伺服器上,以組(卷,group)為機關,一個group内包涵多台storage機器,資料互為備份。存儲空間以group内容量最新的storage為準,是以多台stroage配置要盡量一緻。
  2. 可以采用高可用方式進行資料存儲
  3. fastdfs選擇叢集不同的存儲伺服器組/卷來存儲,組的存儲伺服器互相通信,同組内的存儲伺服器之間會進行檔案同步連接配接
  4. 存儲伺服器采用binlog檔案記錄檔案上傳、删除更新等操作。binlong中隻記錄檔案名,不記錄檔案内容
  5. 檔案同步隻在組内的存儲伺服器之間進行,采用推送方式。即源頭伺服器推送資料到目标伺服器

fastDFS上傳

FastDFS上傳下載下傳原了解析FastDFS分布式檔案系統概述fastDFS架構原理fastDFS上傳fastDFS下載下傳fastDFS同步

流程

  1. client詢問tracker可以上傳到哪一個stroage,或者指定擷取某個組的stroage
  2. tracker傳回一台可用的storage
  3. client直接和storage通訊完成檔案上傳
  4. storage儲存檔案後給client傳回組名和檔案名

檔案上傳服務端内部處理的詳細機制如下

選擇tracker

當叢集中有多個tracker時,由于tracker之間是完全對等的關系,是以用戶端在upload檔案時可以任意選擇一個trakcer

選擇group

  1. 當用戶端沒有指定group時,由服務端tracker自動指定。當tracker接收到upload file的請求時,會為該檔案配置設定一個可以存儲該檔案的group,支援如下選擇group的規則:
  2. Round robin,所有的group間輪詢
  3. Specified group,指定某一個确定的group
  4. Load balance,剩餘存儲空間多多group優先

選擇storage

當選定group後,tracker會在group内選擇一個storage節點給用戶端,支援如下選擇storage的規則:

  1. Round robin,在group内的所有storage間輪詢
  2. First server ordered by ip,按ip排序
  3. First server ordered by priority,按優先級排序(優先級在storage上配置)

選擇storage path

當配置設定好storage server後,用戶端将向storage發送寫檔案請求,storage将會為檔案配置設定一個資料存儲目錄,支援如下規則:

  1. Round robin,多個存儲目錄間輪詢
  2. 剩餘存儲空間最多的優先

生成Fileid

標明存儲目錄之後,storage會為檔案生一個Fileid:

  1. storage server ip(32位整數)
  2. 檔案建立時間(unix時間戳,32位整數)
  3. 檔案大小
  4. 檔案crc32校驗碼
  5. 随機數(這個字段用來避免檔案重名)
  6. Fileid由上述部分拼接而成,然後将這個二進制串進行base64編碼,轉換為可列印的字元串

選擇檔案子目錄

當選定存儲目錄之後,storage會為檔案配置設定一個fileid,每個存儲目錄下有兩級256*256的子目錄,storage會按檔案fileid進行兩次hash,路由到其中一個子目錄,然後将檔案以fileid為檔案名存儲到該子目錄下

生成檔案名傳回用戶端

當檔案存儲到某個子目錄後,即認為該檔案存儲成功,接下來會為該檔案生成一個檔案名傳回用戶端,檔案名由下述幾個部分構成

  1. group name-檔案上傳後所在的存儲組名稱
  2. 存儲目錄 - 存儲伺服器配置的虛拟路徑,與磁盤選項store_path*對應。如果配置了store_path0則是M00,如果配置了store_path1則是M01,以此類推
  3. 資料兩級目錄 - 存儲伺服器在每個虛拟磁盤路徑下建立的兩級目錄,用于存儲資料檔案fileid
  4. 檔案字尾名(由用戶端指定,主要用于區分檔案類型)拼接而成
  5. 生成的檔案名需傳回到用戶端,需要由用戶端進行儲存

fastDFS下載下傳

FastDFS上傳下載下傳原了解析FastDFS分布式檔案系統概述fastDFS架構原理fastDFS上傳fastDFS下載下傳fastDFS同步
  1. client詢問tracker下載下傳檔案的storage,參數為檔案辨別(組名和檔案名)
  2. tracker傳回一台可用的storage
  3. client直接和storage通訊完成檔案下載下傳

由于storage有多個存儲節點,存儲節點間的檔案同步是在背景異步進行的,是以有可能出現在讀的時候,檔案還沒有同步到某些storage server上,為了盡量避免通路到這樣的storage,tracker按照如下規則選擇group内可讀的storage:

  1. 該檔案上傳到的源storage - 由于源頭的位址被編碼在檔案名中,隻要源頭storage存活,優先傳回
  2. 檔案建立時間戳==storage被同步到的時間戳 且(目前時間-檔案建立時間戳) > 檔案同步最大時間(如5分鐘) - 檔案建立後,認為經過最大同步時間後,肯定已經同步到其他storage了
  3. 檔案建立時間戳 < storage被同步到的時間戳。 - 同步時間戳之前的檔案确定已經同步了
  4. (目前時間-檔案建立時間戳) > 同步延遲閥值(如一天)。 - 經過同步延遲門檻值時間,認為檔案肯定已經同步了

fastDFS同步

  1. 同一組内的StorageServer之間是對等的,檔案上傳、删除等操作可以在任意一台StorageServer上進行;
  2. 檔案同步(添加/删除/修改)隻在同組内的StorageServer之間進行,采用push方式,即源伺服器同步給目标伺服器;
  3. 源頭資料才需要同步,備份資料不需要再次同步,否則就會構成環路了;
  4. 上述第二條規則有個例外,就是新增加一台StorageServer時,由已有的一台StorageServer将已有的所有資料(包括源頭資料和備份資料)同步給該新增伺服器。

FastDFS檔案目錄介紹

FastDF服務端目錄介紹

TrackerServer

${base_path}
   
|__data
   
|     |__storage_groups.dat:存儲分組資訊
   
|     |__storage_servers.dat:存儲伺服器清單
   
|__logs
         
   |__trackerd.log:tracker server日志檔案
           

StorageServer

${base_path}
   
|__data
   
|     |__.data_init_flag:目前storage server 初始化資訊
   
|     |__storage_stat.dat:目前storage server統計資訊
   
|     |__sync:存放資料同步相關檔案
   
|     |     |__binlog.index:目前的binlog檔案索引号
   
|     |     |__binlog.###:存放更新操作記錄(日志)
   
|     |     |__${ip_addr}_${port}.mark:存放同步的完成情況
   
|     |
   
|     |__一級目錄:256個存放資料檔案的目錄,如:00, 1F
   
|           |__二級目錄:256個存放資料檔案的目錄
   
|__logs
       
   |__storaged.log:storage server日志檔案