在Ubuntu 20.04上設置SeaweedFS分布式對象存儲集群

在這個互聯時代,隨着信息的激增,許多應用程序需要更多的數據來描述客戶端,提供AI,創建史詩級的數據項目等等。處理PB級信息的擴散。為了能夠快速處理,存儲和檢索數據,您需要一個高效,可靠和穩定的系統。 已經建立了一些系統來大規模處理這種數據量,例如Ceph,GlusterFS,HDFS,MinIO和SeawedFS。它們的性質和處理對象存儲的方式都非常出色,因此本指南將重點介紹SeawedFS。在檢查了其功能之後,請沉浸在安裝中。首先,讓我們了解SeawedFS。

SeaweedFS是一個分布式對象存儲和文件系統,用於快速存儲和交付數十億個文件。對象存儲具有O(1)磁盤搜索和透明雲集成。 Filer支持跨集群的主動-主動複製,Kubernetes,POSIX,S3 API,加密,熱存儲擦除編碼,FUSE安裝,Hadoop和WebDAV。來源: SeawedFSGitHub空間

SeaweedFS最初是作為對象存儲區,用於高效處理小文件。代替管理中央主機上的所有文件元數據,中央主機僅管理文件卷,從而允許這些卷服務器管理文件及其元數據。這樣可以減輕來自中央主機的並發壓力,將文件元數據傳播到卷服務器,並加快文件訪問(O(1),通常僅一個磁盤讀取操作。 SeawedFSGitHub空間

海藻有兩個目的。

  • 保存數十億個文件!
  • 提供高速文件!

海藻FS的功能

海藻具有向世界展示的以下功能:

  • SeaweedFS可以與雲透明集成。您可以實現快速的本地訪問時間和靈活的雲存儲容量,而無需在客戶端進行任何更改。
  • SeaweedFS具有O(1)磁盤讀取功能,非常簡單,您可以在實際用例中挑戰性能。每個文件的元數據只有40字節的磁盤存儲開銷。
  • 您可以為機架和數據中心選擇無複製或不同複製級別。
  • 主服務器自動故障轉移–沒有單點故障(SPOF)。
  • 根據文件的mime類型自動進行Gzip壓縮。
  • 在刪除或更新後自動壓縮以回收磁盤空間。
  • 自動輸入TTL的到期日期。
  • 可以將具有某些磁盤空間的服務器添加到總存儲容量中。
  • 除非由admin命令觸發,否則添加/刪除服務器不會導致數據重新平衡。
  • 可選的圖像大小調整。

在Ubuntu 20.04上安裝SeaweedFS

然後穿上靴子和手套,去農場,安裝SeaweedFS,為Ubuntu 20.04服務器好好澆水。在將鏟子推入泥土之前,請按照以下步驟首先安裝SeeweedFS所需的Go。

步驟1:準備服務器

這是非常重要的一步,因為在繼續進行SeaweedFS and Go安裝之前,您將安裝最新的軟件和補丁。在此處也安裝必需的工具。

sudo apt update
sudo apt install vim curl wget zip git -y
sudo apt install build-essential autoconf automake gdb git libffi-dev zlib1g-dev libssl-dev -y

步驟2:獲取並安裝Go

您可以使用APT儲存庫中可用的Golang,也可以從源中提取。

方法1:從APT存儲庫安裝。

運行以下命令,從APT存儲庫在Ubuntu上安裝Golang。

sudo apt install golang

方法2:手動安裝

訪問 前往下載頁面 要獲得最新的Gotarball版本:

cd ~
wget -c https://golang.org/dl/go1.15.5.linux-amd64.tar.gz -O - | sudo tar -xz -C /usr/local

之後,您需要將“ / usr / local / go / bin”目錄添加到PATH環境變量中,以便服務器可以找到Go可執行二進制文件。為此,將以下行添加到/ etc / profile文件(對於系統範圍的安裝)或$ HOME / .profile文件(對於當前用戶的安裝):

echo "export PATH=$PATH:/usr/local/go/bin" | sudo tee -a /etc/profile

#### For the current user installation

echo "export PATH=$PATH:/usr/local/go/bin" | tee -a $HOME/.profile

根據編輯後的文件獲取文件源,並允許將新的PATH環境變量加載到當前的Shell會話中。

$ source ~/.profile

# Or
$ source /etc/profile

步驟3:檢出SeaweedFS儲存庫

要安裝SeaweedFS,您需要將所需的文件帶到服務器上。所有資源都在GitHub上,因此請克隆存儲庫並繼續安裝。

cd ~
git clone https://github.com/chrislusf/seaweedfs.git

步驟4:下載,編譯和安裝SeaweedFS

克隆所有源之後,轉到新目錄並運行以下命令以安裝SeaweedFS項目

$ cd ~/seaweedfs
$ make install

##Progress of the installation
$ go get  -d ./weed/
go: downloading github.com/chrislusf/raft v1.0.3
go: downloading github.com/golang/protobuf v1.4.2
go: downloading github.com/gorilla/mux v1.7.4
go: downloading google.golang.org/grpc v1.29.1
go: downloading github.com/google/uuid v1.1.1
go: downloading github.com/syndtr/goleveldb v1.0.0
go: downloading go.etcd.io/etcd v0.5.0-alpha.5.0.20200425165423-262c93980547
go: downloading github.com/klauspost/crc32 v1.2.0

完成後,可執行文件“雜草$ GOPATH / bin 目錄。不幸的是,在安裝雜草後, $ GOPATH 在當前主目錄下。這裡有雜草。〜/去/垃圾箱/雜草“因此,要解決此問題,請將SeaweedFS二進制文件複製到安裝Go的先前位置。 第2步 像這樣:

sudo cp ~/go/bin/weed   /usr/local/bin/

現在”雜草該命令位於PATH環境變量中,您可以繼續輕鬆配置SeaweedFS,如下一步所示。

$ weed version
version 30GB 2.12 6d30b21b linux amd64

步驟5:Seaweed FS使用示例

要了解此步驟中提供的簡單示例,最好先考慮一下SeaweedFS的工作機制。該體系結構非常簡單。實際數據存儲在存儲節點的卷上(可以在同一服務器上,也可以在其他服務器上)。 卷服務器可以具有多個卷,並且可以通過基本身份驗證支持讀和寫訪問。來源:SeaweedFS文檔

所有卷均由主服務器管理,該主服務器包含卷ID到卷服務器的映射。

SeaweedFS管理主服務器的數據量,而不是管理諸如分布式文件系統之類的塊。每個數據卷的大小約為32GB,可以容納大量文件。同樣,每個存儲節點可以具有許多數據量。因此,主節點僅需要存儲有關卷的元數據。這是相當少量的數據,並且通常是穩定的。來源:SeaweedFS文檔

默認情況下,主節點在端口9333上運行,而卷節點在端口8080上運行。要對此進行可視化,請分別在端口8080和8081上啟動一個主節點和兩個卷節點。理想情況下,如上所述,它們應該從不同的計算機啟動,但是以一個服務器為例。如果在其他服務器上啟動卷,請確保-mserver IP地址指向主服務器。此外,主端口必須可以從卷服務器/節點訪問。

SeaweedFS使用HTTP REST操作來讀取,寫入和刪除。響應採用JSON或JSONP格式。

啟動主服務器

因為它是開放的,所以默認情況下,masternode在端口9333上運行。您可以按以下方式啟動主服務器:

選項1:手動方式

$ weed master &

I1126 20:22:17  6485 file_util.go:23] Folder /tmp Permission: -rwxrwxrwx
I1126 20:22:17  6485 master.go:168] current: 172.22.3.196:9333 peers:
I1126 20:22:17  6485 master_server.go:107] Volume Size Limit is 30000 MB
I1126 20:22:17  6485 master_server.go:192] adminScripts:
I1126 20:22:17  6485 master.go:122] Start Seaweed Master 30GB 2.12 a1021570 at 0.0.0.0:9333
I1126 20:22:17  6485 raft_server.go:70] Starting RaftServer with 172.22.3.196:9333
I1126 20:22:17  6485 raft_server.go:129] current cluster leader:

選項2:使用Systemd啟動主服務器

您可以使用Systemd通過創建單位文件來引導主服務器,如下所示:

sudo tee /etc/systemd/system/seaweedmaster.service<<EOF
[Unit]
Description=SeaweedFS Master
After=network.target

[Service]
Type=simple
User=root
Group=root

ExecStart=/usr/local/go/bin/weed master
WorkingDirectory=/usr/local/go/bin/
SyslogIdentifier=seaweedfs-master

[Install]
WantedBy=multi-user.target
EOF

更新文件後,您需要重新加載守護程序並啟動主服務器,如下所示

sudo systemctl daemon-reload
sudo systemctl start seaweedmaster
sudo systemctl enable seaweedmaster

然後檢查其狀態

$ systemctl status seaweedmaster -l
● seaweedmaster.service - SeaweedFS Master
     Loaded: loaded (/etc/systemd/system/seaweedmaster.service; disabled; vendor preset: enabled)
     Active: active (running) since Mon 2020-11-30 08:11:37 UTC; 2s ago
   Main PID: 1653 (weed)
      Tasks: 10 (limit: 2204)
     Memory: 11.8M
     CGroup: /system.slice/seaweedmaster.service
             └─1653 /usr/local/go/bin/weed master

啟動卷服務器

一旦主機準備就緒並等待卷,就可以使用以下命令啟動該卷:首先,創建一個示例目錄。

mkdir /tmp/{data1,data2,data3,data4}}

接下來,讓我們創建第一個卷,如下所示。 (第一個命令,然後是shell輸出)

選項1:手動方式

$ weed volume -dir="/tmp/data1" -max=5  -mserver="localhost:9333" -port=8080 &


I1126 20:37:24  6595 disk_location.go:133] Store started on dir: /tmp/data1 with 0 volumes max 5        
I1126 20:37:24  6595 disk_location.go:136] Store started on dir: /tmp/data1 with 0 ec shards
I1126 20:37:24  6595 volume.go:331] Start Seaweed volume server 30GB 2.12 a1021570 at 0.0.0.0:8080      
I1126 20:37:24  6595 volume_grpc_client_to_master.go:52] Volume server start with seed master nodes: [localhost:9333]
I1126 20:37:24  6595 volume_grpc_client_to_master.go:114] Heartbeat to: localhost:9333
I1126 20:37:24  6507 node.go:278] topo adds child DefaultDataCenter
I1126 20:37:24  6507 node.go:278] topo:DefaultDataCenter adds child DefaultRack
I1126 20:37:24  6507 node.go:278] topo:DefaultDataCenter:DefaultRack adds child 172.22.3.196:8080       
I1126 20:37:24  6507 master_grpc_server.go:73] added volume server 172.22.3.196:8080
I1126 20:37:24  6595 volume_grpc_client_to_master.go:135] Volume Server found a new master newLeader: 172.22.3.196:9333 instead of localhost:9333
W1126 20:37:24  6507 master_grpc_server.go:57] SendHeartbeat.Recv server 172.22.3.196:8080 : rpc error: 
code = Canceled desc = context canceled
I1126 20:37:24  6507 node.go:294] topo:DefaultDataCenter:DefaultRack removes 172.22.3.196:8080
I1126 20:37:24  6507 master_grpc_server.go:29] unregister disconnected volume server 172.22.3.196:8080  
I1126 20:37:27  6595 volume_grpc_client_to_master.go:114] Heartbeat to: 172.22.3.196:9333
I1126 20:37:27  6507 node.go:278] topo:DefaultDataCenter:DefaultRack adds child 172.22.3.196:8080
I1126 20:37:27  6507 master_grpc_server.go:73] added volume server 172.22.3.196:8080

然後重新創建第二個,如下所示: (第一個命令,然後是shell輸出)

$ weed volume -dir="/tmp/data2" -max=10 -mserver="localhost:9333" -port=8081 &

I1126 20:38:56  6612 disk_location.go:133] Store started on dir: /tmp/data2 with 0 volumes max 10       
I1126 20:38:56  6612 disk_location.go:136] Store started on dir: /tmp/data2 with 0 ec shards
I1126 20:38:56  6612 volume_grpc_client_to_master.go:52] Volume server start with seed master nodes: [localhost:9333]
I1126 20:38:56  6612 volume.go:331] Start Seaweed volume server 30GB 2.12 a1021570 at 0.0.0.0:8081      
I1126 20:38:56  6612 volume_grpc_client_to_master.go:114] Heartbeat to: localhost:9333
I1126 20:38:56  6507 node.go:278] topo:DefaultDataCenter:DefaultRack adds child 172.22.3.196:8081       
I1126 20:38:56  6507 master_grpc_server.go:73] added volume server 172.22.3.196:8081
I1126 20:38:56  6612 volume_grpc_client_to_master.go:135] Volume Server found a new master newLeader: 172.22.3.196:9333 instead of localhost:9333
W1126 20:38:56  6507 master_grpc_server.go:57] SendHeartbeat.Recv server 172.22.3.196:8081 : rpc error: 
code = Canceled desc = context canceled
I1126 20:38:56  6507 node.go:294] topo:DefaultDataCenter:DefaultRack removes 172.22.3.196:8081
I1126 20:38:56  6507 master_grpc_server.go:29] unregister disconnected volume server 172.22.3.196:8081  
I1126 20:38:59  6612 volume_grpc_client_to_master.go:114] Heartbeat to: 172.22.3.196:9333
I1126 20:38:59  6507 node.go:278] topo:DefaultDataCenter:DefaultRack adds child 172.22.3.196:8081
I1126 20:38:59  6507 master_grpc_server.go:73] added volume server 172.22.3.196:8081

選項2:使用SystemD

要開始使用Systemd,需要創建兩個或更多的體積文件,以備不時之需。就像這樣簡單:

對於第1卷

$ sudo vim /etc/systemd/system/seaweedvolume1.service

[Unit]
Description=SeaweedFS Volume
After=network.target

[Service]
Type=simple
User=root
Group=root

ExecStart=/usr/local/go/bin/weed volume -dir="/tmp/data2" -max=10 -mserver="172.22.3.196:9333" -port=8081
WorkingDirectory=/usr/local/go/bin/
SyslogIdentifier=seaweedfs-volume

[Install]
WantedBy=multi-user.target

用正確的值替換卷路徑,然後啟動並啟用它。

sudo systemctl daemon-reload
sudo systemctl start seaweedvolume1.service
sudo systemctl enable seaweedvolume1.service

檢查狀態:

$ systemctl status seaweedvolume1
● seaweedvolume1.service - SeaweedFS Volume
     Loaded: loaded (/etc/systemd/system/seaweedvolume1.service; disabled; vendor preset: enabled)
     Active: active (running) since Mon 2020-11-30 08:24:43 UTC; 3s ago
   Main PID: 2063 (weed)
      Tasks: 9 (limit: 2204)
     Memory: 9.8M
     CGroup: /system.slice/seaweedvolume1.service
             └─2063 /usr/local/go/bin/weed volume -dir=/tmp/data3 -max=10 -mserver=localhost:9333 -port=8081 -ip=172.22.3.196

對於第2卷

$ sudo vim /etc/systemd/system/seaweedvolume2.service

[Unit]
Description=SeaweedFS Volume
After=network.target

[Service]
Type=simple
User=root
Group=root

ExecStart=/usr/local/go/bin/weed volume -dir="/tmp/data1" -max=5  -mserver="172.22.3.196:9333" -port=8080
WorkingDirectory=/usr/local/go/bin/
SyslogIdentifier=seaweedfs-volume2

[Install]
WantedBy=multi-user.target

更新文件後,您需要重新加載守護程序,如下所示

sudo systemctl daemon-reload
sudo systemctl start seaweedvolume2
sudo systemctl enable seaweedvolume2

然後檢查他們的狀態

sudo systemctl status seaweedvolume2
● seaweedvolume2.service - SeaweedFS Volume
     Loaded: loaded (/etc/systemd/system/seaweedvolume2.service; disabled; vendor preset: enabled)
     Active: active (running) since Mon 2020-11-30 08:29:22 UTC; 5s ago
   Main PID: 2103 (weed)
      Tasks: 10 (limit: 2204)
     Memory: 10.3M
     CGroup: /system.slice/seaweedvolume2.service
             └─2103 /usr/local/go/bin/weed volume -dir=/tmp/data4 -max=5 -mserver=localhost:9333 -port=8080 -ip=172.22.3.196

編寫樣本文件

將文件上傳到SeaweedFS對象存儲很有趣。首先,您需要將HTTP POST,PUT或GET請求發送到/ dir / assign,以獲取文件ID(fid)和卷服務器的URL。

$ curl http://localhost:9333/dir/assign

{"fid":"7,0101406762","url":"172.22.3.196:8080","publicUrl":"172.22.3.196:8080","count":1}

如上所示,擁有這些詳細信息後,下一步就是保存文件的內容。為此,您需要從響應中向url +’/’+文件ID(fid)發送HTTP多部分POST請求。我們的fid是7,0101406762,網址是172.22.3.196:8080。讓我們這樣發送請求。您將收到類似以下的回復。

$ curl -F [email protected]/home/tech/teleport-logo.png http://172.22.3.196:8080/7,0101406762

{"name":"teleport-logo.png","size":70974,"eTag":"ef8deb64899176d3de492f2fa9951e14"}

更新已發送到對象存儲的文件

更新比您想象的要容易。您需要發送與上述相同的命令,但是要使用一個新文件替換現有文件。 保留fid和URL。

curl -F [email protected]/home/tech/teleport-logo-updated.png http://172.22.3.196:8080/7,0101406762

從對象存儲中刪除文件

要刪除已經存儲在SeaweedFS中的文件,只需將HTTP DELETE請求發送到相同的URL +’/’+ File ID(fid)URL。

curl -X DELETE http://172.22.3.196:8080/7,0101406762

讀取保存的文件

攪拌文件,它很容易閱讀。如本例所示,我們首先通過文件的volumeId查找卷服務器URL。

$ curl http://http://172.22.3.196:9333/dir/lookup?volumeId=7

{"volumeId":"7","locations":[{"url":"172.22.3.196:8080","publicUrl":"172.22.3.196:8080"}]}

卷不經常移動,因此在大多數情況下,您可以緩存結果以提高自己的實施速度和性能。您可以在一個卷上配置多個副本位置,具體取決於複製的類型。隨機選擇一個地方閱讀。

然後打開瀏覽器或應用程序,可用於查看保存在SeaweedFS對象存儲中的文件,並指向上面的URL。如果您正在運行防火牆,請允許端口訪問

sudo ufw allow 8080

http://172.22.3.196:8080/7,0101406762

在此示例中,該文件的屏幕截圖在下面共享

如果您想要更好的URL,可以使用以下替代URL格式之一:

 http://172.22.3.196:8080/7/0101406762/your_preferred_name.jpg
 http://172.22.3.196:8080/7/0101406762.jpg
 http://172.22.3.196:8080/7,0101406762.jpg
 http://172.22.3.196:8080/7/0101406762
 http://172.22.3.196:8080/7,0101406762

如果要獲取圖像的縮放版本,則可以添加一些參數。一個例子如下所示。

http://172.22.3.196:8080/7/0101406762.jpg?height=200&width=200
http://172.22.3.196:8080/7/0101406762.jpg?height=200&width=200&mode=fit
http://172.22.3.196:8080/7/0101406762.jpg?height=200&width=200&mode=fill

海藻可以做很多事情。 無障礙 使用多個服務器和多個卷。退房 SeaweedFS文檔 有關此驚人對象存儲工具的更多信息,請訪問GitHub。

閉幕致辭

SeaweedFS在項目中可能是無價的,尤其是在以對象格式存儲和檢索大量數據時。如果您有需要獲取照片或此類數據的應用程序,則SeaweedFS是安定下來的好地方。試試吧。同時,我將繼續感謝您在博客上的寶貴時間以及您到目前為止所提供的長期支持。您可以閱讀下面共享的其他類似指南。

EKS Cubernetes通過EFS存儲服務實現持久存儲

在CentOS 8 / CentOS 7上使用Heketi設置GlusterFS存儲

如何創建和刪除GlusterFS卷

使用Minio設置與S3兼容的對象存儲服務器

Sidebar