在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