这是我参与「第四届青训营 」笔记创作活动的第32天
写在前面:因为小组选择实现大作业项目三,其实现内容为一个分布式文件系统,考虑到其需要能提供分布式通信能力;提供分布式并行计算能力;提供分布式缓存能力;提供分布式文件处理能力等基本功能,我们在第一篇中先考虑其基础架构设计。
架构设计
1.架构逻辑
1.1 基本架构
最开始参考GitHub上他人仓库开始设计,考虑DFS使用主从式(Master/Slave)架构。一个集群分为名称节点NN和多个数据节点DN。NN存放了文件目录和TDFS的全部控制信息。而DN存放所有文件的块副本数据及其哈希。客户端通过NN读取相关信息并通过NN与DN交互通信(这一点与HDFS不同)。
其中文件存储实现了分块存储:文件通过客户端发送给名称节点NN,然后NN对文件切分成等大小的文件块,然后把这些块发给特定的DN进行存储。而且还实现了冗余存储(DFS的默认冗余系数是2):一个文件块会被发给多个DN进行存储,这样在一份文件块数据失效之后,还有一块备份。冗余存储也是分布式文件系统中标配的。DN上不仅会存储文件块数据,还会存储文件块数据的哈希值(DFS默认使用sha256哈希函数)。
1.2 客户端 Client
客户端需要管理的数据:
NameNode的位置(域名/IP地址,端口);
数据结构: 因此,客户端的数据结构定义如下:
type Client struct{
NameNodeAddr string
Mode int
}
1.3 名称节点 NameNode
名称节点需要管理的数据:
- 待管理的数据节点信息;
- 存储整个DFS的目录、文件的信息:文件名映
数据结构:
因此,NN的数据结构定义(位于config.go)如下:射到文件存储地址、最后一个块的偏移量等; 3. 后续考虑扩展
数据结构:
因此,NN的数据结构定义(位于config.go)如下:
type NameNode struct{
NameSpace NameSpaceStruct
Location string
Port int
DNNumber int
DNLocations []string
DataNodes []DataNode
NAMENODE_DIR string
REDUNDANCE int
}
1.4 数据节点 DataNode
数据节点需要管理的数据: 数据节点存储的信息其实在名称节点里是有的,只是防止其宕机而做的冗余。
空闲块表及块相关数据
数据结构: DN的数据结构定义如下
type DataNode struct{
Location string `json:"Location"`
Port int `json:"Port"`
StorageTotal int `json:"StorageTotal"`
StorageAvail int `json:"StorageAvail"`
ChunkAvail []int `json:"ChunkAvail"`
LastEdit int64 `json:"LastEdit"`
DATANODE_DIR string `json:"DATANODE_DIR"`
}