SeaweedFS在linux上配置使用
weed的每个文件元数据最多只有40字节的磁盘开销,并且读取磁盘的速度为O(1)级别的,因此性能非常高,weed的主要应用场景是存储海量的图片信息并且可以快读定位.
weed是使用Go语言开发的,github主页为:https://github.com/chrislusf/seaweedfs,使用weed可以通过源码编译,需要提前安装Go环境;也可以使用编译好的二进制包,不依赖Go环境直接执行,这里为了方便配置直接使用编译好的二进制文件,下载地址是:https://github.com/chrislusf/seaweedfs/releases/tag/1.27,目前最新版是1.27,下面有不同平台的包以及源码可以根据需要下载:
我这里是64位linux,所以下载的是linux_amd64.tar.gz这个包,下载之后执行解压: tar -xvzf linux_amd64.tar.gz 解压之后直接在当前目录有一个weed可执行文件,没错就是这么简单,可以把这个二进制文件复制到任何地方.
下面看一下帮助: ./weed help ,然后再看一下master的帮助: ./weed help master 注意不要写反了,这里会列出master启动的相关参数,查看卷启动参数可以使用 /weed help volume ,其他的根据需要来.
现在启动一个master: ./weed master 默认绑定端口为9333可以通过-port指定,默认绑定ip为localhost和0.0.0.0,这个也可以指定,现在是在前台执行,实际环境可以使用nohup放到后台.
特别注意一点是,当单机启动不同的master来管理多个存储时,一定要使用-mdir参数指定master服务元数据目录,如果不指定默认是/tmp,当多个实例分开时就会出现交叉的情况,当请求其中一个master时,会返回另外master管理的volume,引起很多问题,所以单节点部署多master一定要注意.
然后我们启动第一个volume服务:
nohup ./weed volume -dir="/data/weed" -max=5 -mserver="127.0.0.1:9333" -port=8080 > /var/log/weed.log 2>&1 &
volume端口默认不指定为8080,-max指定是最大的卷个数,即这一个服务管理5个卷.
然后我们再启动第二个volume服务:
nohup ./weed volume -dir="/data/weed" -max=10 -mserver="127.0.0.1:9333" -port=8081 > /var/log/weed2.log 2>&1 &
这里我们是在同一个服务器节点做的伪分布式,实际的分布式配置和上面完全一样,很简单.
然后可以做一个简单上传图片测试:
首先向master发送请求获取fid和卷服务器url:
curl -X POST http://127.0.0.1:9333/dir/assign
这里本机写127.0.0.1其他服务器要写实际的master地址,然后返回如下:
这里fid为8,06ca4883a0:8为卷id,是无符号的32位整数;后面的06为文件密钥,是64位无符号整数,以16进制编码;然后后面的ca4883a0是文件cookie,32位无符号整数,这里用的4组16进制字符串表示长度为8,主要是防止url猜测.
这个fid需要我们自己存储,第一种方式可以按照结构拆分为整数类型存储,最多占用4 + 8 + 4 = 16个字节;另一种方式我们直接可以存储这个串,字符串长度最多也就是是8 + 1 + 16 + 8 = 33,所以一个char 33的数组就够了,并且通常也没有卷编号能够达到2的32次方;这里是两种常用的存储方式,可以根据需要选择.
然后可以根据卷返回的url上传文件的,这里8对应的是8081端口这个服务,下面可以上传文件:
curl -X PUT -F file=@/root/test.jpg http://127.0.0.1:8081/8,06ca4883a0
上传成功之后会返回文件名和大小,现在就上传成功了,原来的文件名不需要记录.
然后读取方法如下:
首先根据fid的卷编号获得卷对应的服务器地址:
curl http://127.0.0.1:9333/dir/lookup?volumeId=8
返回的是一个列表,可能之前volume和现在启动方式不同会出现这种情况,当然尽量不要这样,这里拿到ip后可以访问图片了,这里weed做的很人性化,下面的url都是可以的:
http://192.168.4.205:8081/8,06ca4883a0
http://192.168.4.205:8081/8,06ca4883a0.jpg
http://192.168.4.205:8081/8/06ca4883a0
http://192.168.4.205:8081/8/06ca4883a0.jpg
http://192.168.4.205:8081/8/06ca4883a0/xxxxx
http://192.168.4.205:8081/8/06ca4883a0/xxxxx.jpg
具体ip改成实际的ip,可以看到上面做这些地址都是可以的,可以根据需要设计,最后的xxxxx可以是任意的字符串
另外还可以对图片做简单的处理如调整尺寸: ,
http://192.168.4.205:8081/8/06ca4883a0.jpg?height=200&width=200
只指定一个参数按比例缩放,另外更多参数可以参考文档.
最后删除图片可以使用:
curl -X DELETE http://127.0.0.1:8081/8/06ca4883a0.jpg
可以看出,当删除成功是返回实际的大小,文件不存在时返回0
知道了上面的这些基本操作,我们就可以在程序中实现图片的存储,访问和删除了,这些基本操作在github首页介绍的已经很详细了,我这里只是叙述一遍而已.
以上就是weed的基本配置和使用,实际使用中weed还支持分布式多主和跨数据中心管理等,操作都比较简单,并且任何的卷挂掉之后,写入仍然可以写入剩余正常的而不受影响,读取正常的卷上面的文件也不受影响,甚至主节点挂了如果知道对应的卷地址,访问图片仍然不受影响,这样生产环境的使用弹性就非常好.
- seaweedfs在windows上使用
- Linux上使用commons-net.jar注意的问题
- seaweedfs在windows上部署参考
- Linux配置静态IP
- seaweedfs总结
- SpringBoo使用jasypt加密配置文件
- 使用@Configuration注解来代替Spring的bean配置
- Spring WebSocket在 Config 中访问 Cookie
- Tess4J -4.0.2- Linux 实践 [解决:Tess4J - Native library (linux-x86-64/libtesseract.so) not found in resource path]
- nginx 多组件安装及secure_link配置与文件下载防盗链的使用
- 今天你踩在在我头上,明天我长在你坟上
- firewalld封禁IP配置
- springboot跨域配置
- Springboot使用外部Tomcat
- Elasticsearch使用索引别名