SeaweedFS是一个简单而且高度可扩展的分布式文件系统,能够存储数十亿的文件而且快速得到文件,特别适合于有效处理小文件,这里咱们简称为weed,weed的主节点无论理文件元数据而是仅管理文件卷,这些文件卷服务器各自管理各自的元数据,因此这样在高并发的状况下减小了主节点的压力和网络通讯,同时定位文件也更迅速. linux
weed的每一个文件元数据最多只有40字节的磁盘开销,而且读取磁盘的速度为O(1)级别的,所以性能很是高,weed的主要应用场景是存储海量的图片信息而且能够快读定位. git
weed是使用Go语言开发的,github主页为:https://github.com/chrislusf/seaweedfs,使用weed能够经过源码编译,须要提早安装Go环境;也可使用编译好的二进制包,不依赖Go环境直接执行,这里为了方便配置直接使用编译好的二进制文件,下载地址是:https://github.com/chrislusf/seaweedfs/releases/tag/0.90,目前最新版是0.90,下面有不一样平台的包以及源码能够根据须要下载:github
我这里是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必定要注意.cookie
而后咱们启动第一个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服务:curl
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还支持分布式多主和跨数据中心管理等,操做都比较简单,而且任何的卷挂掉以后,写入仍然能够写入剩余正常的而不受影响,读取正常的卷上面的文件也不受影响,甚至主节点挂了若是知道对应的卷地址,访问图片仍然不受影响,这样生产环境的使用弹性就很是好.