seaweedfs是一个分布式的文件系统。
下面这段引用是官方github主页对其总的介绍
SeaweedFS is a simple and highly scalable distributed file system to store and serve billions of files fast! SeaweedFS object store has O(1) disk seek, transparent cloud integration, and SeaweedFS Filer supports Kubernetes, POSIX, S3 API, encryption, Erasure Coding for warm storage, FUSE mount, Hadoop, WebDAV.
seaweedfs支持集群模式,通过raft协议来保证数据的强一致性。
集群的节点有master, volume, filer等角色。
我只用到了master(存储数据元数据映射的节点, 如volume1的数据在哪个volume server上), volume(存储数据的节点)。
为了快速看到效果, 用docker在单机上启动一个集群看看
# pull weed镜像
docker pull chrislusf/seaweedfs:1.85
# 创建docker volume
docker volume create weed-master
docker volume create weed-volume1
docker volume create weed-volume2
# 启动master server, 两个volume server
docker run -p 9333:9333 --name weed-master -v weed-master:/data -d chrislusf/seaweedfs:1.85 master
docker run -p 8081:8080 --name weed-volume1 -v weed-volume1:/data \
--link weed-master:weed-master -d chrislusf/seaweedfs:1.85 \
volume -fileSizeLimitMB=128 -mserver="weed-master:9333" -port=8080
docker run -p 8082:8080 --name weed-volume2 -v weed-volume2:/data \
--link weed-master:weed-master -d chrislusf/seaweedfs:1.85 \
volume -fileSizeLimitMB=128 -mserver="weed-master:9333" -port=8080
其中-fileSizeLimitMB=128
选项指定了上传文件时最大不能超过128M
其中部分端口说明如下:
9333: master的http服务默认监听端口
8080: volume的http服务默认监听端口
为了方便演示, 建立了两个文件,大小分别为12字节和129M
root@gl-test: ~ # ls -l [13:44:16]
total 6148
-rw-r--r-- 1 root root 12 Jul 18 13:40 a.txt
-rw-r--r-- 1 root root 135266304 Jul 18 13:43 largefile
直接上传
root@gl-test: ~ # curl -F file=@./a.txt http://localhost:9333/submit
{"eTag":"28b81996","fid":"5,09dff3964d","fileName":"a.txt","fileUrl":"172.17.0.3:8080/5,09dff3964d","size":12}#
先分配fileId再上传
root@gl-test: ~ # curl http://localhost:9333/dir/assign
{"fid":"7,0b93c620ad","url":"172.17.0.4:8080","publicUrl":"172.17.0.4:8080","count":1}#
# 直接用上面返回的url来作为上传地址
root@gl-test: ~ # curl -F file=@./a.txt http://172.17.0.4:8080/7,0b93c620ad
{"name":"a.txt","size":12,"eTag":"f0ff7292","mime":"text/plain"}#
这种先分配fileId再上传有什么好处呢?难道不是按我们一般的做法,直接上传好一些吗?
肯定是有好处的, 比如可以指定dataCenter, 复制策略等。
可以查看https://github.com/chrislusf/seaweedfs/wiki/Master-Server-API来获取更多参数。
其实submit也可以指定一些参数, 不过没有assign可指定的参数多,而且在官方wiki中也没
找到submit的参数(我看代码知道的)
查找
root@gl-test: ~ # curl http://localhost:9333/dir/lookup\?fileId\=7,0b93c620ad
{"volumeId":"7","locations":[{"url":"172.17.0.4:8080","publicUrl":"172.17.0.4:8080"}]}#
可以找出某个fileId对应的文件在哪个volume server上(返回的url, publicUrl根据情况使用)
下载
root@gl-test: ~ # curl -i http://172.17.0.4:8080/7,0b93c620ad [13:56:27]
HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Disposition: inline; filename="a.txt"
Content-Length: 12
Content-Type: text/plain
Etag: "f0ff7292"
Last-Modified: Sat, 18 Jul 2020 05:48:04 GMT
Date: Sat, 18 Jul 2020 05:56:30 GMT
hello world
注意:
Content-Disposition: inline; filename="a.txt"
; inline是说尽可能直接显示seaweedfs启动时还有很多别的参数,可以从官方wiki中学习。
后续会写一个简单的http客户端来操作(主要是上传下载)
(完)