在Ubuntu 20.04上安装Seaweedfs分布式对象存储群集

时间:2020-02-23 14:40:29  来源:igfitidea点击:

Seaweedfs是一个分布式对象商店和文件系统,可以快速存储和服务数十亿个文件!对象存储有O(1)磁盘搜索,透明云集成。
Filer支持跨群主动主动复制,Kubernetes,POSIX,S3 API,加密,擦除保暖存储,保险丝安装,Hadoop,WebDAV。
资料来源:SeaWedfs GitHub空间

Seaweedfs始于一个对象商店,有效处理小文件。
中央主站只管理文件卷,而不是管理中央主站中的所有文件元数据,而是允许这些卷服务器管理文件及其元数据。
这可从中央主站中释放并发压力并将文件元数据传播到卷服务器中,允许更快的文件访问(O(1),通常只是一个磁盘读取操作。
资料来源:SeaWedfs GitHub空间

Seaweedfs的特色

Seaweed有以下功能可以显示到Worldseaweedfs可以透明地与云集成:它可以实现快速本地访问时间和弹性云存储容量,没有任何客户端更改.SeaWeedfs与O(1)磁盘读取我们欢迎挑战实际用例的表现。
每个文件的元数据只有40个字节的磁盘存储开销.CAN选择没有复制或者不同的复制级别,机架和数据中心感知。
自动主服务器故障转移 - 没有单点故障(SPOF)。
自动GZIP压缩取决于文件哑剧type.AutomCompation以回收删除或者update.Automatic条目TTL到期.AutomNative TTL到期.AudationAttom磁盘空间可以添加到总存储空间.Adding /删除服务器不会导致任何数据重新平衡,除非管理命令触发。
可选图片调整大小。

在Ubuntu 20.04上安装Seaweedfs

现在,我们穿上靴子,手套并进入农场的部分,以获得Seaweedfs安装,耕种和浇水在我们的Ubuntu 20.04服务器上。
在我们将铲子推入泥浆之前,请按照以下步骤首次安装Seeweedfs所需的步骤。

第1步:准备服务器

这是一个非常重要的一步,因为我们将在继续安装Seaweedfs之前安装最新的软件和补丁。
我们还要安装我们在这里需要的工具。

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 Repos安装Golang。

sudo apt install golang

方法2:手动安装

访问Go下载页面以获取最新的Go tar包版本,如下所示:

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"目录添加到路径环境变量,以便SECT将找到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

根据我们编辑的文件来源,可以将新的路径环境变量加载到当前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.20170425165423-262c93980547
go: downloading github.com/klauspost/crc32 v1.2.0

完成后,我们将在$Gopath/Bin目录中找到可执行的"杂草"。
不幸的是,当杂草安装时,它会在我们当前的主目录下创建$gopath。
你会在这里找到杂草"~/go/bin /杂草"。
因此,要解决此问题,我们将在步骤2中安装的早期位置将Seaweedfs二进制文件复制到较早的位置:

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

现在,"杂草"命令在路径环境变量中,我们现在可以继续舒适地配置Seaweedfs,如以下步骤所示。

$weed version
version 30GB 2.12 6d30b21b linux amd64

第5步:海战中的示例用法

为了掌握这个步骤中的简单示例,如果我们首先将我们的思想完全软件包在海行为的工作机制,那将是很棒的。
该架构很简单。
实际数据存储在存储节点上的卷中(可以在同一服务器中或者在不同的服务器中)。
一个卷服务器可以具有多个卷,并且可以支持与基本身份验证的读写访问。
资料来源:Seaweedfs文件

所有卷都由主服务器管理,该主服务器包含卷Server映射的卷ID。

SeaWeedfs在Master Server中管理数据卷而不是管理块作为分布式文件系统。
每个数据卷大小为32gB左右,并且可以保存大量文件。
每个存储节点都可以具有许多数据卷。
因此,主节点只需要将元数据存储有关卷的元数据,这是一个相当少量的数据并且通常是稳定的。
资料来源:Seaweedfs文件

默认情况下,主节点在端口9333上运行,并且卷节点在端口8080上运行。
要显示此操作,我们将分别启动一个主节点和端口8080和8081上的两个卷节点。
理想情况下,如提到的那样,它们应该从不同的机器启动,但我们将使用一台服务器作为示例。
如果我们打算在不同的服务器上启动卷,请确保-mserver IP地址指向主设备。
此外,必须从卷服务器/节点到达主设备上的端口。

Seaweedfs使用HTTP REST操作来读取,写入和删除。
响应是JSON或者JSONP格式。

启动主服务器

正如已打开的那样,默认情况下,主节点在端口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启动主站

我们可以通过创建其单位文件来启动主设备,如下所示:

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 2017-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启动Voules,我们需要创建两个或者多个卷文件,以防我们需要更多。
它如下简单:

对于第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 2017-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 2017-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帖子,放置或者获取请求/dir/dived以获取文件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,URL是172.22.3.196:8080。
让我们发送这样的请求。
我们将获得一个如下所示的回复。

$curl -F Hyman@theitroad/home/tech/teleport-logo.png http://172.22.3.196:8080/7,0101406762
{"name":"teleport-logo.png","size":70974,"eTag":"ef8deb64899176d3de492f2fa9951e14"}

更新已发送到对象存储的文件

更新比可以想象的更简单。
简单需要yo发送与上面的相同命令,但现在使用我们打算替换现有文件的新文件。
我们将保持FID和URL。

curl -F Hyman@theitroad/home/tech/teleport-logo-updated.png http://172.22.3.196:8080/7,0101406762

从对象存储中删除文件

为了摆脱已经存储在Seaweedfs中的文件,只需将HTTP删除请求发送到相同的URL +'/'+文件ID(FID)URL:

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

阅读已保存的文件

一旦文件耗尽,我们可以很容易地阅读它们。
首先通过此示例中显示的文件的VolullID来查看卷服务器的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

在使用多个服务器和多个卷的情况下,海藻可以做得更多的是,除了使用多个服务器和多个卷的情况下,没有任何故障。
在GitHub上查看Seaweedfs文档,以查找有关此精彩对象存储工具的更多信息。