Linux下簡單又高可用seaweedfs檔案儲存伺服器搭建及應用

Linux下簡單又高可用seaweedfs檔案儲存伺服器搭建及應用

最近在工作上接觸到了seaweedfs,由於要用到它。所以準備去仔細探究一下。

那首先我們來分析一下seaweedfs是什麼?seaweedfs是一個非常優秀的由 golang 開發的分散式儲存開源專案。它是用來儲存檔案的系統,並且與使用的語言無關,使得檔案儲存在雲端變得非常方便。seaweedfs也是一個非常優秀的開源專案,Seaweedfs的設計原理是基於 Facebook 的一篇圖片儲存系統的論文Facebook-Haystack。一聽就感覺作者很NB,有興趣的可以去看一看Seaweedfs的原始碼,本文就講解seaweedfs的搭建和簡單應用。

seaweedfs的特點:
1 可以成儲存上億的檔案(根據你硬碟大小變化)
2 速度剛剛的

接下來,便讓我們開始進入正文。

一、seaweedfs的搭建

seaweedfs可以編譯安裝(需要VPN,網路環境不好,最好不用該方法安裝),也可以下載釋放版本映象安裝。

1、安裝GO環境

(1)、下載go語言包,go語言包地址
wget 地址

比如:

wget https://golangtc.com/static/go/1.9.2/go1.9.2.linux-amd64.tar.gz
(2)、解壓到指定目錄,並新增環境變數
sudo tar -C /usr/local -xzf go1.9.2.linux-amd64.tar.gz

新增環境變數

#工作目錄
export GOPATH=/opt/go
#解壓目錄
export GOROOT=/usr/local/go
export GOARCH=386
export GOOS=linux
export GOBIN=$GOROOT/bin
export GOTOOLS=$GOROOT/pkg/tool/
export PATH=$PATH:$GOBIN:$GOTOOLS
(3)、安裝git、mercurial
sudo apt-get install git
suod apt-get install mercurial
(4)、安裝seaweedfs

如果要編譯安裝執行下面命令,沒有VPN,可以忽略下面命令:

go get github.com/chrislusf/seaweedfs/go/weed 

下載安裝:seaweedfs地址

wget  https://github.com/chrislusf/seaweedfs/releases/download/0.76/linux_amd64.tar.gz
sudo tar -zxvf linux_amd64.tar.gz
(5)、配置執行seaweedfs

進入解壓目錄,以守護程序啟動seaweedfs的主服務及叢集(在啟動前,先要建立相應的目錄,/data/fileData,/data/t_v1,/data/t_v2,/data/t_v3)

sudo nohup ./weed master -mdir=/data/fileData -port=9333 -defaultReplication="001" -ip="ip地址" >>/data/fileData/server_sfs.log &
sudo ./weed volume -dir=/data/t_v1 -max=5 -mserver="ip地址:9333" -port=9080 -ip="ip地址" >>/data/t_v1_sfs.log &
sudo ./weed volume -dir=/data/t_v2 -max=5 -mserver="ip地址:9333" -port=9081 -ip="ip地址" >>/data/t_v2_sfs.log &
sudo ./weed volume -dir=/data/t_v3 -max=5 -mserver="ip地址:9333" -port=9082 -ip="ip地址" >>/data/t_v3_sfs.log &

將上面的ip地址換為具體的ip即可,預設可設為localhost。volume多少可以根據自己的情況新增。mdir、dir是指定檔案儲存路徑。

一個 MasterServer 對應三個 VolumeServer ,設定複製模式為 “001” , 也就是在相同 Rack 下複製副本為一份,也就是總共有兩份。如下:
描述

更多的其他配置可以檢視文件

二、seaweedfs的檔案應用

訪問伺服器ip地址:9333,可以看到如下介面
seaweedfs

(1)獲取fid,使用GET或POST訪問路徑http://localhost:9333/dir/assign,獲取fid和上傳檔案地址,seaweedfs會返回json的結果。

如下:

curl -X POST http://localhost:9333/dir/assign

得到結果:

{"fid":"1,08e684f060","url":"1ocalhost:9080","publicUrl":"localhost:9080","count":1}

fid就是上傳的標誌。
使用url或者publicUrl加上fid,就是檔案上傳的地址。如下:

 http://localhost:9080/1,08e684f060

接著就可以發起一個PUT或POST請求到上面的地址,把檔案上傳上去。

curl -X PUT -F [email protected]/home/back.png http://localhost:9080/1,08e684f060

結果如下:

{
"name": "back.png",
"size": 64300
}

(2)如果要更新一個檔案,直接發起POST或者PUT請求到url fid的地址即可。fid就是儲存圖片使用的fid。

(3)刪除圖片發起一個DELETE請求即可。

curl -X DELETE http://localhost:8080/1,08e684f060

(4)檢視檔案,需要fid。就是剛剛上傳圖片得到的fid。可以將其儲存在資料庫當中,查詢檔案時再呼叫。
當有多個Volume叢集時,可以通過引數指定檢視某個卷。

curl http://localhost:9333/dir/lookup?volumeId=2

得到具體的地址:

{"volumeId":"2","locations":[{"url":"localhost:9081","publicUrl":"localhost:9081"}]}

然後訪問具體的路由:

http://localhost:9081/fid

比如:http://localhost:9081/1,08e684f060
可以帶字尾,也可以不帶。
http://localhost:9081/1,08e684f060.jpg
還可以帶一些限定引數:
http://localhost:9081/1,08e684f060.jpg
http://localhost:9081/1,08e684f060.jpg?height=200&width=200
http://localhost:9081/1,08e684f060.jpg?height=200&width=200&mode=fit
http://localhost:9081/1,08e684f060.jpg?height=200&width=200&mode=fill

其實剛剛上傳的是在9080的volume1,9081是volume2。但是通過fid加上具體的volume埠,依舊可以訪問到圖片的地址。

三、seaweedfs客戶端使用

seaweedfs的使用與語言無關,都可以方便進行封裝。github上也有一些開放的client。比如這個java的客戶端。作者把執行緒分配、HTTP請求、檔案操作進行了封裝,更加方便。但是目前作者沒怎麼更新了,還有些問題。

我把客戶端的java程式碼進行了重新覆寫,上傳到github了,seaweedfs-java-client歡迎大家start。

這裡還有一些其他語言的客戶端,大家也可以去學習更改一下:

java-client:https://github.com/Shuyun123/seaweedfs-java-client

php-client:https://github.com/micjohnson/weed-php

node-client:https://github.com/cruzrr/node-weedfs

python-client:https://github.com/darkdarkfruit/python-weed

scala-client:https://github.com/chiradip/WeedFsScalaClient

四、擴充套件

除了seaweedfs,還有一些其他的檔案儲存,比如:bfs(支撐Bilibili的小檔案儲存系統),github地址 bfs。感興趣的讀者可以去學習一下。
還有比如阿里的https://github.com/alibaba/tfs,百度的https://github.com/baidu/bfs,fastdfs:https://github.com/happyfish100/fastdfs等。