一. 背景
? ? ?當(dāng)我們需要存儲海量文件的時候毕谴,可能想到的幾種方式:
? ? ? ? ?1.? ?將文件存儲于本地文件系統(tǒng)中拦英,然后將其路徑存儲于關(guān)系型數(shù)據(jù)庫入客。
? ? ? ? ? 2.? 部署HDFS邦尊,將文件存儲于HDFS分布式文件系統(tǒng)中,然后記錄其存儲路徑关拒。
? ? ? ? ? 3.? 通過HBase MOB機(jī)制進(jìn)行小文件的存儲佃蚜。
? ? ? ? ? 4.? 將文件存儲于FastDFS這樣的分布式文件系統(tǒng)中/
? ? ? ?如何選擇存儲方式會對文件的讀寫性能產(chǎn)生大的影響,因此需要根據(jù)使用場景匹配其適合的存儲場景:
? ? ? ? ? 1. 第一種是最傳統(tǒng)的軟件系統(tǒng)的存儲方式着绊,僅適合存儲數(shù)量較少爽锥,臨時使用,可周期性刪除的文件的畔柔,由于文件存儲在本地氯夷,因此文件的安全,存儲的擴(kuò)展都不能得到支持靶擦,如若沒有定時刪除機(jī)制遲早會將磁盤寫滿腮考,對系統(tǒng)和應(yīng)用的穩(wěn)定性產(chǎn)生影響。
? ? ? ? ? 2. 第二種方式是大數(shù)據(jù)的常用存儲手段玄捕,由于hdfs中namenode的元數(shù)據(jù)數(shù)量限制及其有限節(jié)點性能的壓力踩蔚,不適合存儲海量的小文件(如互聯(lián)網(wǎng)應(yīng)用中的用戶頭像)以及數(shù)據(jù)頻繁的更新的場景。hdfs中適合存儲大文件枚粘,并且適合一次寫入多次讀取的批量計算的情況馅闽。
? ? ? ? ? 3.? 第三種方式通過HBase 的MOB機(jī)制進(jìn)行文件的存儲,這種方式因為涉及到圖片的壓縮會帶來region性能的下降馍迄,因此存儲小于10K的文件比較適合福也,如果超過100K的文件會經(jīng)常造成regionserver不可用的問題。
? ? ? ? ? 4.? 第四種方式FastDFS本文主要討論攀圈,適合海量小文件的分布式存儲暴凑,支持storage從節(jié)點的橫向擴(kuò)展,結(jié)合storage負(fù)載均衡機(jī)制赘来,可大大提高海量小文件的訪問性能现喳。Fastdfs不適合存儲GB以上的大文件凯傲,會造成傳輸超時等問題。
二. Fastdfs原理
????????FastDFS是一個開源的輕量級分布式文件系統(tǒng)嗦篱,它對文件進(jìn)行管理冰单,功能包括:文件存儲、文件同步灸促、文件訪問(文件上傳球凰、文件下載)等,解決了大容量存儲和負(fù)載均衡的問題腿宰,特別適合以中小文件(4KB < file_size <500MB)為載體的在線服務(wù),如相冊網(wǎng)站缘厢、視頻網(wǎng)站等等吃度。
三. FastDFS容器化安裝
? ? FastDFS本地化安裝比較復(fù)雜,需要大量的配置及相關(guān)插件安裝贴硫,不利于分布式環(huán)境的部署和遷移椿每。因此將其所有的配置容器化打包為docker鏡像進(jìn)行部署,僅僅需要一兩步即可完成英遭,使用起來非常方便间护。本文采用的是已經(jīng)封裝好的鏡像。
????1挖诸、服務(wù)規(guī)劃
????2汁尺、節(jié)點先安裝docker服務(wù)
? ? ? ????? vm1,vm2,vm3 節(jié)點都執(zhí)行。
? ? ? ? ????參考:https://www.cnblogs.com/yufeng218/p/8370670.html
????3多律、獲取FastDFS容器鏡像
? ??????? ? vm1,vm2,vm3 節(jié)點都執(zhí)行痴突。
? ? ? ? ????執(zhí)行命令:docker pull?delron/fastdfs
? ? ?4.? 啟動tracker服務(wù):
????????????vm3節(jié)點執(zhí)行。
? ? ? ????? 執(zhí)行命令:docker run -dti --network=host --name tracker -eTRACKER_SERVER=192.168.1.53:22122-v /var/fdfs/tracker:/var/fdfs delron/fastdfs tracker
? ? ? ? ? ? 注:可根據(jù)實際需要修改掛在本地卷路徑狼荞,當(dāng)前掛載在本地/var/fdfs/tracker下)
? ? ???5.? 啟動storage服務(wù):
? ??????????vm1,vm2,vm3 節(jié)點都執(zhí)行辽装。
? ??????????執(zhí)行命令:docker run -dti --network=host --name storage -eTRACKER_SERVER=192.168.1.53:22122-v /var/fdfs/storage:/var/fdfs delron/fastdfs storage
? ???????????(注:可根據(jù)實際需要修改掛在本地卷路徑,當(dāng)前掛載在本地/var/fdfs/storage下)
? ????? 6. 啟動成功后相味,可以在本地路徑下找到其掛在目錄(每個存儲節(jié)點都一樣):
四. FastDFS命令行文件操作
? ? ?通過命令行的方式來操作文件拾积,由于FastDFS的命令都被封裝在容器環(huán)境中需要進(jìn)入容器中進(jìn)行操作:
? ? 1. 查看已經(jīng)運行容器
? ? 2. 進(jìn)入tracker或者storage容器?
????????執(zhí)行命令:docker exec -it 45a8fde90694 /bin/bash
? ? 3. 上傳文件到fastdfs集群:
? ? ? ? 執(zhí)行命令:/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /anaconda-post.log
? ? ? ? 命令返回:group1/M00/00/00/wKgBNF0R_kuAOCx_AAAuyAYKcJ4393.log
????????其中:?/anaconda-post.log為需要上傳的文件絕對路徑
? ? 4. 退出容器
? ? ? ? 執(zhí)行命令:exit
? ? 5. 查看已上傳的文件
????????在本地系統(tǒng)中路徑/var/fdfs/storage/data/00/00/下查看已經(jīng)上傳的文件wKgBNF0R_kuAOCx_AAAuyAYKcJ4393.log,fastdfs會將上傳的文件重命名為一個隨機(jī)的名稱。
五. 通過http方式直接訪問文件
?? ? 若需要直接通過瀏覽器訪問存儲的文件(例如圖片)丰涉,需要用到FastDFS的http服務(wù)(默認(rèn)8888端口)拓巧。其訪問方式如下:
????http://192.168.1.51:8888/group1/M00/00/00/group1/M00/00/00/wKgBNV0SytyAYKipANXq6U4HsAU139.jpg
????http://192.168.1.52:8888/group1/M00/00/00/group1/M00/00/00/wKgBNV0SytyAYKipANXq6U4HsAU139.jpg
????http://192.168.1.53:8888/group1/M00/00/00/group1/M00/00/00/wKgBNV0SytyAYKipANXq6U4HsAU139.jpg
????FastDFS的HTTP服務(wù)較為簡單,即需要直接訪問某一個storage的地址一死,而無法提供統(tǒng)一的地址和負(fù)載均衡等高性能的服務(wù)玲销。因此需要我們手動配置nginx來實現(xiàn)這三臺服務(wù)器統(tǒng)一的訪問及負(fù)載均衡。
????此處nginx同樣使用容器進(jìn)行部署(docker pull nginx:1.15)摘符,nginx.conf文件主要配置如下:
? ? 即訪問192.168.1.51:8808鏈接會被隨機(jī)映射到實際的vm1贤斜,vm2策吠,vm3三臺服務(wù)器上獲取數(shù)據(jù),這樣就解決了統(tǒng)一訪問鏈接和負(fù)載均衡的問題瘩绒,如下:
六. 通過java操作FastDFS的文件操作
? ? 1. 新建maven項目猴抹,在pom中添加依賴:
? ? 2. 添加fastdfs操作配置文件fdfs_client.conf:
? ????2. fastdfs操作類:
? ? ? ? ? 文件上傳:
?? ? ? 文件下載:
??? ? ?文件刪除:
??? ? ?文件信息獲取:
七. FastDFS在企業(yè)中的應(yīng)用
? ? ? ? 海量的小文件的頻繁讀取锁荔,包括:
?????????????-文檔蟀给、圖片、音頻阳堕、視頻