weed-fs是一款由Go语言实现的,基于facebook haystack论文的面向blob的分布式存储系统,部分应用于google内部。该系统具有代码量较少,结构简单,且不包含第三方依赖,易于部署的特点。本文将简单介绍一下这个系统。
特点
- 针对大量小文件的文件系统。
- 中心化设计,架构简单,代码量少,由go编写易于维护。
- 各种粒度的复制级别:包括同步/异步rackaware, datacenter aware的复制等。
- 无单节点故障,Master之间Raft协议保证数据可靠性,节点故障可秒级切换。
- 支持各种级别的数据压缩
- 支持目录结构,记录目录元信息。
设计
设计很大程度上借鉴的facebook的论文:Finding a neddle in the hay stack
系统由两个部分构成:Master和VolumeServer。
Master
Master: 维护Volume的元数据,和VolumeServer的状态
元数据管理
为了限制Master内存使用,它只维护volumeid到VolumeServer的映射关系。 客户端需要自己维护文件到fid的映射,如存放到memcached或者mysql。
关系如下:topology/data_center/rack/data_node/volumes
请求处理方式
每次读写请求都将经过Master,Master为写请求分配fid,为读请求返回fid对应的Volume地址
一致性
Master通过raft来保证元数据的高可用性,当节点出现故障时,可实现秒级切换不丢数据。
多个Maste由Raft保证同一时间有一个主来复杂处理请求,其它的节点都将请求转发到主上。
VolumeServer
处理数据的读写请求, 维护文件的元数据信息,即文件在volume的位置。
文件元数据容量
每个Volume默认为32G,元数据只有8字节。假设Master有32G,简单计算可得,至少能存储32/832G = 128GB GB的空间,空间不是问题。
与Master的交互
VolumeServer通过心跳向Master报告自己当前管理的volume和最大能接收多少volume。
复制
多种粒度的Replication,replication基于volume level。有关replication的细节可以看这里:
读写流程
写
- 客户端发送写请求给Master(没有具体数据信息),获取可写的VolumeServer URL,以及分配的fid。
curl http://localhost:9333/dir/assign
resp: {“count”:1,”fid”:”3,01637037d6”,”url”:”127.0.0.1:8080”,”publicUrl”:”localhost:8080”}
fid由三部分组成: ,逗号之前代码volumeid,接着是32位的keyid,和64位的cookie。这里:
volumeid = 3, keyid = 01 cookie = 637037d6
- 客户端通过url以及fid向VolumeServer发送具体的数据信息。
curl -F file=@/home/chris/myphoto.jpg http://127.0.0.1:8080/3,01637037d6
返回成功后,客户端需保存/home/chris/myphoto.jpg -> 3,01637037d6 的映射。
读
- 客户端从数据库中获取文件名对应的fid。
客户端请求Master,查询volumeid对应的VolumeServer位置
curl http://localhost:9333/dir/lookup?volumeId=3
resp: {“locations”:[{“publicUrl”:”localhost:8080”,”url”:”localhost:8080”}]}
- 客户端请求VolumeServer获取文件的具体内容
curl http://localhost:8080/3,01637037d6
讨论
Weedfs设计思路简单,很大的节约了管理成本,性能不错(需要根据不同场景测试),对于小公司是个很好地选择。
但需要注意到其切片的粒度较大,当出现节点不可用时,数据迁移需要耗费很长的时间,可能会造成短时间不可用。
假设内部宽带为20MB/s,那么迁移32G的数据需要:32G / 20MB = 1600s 大约需要半个小时
由客户端维护文件到volume的映射,一定程度增加了使用成本。
扩展阅读
- WeedFS官网,上面有关于weedfs与ceph,hdfs等的比较: https://code.google.com/p/weed-fs/
- WeedFS细致文档:http://weed-fs.readthedocs.org/en/latest/index.html
- Finding a needle in Haystack: Facebook’s photo storage
- Replication细节:https://github.com/medcl/weedfs/blob/master/note/replication.txt
- 大规模分布式存储系统,第四章文件系统