FastDFS總結

前言

  FastDFS主要解決互聯網中小文件存儲存儲問題,例如圖片,短視頻,提供上傳和下載功能,輕量級的設計,結構很是簡單,主要包含三個角色客戶端,Tracer服務,Storage服務。Tracer服務提供了對客戶端請求負載均衡和路由做用,Storage服務提供真正的上傳下載,數據同步,冗餘備份做用。php

  系統部署時,首先將幾個Storage服務編爲一個組,每一個組內的Storage服務內保存的文件數據徹底相同,相互之間進行數據同步。Tracer服務與全部的Storage服務,Storage服務啓動時會鏈接全部的Tracer服務,並將Storage信息彙總給Tracer服務,主要是同步信息,磁盤空間信息,不多的數據量,全部的數據均在內存中,Tracer並不會成爲瓶頸。mysql

上傳文件

  客戶端上傳文件時,首先客戶端向Tracer發送請求上傳文件,Tracer會返回一個Storage地址給客戶端,客戶端從新鏈接Storage服務,Storage接收到客戶端傳送的文件數據,根據文件名生成一個fid索引,並選擇合適的位置保存文件數據。Storage服務爲了不同一個目錄下的文件數量過多,將磁盤分爲兩級目錄,每級目錄下保存256個文件。數據文件保存成功以後,返回生成的fid索引給客戶端,並告知文件存儲成功。後面Storage會有單獨的線程將上傳的文件數據同步給同一個組內其餘的Storage服務,若是在未同步以前Storage數據損壞了,則用戶上傳的數據會永久丟失。Storage服務每次同步成功一個文件都會記錄一個binlog,保存針對組內全部的Storage服務的同步進度,保證服務重啓後可以繼續上次未完成的同步進度。客戶端收到上傳的fid索引後,之後訪問文件須要經過fid索引進行訪問,fid索引須要應用自行保存,通常能夠保存到mysql中,以原始文件名對應fid索引。sql

下載文件

  客戶端下載文件時,根據原始文件名找到fid索引,而後發送請求到Tracer服務,Tracer會根據fid索引中的組名,返回給客戶端組內Storage服務一個地址,客戶端根據此地址鏈接相應的Storage服務下載對應的文件。若是咱們剛上傳的文件到一個Storage服務,而它還未將數據同步到其餘的Storage服務,則客戶端有可能獲取不到數據,爲了不這種狀況,fid索引中會保存有文件建立時間和上傳到Storage服務的源地址,若是當前時間戳小於某個值,則Tracer會返回源地址供客戶端下載。負載均衡

fid索引

  fid索引設計很巧妙,依次保存組名,磁盤號,一級目錄,二級目錄,文件名,此處的文件名添加了其餘信息生成的,原始文件名須要應用自行保存。下面是結構示例。運維

group1/M00/00/0C/SAAAKkdlDKDKlslDSSdks.h.net

尾聲

  FastDFS輕巧方便使用,搭建簡單,可是也存在一些問題,好比上面說的剛上傳文件的Storage服務若是數據損壞,則會致使數據永久丟失,Storage服務中若是有磁盤損壞,則須要手動copy數據進行還原,對於運維來講太不方便。線程

參考資料

http://tech.uc.cn/?p=221
http://blog.yunnotes.net/index.php/fastdfs_design/
http://history.programmer.com.cn/4380/設計

相關文章
相關標籤/搜索