SeaWeedfs 分布式文件服务

本贴最后更新于 1611 天前,其中的信息可能已经时移俗易

SeaWeedfs 分布式网络文件存储介绍
引子
随着业务量增长,一个系统需要存储上百万文件的情况越来越多,尤其是互联网网站。在这种情况下依然使用传统磁盘/共享存储的方式进行支持会有以下问题:

  • 文件的备份、恢复困难,大量文件的 copy 耗时耗力
  • 文件数量暴增占满操作系统文件系统 inode,导致磁盘空间虽然没有用完但是因为 inode 用尽无法使用
  • 文件读取效率太低,无法应对高并发读取要求
    针对以上问题,facebook 提出了自己的方案 Facebook’s Haystack design paper 。 之后各种实现出现,如 tfs、MogileFS、GlusterFS 等,其中 Seaweedfs 是一个比较优秀的实现。具有效率高、结构简单、代码清晰等优点。本文针对 seaweesfs 进行简要的分析,在开始之前推荐阅读 facebook 的论文以学习理解 NoFS(Net Object File System) 相关的理念。

拓扑结构

            111 模式下的复写
 --------------------------------------------------------  
|            DataCenter A          DataCenterB    ....  |  
|              |                       |                |  
|              ├─Rack a                ├─Rack b         |  
|              |                       |                |  
|              ├─DataNode1             ├─DataNode3      |  
|              |    ├─Volume1          |      ├─Volume2 |  
|              |    ├─Volume2          |      ├─Volume3 |  
|              ├─Rack c                ├─Rack d  
|              ├─ DataNode2            ├─DataNode4      |  
|              |  ├─Volume2            |   ├─Volume1    |  
|              |  ├─Volume3            |   ├─Volume3    |  
 --------------------------------------------------------

在逻辑上 Seaweedfs 的几个概念:

  • Node 系统抽象的节点,抽象为 DataCenter、Rack、DataNode
  • DataCenter 数据中心,对应现实中的不同机房
  • Rack 机架,对应现实中的机柜
  • Datanode 存储节点,用于管理、存储逻辑卷
  • Volume 逻辑卷,存储的逻辑结构,逻辑卷下存储 Needle
  • Needle 逻辑卷中的 Object,对应存储的文件
  • Collection 文件集,可以分布在多个逻辑卷上

在实际实现中

代码结构
文件目录 逻辑层级 用途
weed
├── command 1 weed 的命令抽象
├── filer 2
├── filer2 2 Filer 实现
├── filesys 2 FUSE mount 到本地操作系统的实现
├── glide.yaml 0 包依赖关系
├── glog 4 日志组件
├── images 3 对图片的伸缩/矫正操作
├── operation 4 对于查询/读写的一些原子操作工具类,如通过 http 请求查询 master 下指定的 volume
├── pb 4 MasterServer 和 VolumeServer 之间 gRpc 心跳实现,主要是两个 pb 文件以及自动生成的 go-grpc 文件
├── security 4 安全模块,主要是黑白名单实现,JWT 实现
├── sequence 3 序列号生成
├── server 2 服务器实现,包括 MasterServer/VolumeServer/FilerServer 的实现
├── stats 3 监控状态,主要是主机内存、磁盘等
├── storage 3 物理存储的部分,包括物理 Needle/物理卷 Volume 的读写
├── tools 1 实用的工具
├── topology 2 逻辑拓扑结构,Datacenter、Rack、DataNode,主要是全局卷伸缩/查找等操作
├── util 4 工具类
└── weed.go 0 主程序

部署结构

| HttpClient
| |
| MasterServer1 <====Http/Raft=====> MasterServer2 <====Http/Raft=====> MasterServer3(leader)
| || ||
| ( grpc||HeartBeat) ( grpc||HeartBeat)
| || ||
| ├─VolumeServer(多个) ├─VolumeServer(多个)
| ├─Stroage
| ├─VolumeData(.dat/.idx)
| ├─Needles
| ├─VolumeData(.dat/.idx)
| ├─Needles
| ├─Stroage
| ├─VolumeData(.dat/.idx)
| ├─Needles
|

使用指南
详见: Seaweedfs wiki
1
不足与问题

  • seaweedfs 采用的是同步式复写有以下几个问题:
    a. 当在某个 volume-server 下线又上线恢复的情况下,没有自动的同步机制
    b. 同步复写需要等待每个节点都复写成功,效率相对较低
    c. 虽然节点的上下线会快速通过心跳通知 master 节点,但是仍然存在一定的延迟,期间 Volume-Server 在复写的时候可能会出现因为复写已经下线的 volume-server 导致上传失败的情况
  • seaweedfs 目前在权限管理方面还相对比较弱,目前仅有一个白名单控制机制,来控制外部的读写权限/恶意删除。

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...