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ù)器根盒。
存儲策略
為了支持大容量炎滞,存儲節(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服務(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和Tracker 是否在通信/usr/bin/fdfs_moitor /etc/fdfs/storage.conf
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、文件后綴名拼接而成前域。
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
在瀏覽器直接訪問即可獲取文件取募。
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),加入插件配置
注意:server的listen端口要與storage.conf
中配置的http.server_port
一致胳蛮。
啟動nginx蜕窿,打印出插件pid就已經(jīng)成功
集群搭建
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ù)集群即搭建完畢。