分布式文件存储Seaweedfs源码剖析

转载地址: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
      
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值