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 目前在权限管理方面还相对比较弱,目前仅有一个白名单控制机制,来控制外部的读写权限/恶意删除。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于