go-fastdfs 分布式文件系統搭建


分布式文件系統搭建

  • 選項一: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其他配置詳細介紹

View Code

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)
go-fastdfs-web-download

運行

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


免責聲明!

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



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