go-fastdfs和配套使用的web頁面


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即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM