转载地址:http://yanyiwu.com/work/2015/01/09/weed-fs-source-analysis.html
1、前言
基于源码版本号 0.67,【Seaweedfs以前旧版叫Weedfs】
Seaweedfs 是一个非常优秀的由 golang 开发的分布式存储开源项目, 虽然在我刚开始关注的时候它在 github.com 上面只有 star 50+, 但是我觉得这个项目是一个几千 star 量级的优秀开源项目。现在git上已经有将近4000个star了。Seaweedfs 的设计原理是基于 Facebook 的一篇图片存储系统的论文 Facebook-Haystack, 论文很长,但是其实原理就几句话,可以看看 Facebook图片存储系统Haystack , 我觉得Seaweedfs是青出于蓝而胜于蓝
Seaweedfs 这个开源系统涵盖的面比较多, 很难在一篇文章里面说清楚, 只能尽可能清楚的说说主要的部分
二、源码目录结构
核心模块:
- weed 入口目录
- weed/weed_server 入口目录与HTTP服务相关
- topology 核心模块,主要包括 【DataCenter, Rack, DataNode】 三层拓扑结构
- storage 核心模块,主要包括【Store, Volume, Needle】三大块存储相关的源码
辅助模块:
- sequence 负责FileID的全局有序生成
- filer 提供支持 HTTP REST 操作的文件服务器,其实就是基于 leveldb 把文件名和目录结构存储起来
- stats 和操作系统内存和磁盘使用状况有关的模块
- operation 由protobuf生成的代码们
- proto 存放protobuf的描述文件
- glog 日志模块
- images 图片服务
- util 工具函数
- tools 工具,暂时只有一个读索引的文件
三、多数据节点维护之 Topology
topology 整个模块最核心的数据结构是三个:
- DataCenter
- Rack
- DataNode
topology 是树状结构,DataNode 是树的叶子节点, DataCenter 和 Rack 是树的非叶子节点, DataCenter 是 Rack 的父母节点。 如下图
DataCenter
|
|
------------------
| |
| |
Rack Rack
|
|
------------
| |
| |
DataNode DataNode
也就是在 MasterServer 维护的拓扑结构里, 是把 VolumeServer 的相关信息存储在 DataNode 里, 也就是DataNode和VolumeServer是一一对应的。所以在代码里面可以看到如下:
dc := t.GetOrCreateDataCenter(dcName)
rack := dc.GetOrCreateRack(rackName)
dn := rack.FindDataNode(*joinMessage.Ip, int(*joinMessage.Port))
每次查找对应的DataNode,都需要从 DataCenter -> Rack -> DataNode 依次找下去
四、数据存储
理解Fid:
//上传一个文件
curl -F "file=@/tmp/test.pdf" "127.0.0.1:9333/submit"
//Json形式返回的info
{
"fid":"1,01f96b93eb","fileName":"test.pdf","fileUrl":"localhost:8081/1,01f96b93eb","size":548840}
其中 “fid”:”1,01f96b93eb” 就是 Fid
Fid 由三个部分组成 【VolumeId, NeedleId, Cookie】 组成
- VolumeId: 1 32bit 存储的物理卷的Id
- NeedleId: 01 64bit 全局唯一NeedleId,每个存储的文件都不一样(除了互为备份的)
- Cookie: f96b93eb 32bit Cookie值,为了安全起见,防止恶意攻击
其中 VolumeId 是由 MasterServer 分配给 VolumeServer, 每个 VolumeServer 都维护个 n 个 Volume , 每个 Volume 都有一个专属 VolumeId,之后会细说。 Needle 属于 Volume 里面的一个单元,后续说
DataCenter
|
|
------------------
| |
| |
Rack Rack
|
|
------------
| |
| |
DataNode DataNode
^
|
|
VolumeServer