组队大项目(1)架构设计篇 | 青训营笔记

131 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第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

名称节点需要管理的数据:

  1. 待管理的数据节点信息;
  2. 存储整个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"`
}