分布式文件系統搭建
- 選項一:B站開源的 BFS 分布式文件系統很適合小文件的存取,不過部署起來要復雜很。
- 選項二:C 原版 FastDFS,備選
- 選項三:其他分布式文件系統(GFS、HDFS、Lustre、Ceph、GridFS、mogileFS、TFS等);
- 選項四:無意中發現了 go 實現的 FastDFS
go-FastDFS 簡介
項目地址:https://github.com/sjqzhang/go-fastdfs
編譯版本下載地址:https://github.com/sjqzhang/go-fastdfs/releases
中文Wiki地址:https://github.com/sjqzhang/go-fastdfs/blob/master/README-en.md
gitee:https://gitee.com/sjqzhang/go-fastdfs
文檔:https://sjqzhang.github.io/go-fastdfs/install.html
下載go-fastdfs
wget https://github.com/sjqzhang/go-fastdfs/releases/download/v1.3.1/fileserver sudo mv fileserver /opt/godfs/fileserver sudo chmod -R 777 /opt/godfs # 更改go-fastdfs文件夾權限 /opt/godfs/fileserver & # 運行go-fastdfs
注意:fileserver 會在當前目錄下生成配置文件,所以,啟動前先進入fileserver根目錄
檢測是否啟動成功(下列文件會自動生成)
xxx@ubuntu:/opt/godfs$ ls conf data files fileserver log static
默認啟動端口8080
xxx@ubuntu:/opt/godfs$ sudo netstat -nlp | grep 8080 tcp6 0 0 :::8080 :::* LISTEN 34164/./fileserver
命令行上傳文件測試
xxx@ubuntu:~/Pictures$ curl -F file=@test.jpg -F path=test http://127.0.0.1:8080/upload http://127.0.0.1:8080/group1/test/test.jpg
在go-fastdfs中查看該文件
xxx@ubuntu:/opt/godfs/files/test$ ls test.jpg
Go-fastdfs程序崩潰后自啟動
supervisor: 參考:https://www.cnblogs.com/zhumengke/articles/11399764.html
配置文件:
[group:godfs] programs=godfs-7022 [program:godfs-7022] command=/opt/godfs/fileserver directory=/opt/godfs user=www-data autorestart=true redirect_stderr=true stdout_logfile=/home/xxx/logs/supervisor.log loglevel=info
Nginx 集群搭建
修改go-fastdfs配置文件
# sudo vim /opt/godfs/conf/cfg.json
"support_group_manage": false, # 修改為true,支持按組集群管理
go-fastdfs其他配置詳細介紹

Postman文件上傳,單機測試
配置Nginx配置文件
sudo vim /etc/nginx/sites-enabled/gofds
upstream gofastdfs-group1 {
server 127.0.0.1:8080;
ip_hash; #notice:very important(注意)
}
server {
# the port your site will be served on
listen 9999;
# the domain name it will serve for
server_name 0.0.0.0; # substitute your machine's IP address or FQDN
charset utf-8;
sendfile on;
keepalive_timeout 65;
rewrite_log on;
client_max_body_size 0;
proxy_redirect ~/(\w+)/big/upload/(.*) /$1/big/upload/$2; #繼點續傳一定要設置(注意)
if ( $request_uri ~ /godfs/group ){
# 注意group會隨組的前綴改變而改變
rewrite ^/godfs/(.*)$ /$1 last;
}
location ~ /group(\d) {
#統一在url前增加godfs,以便統一出入口。
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://gofastdfs-group$1;
}
location ~ /godfs/upload {
#這是一個橫向擴展配置,前期可能只有一個集群group1,當group1滿后,只需將上傳指向group2,
#也就是將rewrite , proxy_pass 中的group1改為group2即可。
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
rewrite ^/godfs/upload /group1/upload break;
proxy_pass http://gofastdfs-group1;
}
location ~ /godfs/big/upload {
#以上上類似。
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
rewrite ^/godfs/upload /group1/big/upload break;
proxy_pass http://gofastdfs-group1;
}
}
Postman集群測試
用戶自定義認證
如果你是海量文件,又需要有自己的一些驗證邏輯,建議使用自定義認證。
修改go-fastdfs配置文件
"auth_url": "", # 填入自己認證的URL路徑即可,如:http://www.baidu.com
管理API接口
API接口詳細文檔:https://sjqzhang.github.io/go-fastdfs/api.html
重新加載配置文件
curl http://127.0.0.1:8080/group1/reload
文件刪除,文件不能直接在go-fastdfs文件庫(/opt/go-fastdfs/files)中刪除,因為go-fastdfs還有一份元數據
http://127.0.0.1:8080/group1/delete 參數: md5:文件的摘要(md5|sha1) 視配置定 path:文件路徑 md5與path二選一 說明:md5或path都是上傳文件時返回的信息,要以json方式返回才能看到(參閱瀏覽器上傳) http://127.0.0.1:8080/delete?md5=430a71f5c5e093a105452819cc48cc9c
數據美化:go-fastdfs-web 監控工具安裝
項目地址:https://github.com/perfree/go-fastdfs-web
各打包版本下載地址:https://github.com/perfree/go-fastdfs-web/releases
1.安裝
下載地址:https://github.com/perfree/go-fastdfs-web/releases/download/v1.3.4/go-fastdfs-web-1.3.4.tar.gz
到 官方下載頁面 下載所需的版本(帶jre或者不到jre)
運行
root# ./goFastDfsWeb.sh start
如果上述命令不好使,可以
java -jar go-fastdfs-web.jar
127.0.0.1:8088
問題匯總
已經使用fastdfs存儲的文件可以遷移到go fastdfs下么?
答案是可以的,你擔心的問題是路徑改變,go fastdfs為你考慮了這一點 curl -F file=@data/00/00/_78HAFwyvN2AK6ChAAHg8gw80FQ213.jpg -F path=M00/00/00/ http://127.0.0.1:8080/upload 同理可以用一行命令遷移所有文件 cd fastdfs/data && find -type f |xargs -n 1 -I {} curl -F file=@data/{} -F path=M00/00/00/ http://127.0.0.1:8080/
適合海量存儲嗎?
答案:適合海量存儲 特別說明: 需然用leveldb作為元數據存儲,但不強依懶leveldb, 並且進行超過1億以上的文件進行壓測(可以用項目提供的腳本進行壓測,有問題及時反饋到issue), 1億文件元數據大小約5G,導出元數據文本大小22G
還需要安裝nginx么?
可以不安裝,也可以選擇安裝
go fastdfs 本身就是一個高性能的web文件服務器。
能動態加載配置么?
答案:是可以的,但要更新到最新版本 步驟: 1)修改 conf/cfg.json 文件 2)訪問 http://10.1.xx.60:8080/reload 3) 注意:每個節點都需要進行同樣的操作
內存占用很高是怎么回事?
正常情況下,內存應該低於2G,除非每天上傳文件超過百萬 內存異常,主要是集群的文件沒有同步,同時開啟了自動修復功能 處理辦法,刪除data目錄下當天的errors.md5文件,關閉自動修復,重啟服務 參閱系統狀態說明
如何查看集群文件信息?
http://10.1.xx.60:8080/stat 如果出現文件統計出錯怎么辦? 請刪除 data目錄下的 stat.json文件 重啟服務,請系統自動重新計算文件數。 或者調用 http://10.1.xx.60:8080/repair_stat
可靠性怎樣,能用於生產環境么?
本項目已大規模用於生產環境,如擔心不能滿足
可以在使用前對其各項特性進行壓力測試,有任何
問題可以直接提issue
能不能在一台機器部置多個服務端?
不能,在設計之初就已考慮到集群的高可用問題,為了保證集群的真正可用,必須為不同的ip,ip 不能用 127.0.0.1 錯誤 "peers": ["http://127.0.0.1:8080","http://127.0.0.1:8081","http://127.0.0.1:8082"] 正確 "peers": ["http://10.0.0.3:8080","http://10.0.0.4:8080","http://10.0.0.5:8080"]
文件不同步了怎么辦?
正常情況下,集群會每小時自動同步修復文件。(性能較差,在海量情況下建議關閉自動修復) 那異常情況下怎么? 答案:手動同步(最好在低峰執行) http://172.16.70.123:7080/sync?date=20190117&force=1 (說明:要在文件多的服務器上執行,相關於推送到別的服務器) 參數說明:date 表示同步那一天的數據 force 1.表示是否強制同步當天所有(性能差),0.表示只同步失敗的文件 不同步的情況: 1) 原來運行N台,現在突然加入一台變成N+1台 2)原來運行N台,某一台機器出現問題,變成N-1台 如果出現多天數據不一致怎么辦?能一次同步所有嗎? 答案是可以:(最好在低峰執行) http://172.16.70.123:7080/repair?force=1
文件不同步會影響訪問嗎?
答案:不會影響,會在訪問不到時,自動修復不同步的文件。
如何查看系統狀態及說明?
http://172.16.70.123:7080/status 注意:(Fs.Peers是不帶本機的,如果帶有可能出問題) 本機為 Fs.Local sts["Fs.ErrorSetSize"] = this.errorset.Cardinality() 這個會導致內存增加
如何壓測?
先用gen_file.py產生大量文件(注意如果要生成大文件,自已在內容中乘上一個大的數即可) 例如: ```python import os j=0 for i in range(0,1000000): if i%1000==0: j=i os.system('mkdir %s'%(i)) with open('%s/%s.txt'%(j,i),'w+') as f: f.write(str(i)*1024)
接着用benchmark.py進行壓測
建議在前期規划時,盡量采購大容量的機器作為存儲服務器,如果要兩個復本就用兩台組成一個集群,如果要三個復本 就三台組成一個集群。(注意每台服務器最好配置保持一樣) 如果提高可用性,只要在現在的集群peers中加入新的機器,再對集群進行修復即可。 修復辦法 http://172.16.70.123:7080/repair?force=1 (建議低峰變更) 如何擴容?(特別注意:為了有更好的擴展性建集群時最好請使用邏輯卷) 為簡單可靠起見,直接搭建一個新集群即可(搭建就是啟動./fileserver進程,設置一下peers的IP地址,三五分鍾的事) issue中chengyuansen同學向我提議使用增加擴容特性,我覺得對代碼邏輯及運維都增加復雜度,暫時沒有加入這特性。
相關文章
go-fastdfs 分布式文件系統搭建:https://blog.csdn.net/tmt123421/article/details/90522244
go-fastdfs更人性化的高性能圖片服務器:https://blog.csdn.net/u014131617/article/details/86689652