详见 : https://github.com/11062055/seaweedfs/wiki
# 详解: 原理 和 代码
```
```
## 说明
```
本仓库的 master 同步原项目的 master 分支.
本仓库的 dev_note 分支对源码进行分析和注释。
git diff dev_note master 可查看所有注释。
git diff dev_note master 只新增额外注释。
所有注释以三个斜杠开始 '///', 以区别和查询。
```
## 简介
```
seaweedfs 是一个应用层的分布式文件系统, 支
持海量数据(只受限于磁盘大小), 支持动态热扩容。
支持多数据中心多机架, 支持数据的异地灾备冗余。
```
![](https://github.com/11062055/seaweedfs/blob/dev_note/img/deploy.jpeg)
### 原理
```
物理分层。Master Servers -> Volume Servers( DC \ Rack)
```
```
Volume Servers 分布在不同数据中心 (DC) 不同机架 (Rack) 上.
上面保存了各个文件的数据和元信息, 且同一个文件可在多个 Volume
Servers 上保存多份, 具体的备份规则可以自己定义.
```
```
Master Servers(奇数个), 通过 raft 选出一个 Leader Master,
Leader Master 保存整个 Volume Servers 的拓扑信息, 结构如下:
Topology -> Data Center-> Rack -> Data Node -> Volume.
这样可以通过 Data Center-> Rack -> Data Node 查找一个 Data
Node 上的所有 Volume 信息. 但是,我们也需要根据一个 Volume 去
查找它所在的所有节点, 所以 Leader Master 还维护另一个结构如下:
Topology -> Collection -> VolumeLayout-> Data Node List
其中, Collection 对 VolumeLayout 的组织是按备份方式分类区分,
VolumeLayout 保存每个 Volume Id 到其具体位置Data Node List
的映射, 并且保存了 Volume 的可读写性质.
```
```
Leader Master 跟各个 Volume Servers 通过心跳保持连接, 并且可
获取各个 Volume Servers 上的卷信息(增\删\过期等). 再将 Volume
的位置信息通过 RPC 方式同步给其余 Master. 当要上传文件时, Leader
Master 还负责分配一个全局唯一且递增的 ID, 作为文件的 ID.
```
### Master Server 接口
```
/dir/assign
分配 Volume, 即分配