FastDFS詳解

FastDFS 是一個(gè)開源的高性能分布式文件系統(tǒng)(DFS) 褥傍,主要解決海量數(shù)據(jù)存儲問題恍风,特別適合中小文件(建議范圍:400K~500M)為載體的在線服務(wù)。

主要功能:

  • 文件存儲
  • 文件同步和文件訪問
  • 高容量和負(fù)載均衡凯楔。

FastDFS 系統(tǒng)有三個(gè)角色
- 跟蹤服務(wù)器 (Tracker Server):跟蹤服務(wù)器 主要做調(diào)度工作锦募,起到均衡作用糠亩;負(fù)責(zé)管理所有的storage server和group,每個(gè)storage在啟動后會連接Tracker廷没,告知自己所屬group等信息腕柜,并保持周期性心跳盏缤。(存儲文件的索引)
- 存儲服務(wù)器(Storage Server):存儲服務(wù)器,主要提供容量和備份服務(wù)台舱;以group為單位潭流,每個(gè)group內(nèi)可以有多臺storage server 數(shù)據(jù)互為備份。
- 客戶端 (Client): 客戶端拆宛,上傳下載數(shù)據(jù)的服務(wù)器讼撒,也就是我們自己的項(xiàng)目所部署在的服務(wù)器根盒。

FastDFS架構(gòu)

存儲策略

為了支持大容量炎滞,存儲節(jié)點(diǎn)采用分組得方式。存儲系統(tǒng)由多個(gè)分組組成钠导。組與組之間得文件時(shí)相互獨(dú)立的辈双。 所有組得文件容量累加就是整個(gè)存儲系統(tǒng)中得文件容量柜砾。一個(gè)組可以由一臺或多臺服務(wù)器組成。一個(gè)組內(nèi)各個(gè)存儲服務(wù)器中的文件都是相同的证芭。組中多臺服務(wù)器起到了冗余废士、備份和負(fù)載的作用蝇完。在組中增加服務(wù)器時(shí)矗蕊,同步已有的文件傻咖,由系統(tǒng)自動完成岖研。同步完成后孙援,系統(tǒng)自動將新增服務(wù)器切換到線上提供服務(wù)。

FastDFS的文件上傳

Storage Server會定期向Tracker Server發(fā)送自己的存儲信息窥摄。當(dāng)Tracker Server不只一個(gè)時(shí)邻辉,各個(gè)Tracker之間的關(guān)系時(shí)對等的,所以客戶端上傳時(shí)可以選擇任意一個(gè)Tracker吱瘩。

當(dāng)Tracker收到客戶端上傳文件的請求時(shí),會為該文件分配一個(gè)可以存儲文件的group票摇,當(dāng)選定group后就要決定給客戶端分配group中哪一個(gè)storage server。當(dāng)分配好storage server后,客戶端向storage發(fā)送寫文件請求摩梧,storage將會為文件分配一個(gè)數(shù)據(jù)存儲目錄浑吟,最后根據(jù)以上信息生成文件名。

上傳文件流程: 客戶端先請求追蹤服務(wù)器忿项,追蹤服務(wù)器分配位置,返回位置信息。客戶端直接存儲到追中服務(wù)器返回的位置。存放好后客戶端的任務(wù)結(jié)束蔓腐。存儲服務(wù)器之間再發(fā)起同步動作。服務(wù)器之間同步數(shù)據(jù)。

FastDFS的文件同步

寫文件時(shí)误甚,客戶端將文件寫至group內(nèi)一個(gè)storage server 寫完文件后,會由后臺線程將文件同步至同group內(nèi)其他storage server岳遥。每個(gè)storage寫文件后哥艇,同時(shí)會寫一份binlog,binlog里不包含文件數(shù)據(jù),只包含文件名等源信息杉畜。binlog用于后臺同步,storage會記錄向group內(nèi)其他storage同步的進(jìn)度灭袁,以便重啟時(shí)能接上次進(jìn)度同步。進(jìn)度以時(shí)間戳的方式進(jìn)行記錄,所以最好能保證集群內(nèi)所有server時(shí)鐘同步。

FastDFS的文件下載

在上傳成功后遂唧,會拿到一個(gè)storage生成的文件名页滚,接下來客戶端根據(jù)這個(gè)文件名即可訪問到文件隧熙。

下載文件流程:不通過追蹤服務(wù)器,直接進(jìn)入到某一個(gè)存儲服務(wù)器來讀取躏敢。使用nginx來讀取存儲服務(wù)器的本地文件系統(tǒng),直接就返回給瀏覽器了。nginx讀靜態(tài)文件的效率非常高镀首。 FastDFS插件 解決讀取的服務(wù)器上沒有指定文件的問題芋齿。插件會到追蹤服務(wù)器查找對應(yīng)文件的源信息。通過源信息到原始服務(wù)器上讀取指定文件。

刪除文件流程: 同上傳


安裝部署

編譯源碼需要gcc、gcc-c++释移、perl,軟件包解壓需要 unzip

 yum -y install gcc gcc-c++ perl unzip

下載libfastcommon環(huán)境包、下載FastDFS包樟澜、下載nginx源碼包贩猎、下載 fastdfs-nginx-module插件包

        
wget https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz
wget https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz   
wget -c https://nginx.org/download/nginx-1.12.1.tar.gz
wget  https://github.com/happyfish100/fastdfs-nginx-module/archive/5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip
1.安裝libfastcommon libfastcommonm是從FastDFS和FastDHT中提取出來的公共C函數(shù)庫蝗罗,基礎(chǔ)環(huán)境沼琉,安裝即可。
tar -zxvf V1.0.7.tar.gz
cd libfastcommon-1.0.7
./make.sh
./make.sh install

libfastcommon.so默認(rèn)安裝到了/usr/lib64/libfastcommon.so但是后序我們安裝的FastDFS主程序設(shè)置的lib目錄是/usr/local/lib因此需要?jiǎng)?chuàng)建軟鏈接。

ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so
2.下載安裝FastDFS

解壓并進(jìn)入

tar -zxvf V5.05.tar.gz
cd fastdfs-5.05

編譯并安裝

./make.sh
./make.sh install

fastdfs的服務(wù)腳本在/etc/init.d/fdfs_storaged/etc/init.d/fdfs_tracker
fastdfs的配置文件在/etc/fdfs/client.conf.sample/etc/fdfs/storage.conf.sample碰镜,/etc/fdfs/tracker.conf.sample
fastdfs的命令工具在/usr/bin目錄下

fdfs_appender_test
fdfs_appender_test1
fdfs_append_file
fdfs_crc32
fdfs_delete_file
fdfs_download_file
fdfs_file_info
fdfs_monitor
fdfs_storaged
fdfs_test
fdfs_test1
fdfs_trackerd
fdfs_upload_appender
fdfs_upload_file
stop.sh
restart.sh

FastDFS服務(wù)腳本設(shè)置的bin目錄是/usr/local/bin,但實(shí)際命令卻安裝在/usr/bin下王滤,所以這里還需要?jiǎng)?chuàng)建軟鏈接。

ln -s /usr/bin/fdfs_trackerd /usr/local/bin
ln -s /usr/bin/fdfs_storaged /usr/local/bin
ln -s /usr/bin/stop.sh /usr/local/bin
ln -s /usr/bin/restart.sh /usr/local/bin
3.配置FastDFS跟蹤服務(wù)器(Tracker)

進(jìn)入/etc/fdfs,復(fù)制FastDFS跟蹤器樣例配置文件tracker.conf.sample 并重命名為tracker.conf

cd /etc/fdfs
cp tracker.conf.sample tracker.conf
vim tracker.conf

編輯tracker.conf悠抹,修改主要配置。

#提供服務(wù)的端口
port = 22122

#Tracker 數(shù)據(jù)和日志目錄地址(根目錄必須存在,子目錄會自動創(chuàng)建)
base_path=/home/fastDFS/tracker

#HTTP 服務(wù)端口
http.server_post=8080

啟動tracker

#啟動
service fdfs_trackerd start
#關(guān)閉
service fdfs_tracker stop

初次啟動成功后,會在/home/fastdfs/tracker(配置的base_path)下創(chuàng)建data黑忱、log兩個(gè)目錄沥邻。

查看FastDFS Tracker是否已啟動成功,22122端口被監(jiān)聽邮利,則算是Tracker服務(wù)安裝成功剪勿。

netstat -unltp |grep fdfs
tracker啟動結(jié)果

tracker服務(wù)啟動成功后,會在base_path下創(chuàng)建data头朱、logs兩個(gè)目錄。
data目錄下storage_groups.dat 存儲分組信息署隘。storage_servers.dat 存儲服務(wù)器列表。
log目錄下 tracker.log tracker server日志文件崖媚。

4.配置FastDFS存儲(Storage)

進(jìn)入/etc/fdfs目錄荠呐,復(fù)制FastDFS 存儲器樣例配置文件storage.conf.sample,并重命名為storage.conf

cd /etc/fdfs
cp storage.conf.sample storage.conf
vim storage.conf

編輯storage.conf 修改主要配置

#指定此storage server 所在組
group_name=group1

#storage server
port=23000

#心跳間隔時(shí)間鞠值,單位為秒(這里指主動向tracker server發(fā)送心跳)
heart_beat_interval=30

#Storage數(shù)據(jù)和日志目錄地址(根目錄必須存在,子目錄自動生成)
base_path=/home/fastDFS/storage

#存放文件時(shí)声离,storage server支持多個(gè)路徑本刽。這里配置存放文件的基路徑數(shù)據(jù),通常只配一個(gè)目錄。
store_path_count=1

#逐一配置store_path_count個(gè)路徑。索引號基于0墙歪。
#如果不配置store_path0贝奇,那它就和base_path對應(yīng)路徑一樣掉瞳,此處直接注釋掉。
#store_path0=/home/fastdfs/file

#tracker_server 的列表霎褐,會主動連接tracker_server该镣,有多個(gè)tracker_server時(shí)损合,每個(gè)tracker server寫一行
tracker_server=39.97.179.107:22122

###訪問端口   nginx需要監(jiān)聽的端口
http.server_port=80

啟動storage

#啟動
service fdfs_storaged start
#停止
service fdfs_storaged stop

查看是否啟動成功

netstat -unltp |grep fdfs
storage 啟動狀態(tài)

查看Storage和Tracker 是否在通信/usr/bin/fdfs_moitor /etc/fdfs/storage.conf

通信狀態(tài)

storage和tracker一樣跋炕,啟動成功后律适,在base_path下創(chuàng)建data擦耀、log目錄。

5.文件上傳測試

修改客戶端配置文件 client.conf

cd /etc/fdfs
cp client.conf.sample client.conf
vim client.conf

修改如下配置分瘾,其他默認(rèn)

#client 的數(shù)據(jù)和日志目錄
base_path=/home/fastDFS/client

#Tracker端口
tracker_server=39.97.179.107:22122

#tracker http服務(wù)端口
http.tracker_server_port=8080

上傳測試

/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /home/fastFDS/image-upload-test.jpg

上傳成功后返回文件ID號group1/M00/00/00/rBHknF601ZCAJ_dvAA74ZYcH48k.jpg
返回的文件ID由group蕴坪、存儲目錄、兩級子目錄fileid、文件后綴名拼接而成前域。

文件ID結(jié)構(gòu)
6.安裝nginx

上面講文件上傳成功了变丧,但我們無法訪問下載攻晒。因此安裝Nginx作為服務(wù)器以支持Http方式訪問文件给梅。同時(shí)渴邦,后面安裝FastDFS的Nginx插件也需要Nginx環(huán)境。

安裝nginx所需環(huán)境

yum install -y pcre pcre-devel zlib zlib-devel openssl openssl-devel

安裝nginx

cd /home/fastDFS
tar -zxvf nginx-1.12.1.tar.gz
cd nginx-1.12.1
./configure
make && make install

啟動nginx

cd /usr/local/nginx/sbin
./nginx

#其他命令
./nginx -s stop
./nginx -s quit
./nginx -s reload
./nginx -V

修改nginx 配置文件

vim /usr/localnginx/conf/nginx.conf

添加如下行峭沦,將/group1/M00 映射到/home/fastDFS/storage/data
location /group1/M00 {
    alias /home/fastDFS/storage/data
}

重新加載配置
/usr/local/nginx/sbin/nginx -s reload
nginx配置

在瀏覽器直接訪問即可獲取文件取募。

7.配置nginx的fastdfs插件

fastdfs-nginx-module模塊說明:
FastDFS通過Tracker服務(wù)器织阳,將文件放在storage服務(wù)器存儲伸眶,但是同組存儲服務(wù)器之間需要進(jìn)行文件復(fù)制毁欣,有同步延遲寞肖。
假設(shè)通過nginx取文件,恰巧落在了未同步完成的服務(wù)器,就會出現(xiàn)文件無法訪問的情況横殴。
而fastdfs-nginx-module可以重定向文件鏈接到源服務(wù)器取文件缘挽。避免復(fù)制延遲導(dǎo)致的文件無法訪問腮郊。

解壓fastdfs-nginx-module

unzip 5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip 

#重命名
mv fastdfs-nginx-module-5e5f3566bbfa57418b5506aaefbe107a42c9fcb1 fastdfs-nginx-module

在nginx中添加插件

#先停掉nginx服務(wù)
/usr/local/nginx/sbin/nginx -s stop

#進(jìn)入nginx目錄
cd /home/fastDFS/nginx-1.12.1

#添加模塊
./configure --add-module=../fastdfs-nginx-module/src

#重新編譯安裝
make && make install

查看nginx版本信息

/usr/local/nginx/sbin/nginx -V
添加模塊成功提示

復(fù)制fastdfs-nginx-module源碼中的配置文件到/etc/fdfs目錄泵三,并修改

 cp mod_fastdfs.conf /etc/fdfs/

修改配置文件

#連接超時(shí)時(shí)間
connect_timeout= 30

#tracker server信息
tracker_server=39.97.179.107:22122

StorageServer默認(rèn)端口
storage_server_port=23000

如果文件ID的uri中包含/group** 驱显,則要設(shè)置為true
url_have_group_name=true

#storage 配置的store_path路徑,必須要和storage.conf中一致埃疫,統(tǒng)一注釋掉
#store_path0 = /home/fastDFS/storage

復(fù)制FastDFS的部分配置文件到/etc/fdfs 目錄

cd /home/fastDFS/fastdfs-5.05/conf
cp http.conf mime.types /etc/fdfs/

修改nginx配置伏恐,在之前加的group1/M00映射內(nèi),加入插件配置


ngx_fastdfs_module

注意:server的listen端口要與storage.conf中配置的http.server_port一致胳蛮。

啟動nginx蜕窿,打印出插件pid就已經(jīng)成功


操作結(jié)果

集群搭建

FastDFS集群搭建非常簡單送巡,只需要在storage端配置文件里薇组,將tracker的信息對應(yīng)配置即可律胀。

集群的配置

首先要有兩套剛剛搭建的單機(jī)環(huán)境宋光。修改Storage.conf和mod_fastdfs.conf 將其中tracker_server參數(shù)配置成兩臺機(jī)器


集群配置

然后再client.conf中 tracker_server設(shè)置為兩個(gè)tracker
然后進(jìn)一步修改不同storage的group信息炭菌,給storage分組罪佳。重啟所有服務(wù)集群即搭建完畢。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末黑低,一起剝皮案震驚了整個(gè)濱河市赘艳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌克握,老刑警劉巖蕾管,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異玛荞,居然都是意外死亡娇掏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門勋眯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來婴梧,“玉大人,你說我怎么就攤上這事客蹋∪洌” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵讶坯,是天一觀的道長番电。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么漱办? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任这刷,我火速辦了婚禮,結(jié)果婚禮上娩井,老公的妹妹穿的比我還像新娘暇屋。我一直安慰自己,他們只是感情好洞辣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布咐刨。 她就那樣靜靜地躺著,像睡著了一般扬霜。 火紅的嫁衣襯著肌膚如雪定鸟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天著瓶,我揣著相機(jī)與錄音联予,去河邊找鬼。 笑死材原,一個(gè)胖子當(dāng)著我的面吹牛躯泰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播华糖,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瘟裸!你這毒婦竟也來了客叉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤话告,失蹤者是張志新(化名)和其女友劉穎兼搏,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沙郭,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡佛呻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了病线。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吓著。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖送挑,靈堂內(nèi)的尸體忽然破棺而出绑莺,到底是詐尸還是另有隱情,我是刑警寧澤惕耕,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布纺裁,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏欺缘。R本人自食惡果不足惜栋豫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谚殊。 院中可真熱鬧丧鸯,春花似錦、人聲如沸络凿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽絮记。三九已至摔踱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間怨愤,已是汗流浹背派敷。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留撰洗,地道東北人篮愉。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像差导,于是被迫代替她去往敵國和親试躏。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353