go-fastdfs
go-fastdfs是一個基於http協議的分布式文件系統,它基於大道至簡的設計理念,一切從簡設計,使得它的運維及擴展變得更加簡單,它具有高性能、高可靠、無中心、免維護等優點。
此文件系統搭建十分簡單,並且性能極佳,相對於fastdfs,go-fastdfs部署運維十分簡單,中小型公司使用完全足夠。且項目本身自帶性能測試與壓測腳本,測試也十分簡單。
急速體驗
適用於開發,或驗證功能階段。
wget --no-check-certificate https://github.com/sjqzhang/go-fastdfs/releases/download/v1.3.4/fileserver -O fileserver && chmod +x fileserver && ./fileserver
編譯安裝
git clone https://github.com/sjqzhang/go-fastdfs.git
cd go-fastdfs
mv vendor src
pwd=`pwd`
GOPATH=$pwd go build -o fileserver fileserver.go
./fileserver
配置說明
安裝完成后data/conf 目錄下會有一個cfg.json文件
{
"綁定端號": "端口",
"addr": ":8080",
"PeerID": "集群內唯一,請使用0-9的單字符,默認自動生成",
"peer_id": "2",
"本主機地址": "本機http地址,默認自動生成(注意端口必須與addr中的端口一致),必段為內網,自動生成不為內網請自行修改,下同",
"host": "http://192.168.75.5:8080",
"集群": "集群列表,注意為了高可用,IP必須不能是同一個,同一不會自動備份,且不能為127.0.0.1,且必須為內網IP,默認自動生成",
"peers": ["http://192.168.75.5:8080"],
"組號": "用於區別不同的集群(上傳或下載)與support_group_manage配合使用,帶在下載路徑中",
"group": "group1",
"是否支持按組(集群)管理,主要用途是Nginx支持多集群": "默認不支持,不支持時路徑為http://10.1.5.4:8080/action,支持時為http://10.1.5.4:8080/group(配置中的group參數)/action,action為動作名,如status,delete,sync等",
"support_group_manage": false,
"是否合並小文件": "默認不合並,合並可以解決inode不夠用的情況(當前對於小於1M文件)進行合並",
"enable_merge_small_file": false,
"允許后綴名": "允許可以上傳的文件后綴名,如jpg,jpeg,png等。留空允許所有。",
"extensions": [],
"重試同步失敗文件的時間": "單位秒",
"refresh_interval": 1800,
"是否自動重命名": "默認不自動重命名,使用原文件名",
"rename_file": false,
"是否支持web上傳,方便調試": "默認支持web上傳",
"enable_web_upload": true,
"是否支持非日期路徑": "默認支持非日期路徑,也即支持自定義路徑,需要上傳文件時指定path",
"enable_custom_path": true,
"下載域名": "用於外網下載文件的域名,不包含http://",
"download_domain": "",
"場景列表": "當設定后,用戶指的場景必項在列表中,默認不做限制(注意:如果想開啟場景認功能,格式如下:'場景名:googleauth_secret' 如 default:N7IET373HB2C5M6D ",
"scenes": [],
"默認場景": "默認default",
"default_scene": "default",
"是否顯示目錄": "默認顯示,方便調試用,上線時請關閉",
"show_dir": true,
"郵件配置": "",
"mail": {
"user": "abc@163.com",
"password": "abc",
"host": "smtp.163.com:25"
},
"告警接收郵件列表": "接收人數組",
"alarm_receivers": [],
"告警接收URL": "方法post,參數:subject,message",
"alarm_url": "",
"下載是否需帶token": "真假",
"download_use_token": false,
"下載token過期時間": "單位秒",
"download_token_expire": 600,
"是否自動修復": "在超過1億文件時出現性能問題,取消此選項,請手動按天同步,請查看FAQ",
"auto_repair": true,
"文件去重算法md5可能存在沖突,默認md5": "sha1|md5",
"file_sum_arithmetic": "md5",
"管理ip列表": "用於管理集的ip白名單,",
"admin_ips": ["127.0.0.1"],
"是否啟用遷移": "默認不啟用",
"enable_migrate": false,
"文件是否去重": "默認去重",
"enable_distinct_file": true,
"是否開啟跨站訪問": "默認開啟",
"enable_cross_origin": true,
"是否開啟Google認證,實現安全的上傳、下載": "默認不開啟",
"enable_google_auth": false,
"認證url": "當url不為空時生效,注意:普通上傳中使用http參數 auth_token 作為認證參數, 在斷點續傳中通過HTTP頭Upload-Metadata中的auth_token作為認證參數,認證流程參考認證架構圖",
"auth_url": "",
"下載是否認證": "默認不認證(注意此選項是在auth_url不為空的情況下生效)",
"enable_download_auth": false,
"默認是否下載": "默認下載",
"default_download": true,
"本機是否只讀": "默認可讀可寫",
"read_only": false,
"是否開啟斷點續傳": "默認開啟",
"enable_tus": true,
"同步單一文件超時時間(單位秒)": "默認為0,程序自動計算,在特殊情況下,自已設定",
"sync_timeout": 0
}
集群部署圖
小集群安裝
適用於單一的集群,擴展性相對差一點。
http {
include mime.types;
default_type application/html;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log error;
sendfile on;
keepalive_timeout 65;
client_max_body_size 0;
proxy_redirect ~/big/upload/(.*) /big/upload/$1; #繼點續傳一定要設置(注意)
upstream go-fastdfs {
server 10.1.14.36:8080;
server 10.1.14.37:8080;
ip_hash; #notice:very important(注意)
}
server {
listen 80;
server_name localhost;
location / {
proxy_set_header Host $host; #notice:very important(注意)
proxy_set_header X-Real-IP $remote_addr; #notice:very important(注意)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #notice:very important(注意)
proxy_pass http://go-fastdfs;
}
}
}
海量集群安裝(推薦)
適用於海量集群,擴展性較好。
http {
include mime.types;
default_type application/html;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log error;
sendfile on;
keepalive_timeout 65;
rewrite_log on;
client_max_body_size 0;
proxy_redirect ~/(\w+)/big/upload/(.*) /$1/big/upload/$2; #繼點續傳一定要設置(注意)
#以下是一下橫向擴展的配置,當前統一大集群容量不夠時,只要增加一個小集群,也就是增加一個
#upstream ,一個小群集內按業務需求設定副本數,也就是機器數。
upstream gofastdfs-group1 {
server 10.1.51.70:8082;
#server 10.1.14.37:8082;
ip_hash; #notice:very important(注意)
}
upstream gofastdfs-group2 {
server 10.1.51.70:8083;
#server 10.1.14.36:8083;
ip_hash; #notice:very important(注意)
}
server {
listen 8001;
server_name localhost;
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;
}
}
}
最佳實戰
一、如果是海量存儲,不要開啟文件token認證功能,減少性能開消。
二、盡量用標准上傳,上傳后業務保存path,在業務用的時候再並接上域名(方便遷移擴展等)。
三、如果使用斷點續傳,上傳后一定要用文件id置換成path存儲(如何置換看QA/API文檔),為后面訪問減少性能開消。
四、盡量使用物理服務器部署,因為主要壓力或性能來自於IO
五、線上業務盡量使用nginx+gofastdfs部署架構(均衡算法使用ip_hash),以滿足后面的功能擴展性(nginx+lua)。_六、線上環境最好不要使用容器部署,容器適用於測試和功能驗證。
總結:業務保存的文件的path,減少后期訪問路徑轉換帶來開消,文件訪問權限由業務來完成,這樣性能最好,通用性強(可直接其它web服務器)。
重要提醒:如果開啟小文件合並功能,后期是無法刪除小文件的。
上傳結果說明:請使用md5,path,scene字段,其它是為了兼容老的線上系統添加的,以后有可能去掉。
集群搭建簡要步驟
一、先下載已編譯的可執行文件(用最新版本)
二、運行可執行文件(生成配置)
三、修改配置
peers:增加對端的http地址
檢查:
host:自動生成是否正確
peer_id:集群內是否唯一
四、重新運行服器
五、驗證服務是否OK
縮放圖片
在下載url中加入width各height參數。例如:http://127.0.0.1:8080/group1/haystack/5/124,0,27344,.jpg?download=0&width=100&height=100特明說明是:如果要等比例縮放,請將width或height設為0
在瀏覽器中直接顯示圖片
在下載url中加入download=0參數。例如:http://127.0.0.1:8080/group1/haystack/5/124,0,27344,.jpg?download=0
秒傳文件
通過http get的方式訪問上傳接口
http://10.0.5.9:8080/upload?md5=filesum&output=json
參數說明:
md5=sum(file) 文件的摘要算法要與文件務器的算法一致(算法支持md5|sha1),如果是斷點續傳,可以使用文件的id,也就是urlolad后的id
output=json|text 返回的格式
go-fastdfs-web
注意事項
默認端口8088,修改默認端口號更改config/application-prod.properties即可
如go-fastdfs開啟了按組管理,則需要填寫組名,反之不用填寫
進入安裝頁填寫集群地址時,該地址需要在go-fastdfs配置文件配置管理ip白名單,否則獲取不到數據!
文件列表功能需要go-fastdfs服務版本在v1.2.8以上
遇到獲取不到信息的功能,先試一下本地調用go-fastdfs接口看是否能獲取到
無環境版(Linux運行)
解壓壓縮包后,運行腳本,命令如下:
chmod +x goFastDfsWeb.sh
1.運行
./goFastDfsWeb.sh start
2.查看運行狀態
./goFastDfsWeb.sh status
3.重新啟動
./goFastDfsWeb.sh restart
4.停止
./goFastDfsWeb.sh stop
Linux自帶JRE環境版
解壓壓縮包后,運行腳本,命令如下:
chmod +x goFastDfsWeb.sh
1.運行
./goFastDfsWeb.sh start
2.查看運行狀態
./goFastDfsWeb.sh status
3.重新啟動
./goFastDfsWeb.sh restart
4.停止
./goFastDfsWeb.sh stop
開發說明
項目使用SpringBoot,Mybatis,Shiro進行開發,為方便后期用戶安裝,數據庫采用Sqlite,為了代碼的簡潔,使用了lombok插件,請在開發前提前安裝. 開發前請先將application.properties中的spring.profiles.active=prod改為dev環境,之后參照application-dev.properties進行配置
下載地址:
打包方式
將application.properties配置文件中spring.profiles.active的值改為prod
maven運行mvn clean package
完成之后得到jar,zip,tar.gz三種格式文件
實際操作:
1.下載Linux版本帶jre的,上傳后解壓縮,進入到目錄中
2.給腳本增加x可執行權限,執行腳本:./goFastDfsWeb.sh start
3.默認端口是8088,使用ip:port方式即可訪問
4.初次訪問需要填寫gofastdfs相關信息,設置web頁面訪問的賬號密碼等
修改默認端口號更改config/application-prod.properties即可