SeaweedFS是一个简单并且高度可扩展的分布式文件系统,可以存储数十亿的文件并且快速获得文件,特别适合于有效处理小文件,这里我们简称为weed,weed的主节点不管理文件元数据而是仅管理文件卷,这些文件卷服务器各自管理各自的元数据,所以这样在高并发的情况下减少了主节点的压力和网络通信,同时定位文件也更迅速.

weed的每个文件元数据最多只有40字节的磁盘开销,并且读取磁盘的速度为O(1)级别的,因此性能非常高,weed的主要应用场景是存储海量的图片信息并且可以快读定位.

weed是使用Go语言开发的,github主页为:https://github.com/chrislusf/seaweedfs,使用weed可以通过源码编译,需要提前安装Go环境;也可以使用编译好的二进制包,不依赖Go环境直接执行,这里为了方便配置直接使用编译好的二进制文件,下载地址是:https://github.com/chrislusf/seaweedfs/releases/tag/0.90,目前最新版是0.90,下面有不同平台的包以及源码可以根据需要下载:

我这里是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= -mserver="127.0.0.1:9333" -port= > /var/log/weed.log >& &

volume端口默认不指定为8080,-max指定是最大的卷个数,即这一个服务管理5个卷.

然后我们再启动第二个volume服务:

nohup ./weed volume -dir="/data/weed" -max= -mserver="127.0.0.1:9333" -port= > /var/log/weed2.log >& &

这里我们是在同一个服务器节点做的伪分布式,实际的分布式配置和上面完全一样,很简单.

然后可以做一个简单上传图片测试:

首先向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的配置使用的更多相关文章

  1. seaweedfs安装配置使用

    Saeweedfs是一个由golang语言开发的分布式对象存储系统,很适合做图片服务器,性能很好,安装操作都很简单,并且可兼容挂载提供路径访问的方式,可以较为便捷的将nginx+nfs此类的文件服务器 ...

  2. CentOS 7安装SeaweedFS

    1.从GitHub下载编译好的SeaweedFS 地址:https://github.com/chrislusf/seaweedfs/releases 选择linux_amd64.tar.gz的压缩包 ...

  3. seaweedFS

    那首先我们来分析一下seaweedfs是什么?seaweedfs是一个非常优秀的由 golang 开发的分布式存储开源项目.它是用来存储文件的系统,并且与使用的语言无关,使得文件储存在云端变得非常方便 ...

  4. 分布式存储Seaweedfs源码分析

    基于源码版本号 0.67 , [Seaweedfs以前旧版叫Weedfs]. Seaweedfs 是一个非常优秀的由 golang 开发的分布式存储开源项目, 虽然在我刚开始关注的时候它在 githu ...

  5. seaweedfs文件存储服务器搭建

    官方网站: https://github.com/chrislusf/seaweedfs/wiki/Getting-Started 概述 seaweedfs是一个非常优秀的由 golang 开发的分布 ...

  6. 配置android sdk 环境

    1:下载adnroid sdk安装包 官方下载地址无法打开,没有vpn,使用下面这个地址下载,地址:http://www.android-studio.org/

  7. Android Studio配置 AndroidAnnotations——Hi_博客 Android App 开发笔记

    以前用Eclicps 用习惯了现在 想学学 用Android Studio 两天的钻研终于 在我电脑上装了一个Android Studio 并完成了AndroidAnnotations 的配置. An ...

  8. react-router 组件式配置与对象式配置小区别

    1. react-router 对象式配置 和 组件式配置    组件式配置(Redirect) ----对应---- 对象式配置(onEnter钩子) IndexRedirect -----对应-- ...

  9. 总结:Mac前端开发环境的搭建(配置)

    新年新气象,在2016年的第一天,我入手了人生中第一台自己的电脑(大一时好友赠送的电脑在一次无意中烧坏了主板,此后便不断借用别人的或者网站的).macbook air,身上已无分文...接下来半年的房 ...

随机推荐

  1. Python select解析

    一.首先列一下,sellect.poll.epoll三者的区别 1.select a.select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监控多个文件描述符的数组,当 ...

  2. Python 面向对象5 多态

    一.多态 多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作,简单的说就是一句话:允许将 ...

  3. gitlab之五: gitlab之webhook

    webhook(网络钩子),一般与jenkins联合使用,gitlab的某个项目的代码更新了后就触发 webhook中配置的 url ,这个url一般是某一个jienkins中某一个job的url.即 ...

  4. 启动tomcat出现Removing obsolete files from server... Could not clean server of obsolete ……错误

    在Eclipse启动tomcat出现"Removing obsolete files from server... Could not clean server of obsolete …… ...

  5. 05. Matplotlib 1 |图表基本元素| 样式参数| 刻度 注释| 子图

    1.Matplotlib简介及图表窗口 Matplotlib → 一个python版的matlab绘图接口,以2D为主,支持python.numpy.pandas基本数据结构,运营高效且有较丰富的图表 ...

  6. 基于TensorFlow的MNIST数据集的实验

    一.MNIST实验内容 MNIST的实验比较简单,可以直接通过下面的程序加上程序上的部分注释就能很好的理解了,后面在完善具体的相关的数学理论知识,先记录在这里: 代码如下所示: import tens ...

  7. ACM-ICPC Beijing 2016 Genius ACM(倍增+二分)

    描述 给定一个整数 M,对于任意一个整数集合 S,定义“校验值”如下: 从集合 S 中取出 M 对数(即 2∗M 个数,不能重复使用集合中的数,如果 S 中的整 数不够 M 对,则取到不能取为止),使 ...

  8. ROWNUM = 1 to replace count(*)

    For a long time, I have been using the EXISTS clause to determine if at least one record exists in a ...

  9. 在控制台下玩玩dotnet core内置原生的DI

    转载请注明出处:http://www.cnblogs.com/zhiyong-ITNote/ 在基于dotnet core的web开发中,我们会经常用到DI,那么如果单单使用dotnet core自身 ...

  10. git SourceTree 客户端 安装/使用教程

    使用过SourceTree 之后发现比乌龟好多了 风来了.fox 1.安装之前的必备 1.1 git 客户端 http://msysgit.github.io/ 安装就PASS了,总之是直接下一步.直 ...