在Ubuntu 20.04上安装Seaweedfs分布式对象存储群集
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文档,以查找有关此精彩对象存储工具的更多信息。