一、分布式檔案系統fastdfs-設計原理
fastdfs是乙個開源的輕量級分布式檔案系統,由跟蹤伺服器(tracker server)、儲存伺服器(storage server)和客戶端(client)三個部分組成,
storage server(後簡稱storage)以組(卷,group或volume)為單位組織,乙個group內包含多台storage機器,資料互為備份,儲存空間以group內容量最小的storage為準,所以建議group內的多個storage盡量配置相同,以免造成儲存空間的浪費。
以group為單位組織儲存能方便的進行應用隔離、負載均衡、副本數定製(group內storage server數量即為該group的副本數),比如將不同應用資料存到不同的group就能隔離應用資料,同時還可根據應用的訪問特性來將應用分配到不同的group來做負載均衡;缺點是group的容量受單機儲存容量的限制,同時當group內有機器壞掉時,資料恢復只能依賴group內的其他機器,使得恢復時間會很長。
group內每個storage的儲存依賴於本地檔案系統,storage可配置多個資料儲存目錄,比如有10塊磁碟,分別掛載在/data/disk1-/data/disk10,則可將這10個目錄都配置為storage的資料儲存目錄。
storage接受到寫檔案請求時,會根據配置好的規則(後面會介紹),選擇其中乙個儲存目錄來儲存檔案。為了避免單個目錄下的檔案數太多,在 storage第一次啟動時,會在每個資料儲存目錄裡建立2級子目錄,每級256個,總共65536個檔案,新寫的檔案會以hash的方式被路由到其中某個子目錄下,然後將檔案資料直接作為乙個本地檔案儲存到該目錄中。
2、tracker server
tracker是fastdfs的協調者,負責管理所有的storage server和group,每個storage在啟動後會連線tracker,告知自己所屬的group等資訊,並保持週期性的心跳,tracker根據 storage的心跳資訊,建立group==>[storage server list]的對映表。
tracker需要管理的元資訊很少,會全部儲存在記憶體中;另外tracker上的元資訊都是由storage匯報的資訊生成的,本身不需要持久化任何資料,這樣使得tracker非常容易擴充套件,直接增加tracker機器即可擴充套件為tracker cluster來服務,cluster裡每個tracker之間是完全對等的,所有的tracker都接受stroage的心跳資訊,生成元資料資訊來提供讀寫服務。
選擇tracker server
當集群中不止乙個tracker server時,由於tracker之間是完全對等的關係,客戶端在upload檔案時可以任意選擇乙個tracker。
選擇儲存的group
當tracker接收到upload file的請求時,會為該檔案分配乙個可以儲存該檔案的group,支援如下選擇group的規則:
1.round robin,所有的group間輪詢
2.specifiedgroup,指定某乙個確定的group
3.load balance,剩餘儲存空間多的group優先
選擇storage server
當選定group後,tracker會在group內選擇乙個storage server給客戶端,支援如下選擇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,由storage server ip、檔案建立時間、檔案大小、檔案crc32和乙個隨機數拼接而成,
然後將這個二進位制串進行base64編碼,轉換為可列印的字串。
選擇兩級目錄
當選定儲存目錄之後,storage會為檔案分配乙個fileid,每個儲存目錄下有兩級256*256的子目錄,storage會按檔案fileid進行兩次hash(猜測),
路由到其中乙個子目錄,然後將檔案以fileid為檔名儲存到該子目錄下。
生成檔名(訪問url:路徑+檔名)
當檔案儲存到某個子目錄後,即認為該檔案儲存成功,接下來會為該檔案生成乙個檔名,
檔名由group、儲存目錄、兩級子目錄、fileid、檔案字尾名(由客戶端指定,主要用於區分檔案型別)拼接而成。
客戶端upload file成功後,會拿到乙個storage生成的檔名,接下來客戶端根據這個檔名即可訪問到該檔案。
跟upload file一樣,在download file時客戶端可以選擇任意tracker server。
tracker傳送download請求給某個tracker,必須帶上檔名資訊,tracke從檔名中解析出檔案的group、大小、建立時間等資訊,然後為該請求選擇乙個storage用來服務讀請求。由於group內的檔案同步時在後台非同步進行的,所以有可能出現在讀到時候,檔案還沒有同步到某些storage server上,為了盡量避免訪問到這樣的storage,tracker按照如下規則選擇group內可讀的storage。
1. 該檔案上傳到的源頭storage -源頭storage只要存活著,肯定包含這個檔案,源頭的位址被編碼在檔名中。
2. 檔案建立時間戳==storage被同步到的時間戳且(當前時間-檔案建立時間戳)>檔案同步最大時間(如5分鐘)-檔案建立後,
認為經過最大同步時間後,肯定已經同步到其他storage了。
3. 檔案建立時間戳< storage被同步到的時間戳。-同步時間戳之前的檔案確定已經同步了
4.(當前時間-檔案建立時間戳)>同步延遲閥值(如一天)。-經過同步延遲閾值時間,認為檔案肯定已經同步了。
5、檔案同步
寫檔案時,客戶端將檔案寫至group內乙個storage server即認為寫檔案成功,storage server寫完檔案後,會由後台執行緒將檔案同步至同group內其他的storage server。
每個storage寫檔案後,同時會寫乙份binlog,binlog裡不包含檔案資料,只包含檔名等元資訊,這份binlog用於後台同步,storage會記錄向group內其他storage同步的進度,以便重啟後能接上次的進度繼續同步;進度以時間戳的方式進行記錄,所以最好能保證集群內所有server的時鐘保持同步。
storage的同步進度會作為元資料的一部分匯報到tracker上,tracke在選擇讀storage的時候會以同步進度作為參考
待議:1.檔案(例如)是怎同步過去的?
2.storage1有路徑path和兩級目錄,那麼storage2和3應該也有,對應著?
3.怎麼判斷檔案在storage2和3上存在的?
4.新新增tracker或者storage,怎麼動作的?
5.優缺點、適用情況?
FastDFS分布式檔案系統
服務端兩個角色 tracker 管理集群,tracker 也可以實現集群。每個 tracker 節點地位平等。收集 storage 集群的狀態。storage 實際儲存檔案,storage 分為多個組,每個組之間儲存的檔案是不同的。每 個組內部可以有多個成員,組成員內部儲存的內容是一樣的,組成員的地...
FastDFS分布式檔案系統
fastdfs簡介 fastdfs是乙個輕量級的開源分布式檔案系統 fastdfs主要解決了大容量的檔案儲存和高併發訪問的問題,檔案訪問時實現了負載均衡 fastdfs實現了軟體方式的raid,可以使用廉價的ide硬碟進行儲存 支援相同內容的檔案只儲存乙份,節約磁碟空間 fastdfs只能通過cli...
FastDFS分布式檔案系統
fastdfs服務有三個角色 跟蹤伺服器 tracker server 儲存伺服器 storage server 和客戶端 client 總結 1.高可靠性 無單點故障 2.高吞吐性 只要group足夠多,資料流量是足夠分散的 group 中 storage 儲存依賴本地檔案系統,storage 可...