FastDFS 是由淘寶開發平臺部資深架構師餘慶開發,是一個輕量級、高性能的開源分佈式文件系統
( Distributed File System ),用純 C 語言開發,包括文件存儲、文件同步、文件訪問(上傳、下載)、存取負載均衡、在線擴容、相同內容只存儲一份等功能,適合有大容量存儲需求的應用或系統。php
它對文件進行管理,充分考慮了冗餘備份、負載均衡、線性擴容等機制,並注重高可用、高性能等指標。解決了大容量存儲和負載均衡的問題。特別適合以中小文件( 建議範圍:4KB < file_size <500MB )爲載體的在線服務,如相冊網站、視頻網站等等具備顯著的效果。
同類的分佈式文件系統有谷歌的 GFS、HDFS(Hadoop)、TFS(淘寶)等。nginx
FastDFS 服務端有三個角色:客戶端(client),跟蹤器(tracker)和存儲器(storage)構成。基本架構以下圖所示web
Tracker 是 FastDFS 的 協調者,負責管理全部的 storage server 和 group,每一個 storage 在啓動後會鏈接 Tracker,告知本身所屬的 group 等信息,並保持週期性的心跳,tracker 根據 storage 的心跳信息,創建 group ==> [storage serverlist]
的映射表。apache
Tracker 須要管理的元信息不多,會所有存儲在內存中;另外 tracker 上的元信息都是由 storage 彙報的信息生成的,自己不須要持久化任何數據,這樣使得 tracker 很是容易擴展,直接增長 tracker 機器便可擴展爲 tracker cluster 來服務,cluster 裏每一個 tracker 之間是徹底對等的,全部的 tracker 都接受 stroage 的心跳信息,生成元數據信息來提供讀寫服務。服務器
跟蹤器在訪問上起負載均衡的做用。能夠隨時增長或下線而不會影響線上服務。
存儲系統(Storage server)由以組 group(或卷 volume)爲單位組成。一個 group 內包含多臺 storage 機器,數據互爲備份,存儲空間以 group 內容量最小的 storage爲準。架構
存儲節點中的服務器都可以隨時增長或下線而不會影響線上服務。
客戶端(client),做爲業務請求的發起方,經過專有接口,使用TCP/IP協議與跟蹤器服務器或存儲節點進行數據交互。負載均衡
爲了支持大容量,存儲系統由一個或多個卷組成,卷與卷之間的文件是相互獨立的,全部卷的文件容量累加就是整個存儲系統中的文件容量。一個卷能夠由一臺或多臺存儲服務器組成,一個卷下的存儲服務器中的文件都是相同的(同步已有的文件由系統自動完成同步),卷中的多臺存儲服務器起到了冗餘備份和負載均衡的做用。分佈式
在卷中增長服務器時,同步已有的文件由系統自動完成,同步完成後,系統自動將新增服務器切換到線上提供服務。oop
當存儲空間不足或即將耗盡時,能夠 動態 添加捲。只須要增長一臺或多臺服務器,並將它們配置爲一個新的卷,這樣就擴大了存儲系統的容量。性能
寫文件時,客戶端將文件寫至 group 內一個 storage server 即認爲寫文件成功,storage server 寫完文件後,會由後臺線程將文件同步至同 group 內其餘的 storage server。
每一個 storage 寫文件後,同時會寫一份 binlog,binlog 裏不包含文件數據,只包含文件名等元信息,這份 binlog 用於後臺同步,storage 會記錄向 group 內其餘 storage 同步的進度,以便重啓後能接上次的進度繼續同步;進度以時間戳的方式進行記錄,因此最好能保證集羣內全部 server 的時鐘保持同步。
storage 的同步進度會做爲元數據的一部分彙報到 tracker 上,tracker 在選擇讀 storage 的時候會以同步進度做爲參考。這樣就避免文件同步完成以前訪問文件不存在的問題,就是 tracker 會告訴 client 去訪問執行存儲的那臺 storage。
從 client 發起請求,由跟蹤器(tracker,主)來處理,查詢可用的存儲器(storage),返回給 client storage 的 ip 和端口;client 根據 ip 和端口訪問 storage 完成上傳圖片等服務;成功後返回地址,如:group1/M00/00/01/wKgBwFkueeWAU81OAADxa3SgCic420.png
keepalived 是以 VRRP( Virtual Router Redundancy Protocol )協議爲實現基礎的,即虛擬路由冗餘協議
,實現路由器高可用的協議。
Keepalived 的做用是檢測服務器的狀態,若是有一臺 web 服務器宕機,或工做出現故障,Keepalived 將檢測到,並將有故障的服務器從系統中剔除,同時使用其餘服務器代替該服務器的工做,當服務器工做正常後 Keepalived 自動將服務器加入到服務器羣中,這些工做所有自動完成,不須要人工干涉,須要人工作的只是修復故障的服務器。
將 N 臺提供相同功能的路由器組成一個路由器組,這個組裏面有一個 master 和多個 backup ,master 上面有一個對外提供服務的 vip(該路由器所在局域網內其餘機器的默認路由爲該 vip),master 會發組播,當 backup 收不到 vrrp 包時就認爲 master 宕掉了,這時就須要根據 VRRP 的優先級來選舉一個 backup 當 master。這樣的話就能夠保證路由器的高可用了。
Keepalived 經過請求一個 vip 來達到請求真實 IP 地址的功能,而 VIP 可以在一臺機器發生故障時候,自動漂移到另一臺機器上,歷來達到了高可用。
一主多從模式:
在當前架構中僅容許存在一臺 master,其餘均爲 backup。當 backup 接收不到 vrrp 消息時,會根據權重來選舉一個 backup 出來代替 master。
master 故障恢復後,再次奪回 master。
在大多數業務場景中,每每須要爲 FastDFS 存儲的文件提供 http 下載服務,而儘管 FastDFS 在其 storage 及 tracker 都內置了 http 服務, 但性能表現卻不盡如人意;做者餘慶在後來的版本中增長了基於當前主流 web 服務器的擴展模塊(包括 nginx/apache ),其用意在於利用 web 服務器直接對本機 storage 數據文件提供 http 服務,以提升文件下載的性能。
FastDFS 的 PHP 擴展,用於和 PHP 進行交互。
注意:千萬不要使用 kill -9 命令強殺 FastDFS 進程,不然可能會致使 binlog 數據丟失。