简易分布式存储系统设计基础模块(一) | 青训营笔记

204 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第6天,今天分享一下写简易分布式存储系统设计的一些心得,这是我们项目的GitHUb地址,欢迎大家批评指导: liuzongzhou/GoDFS (github.com)

一、需求分析

1.nameNode节点初始化

生成nameNode服务,向rpc注册这项服务,管理dataNodes节点,保存系统元数据,包含文件属性、文件存储分布等一系列信息。

2.dataNode节点初始化

生成dataNode服务,向rpc注册这项服务,保存实际文件数据,持久化到磁盘上。

3.Mkdir:创建目录

在分布式文件系统中创建给定的目录路径。

4.Put:上传文件

将本地文件上传分布式文件存储系统,实现多副本的一致性写和负载均衡,nameNode负责写入主副本,从副本的数据信息从主副本异步拉取,使用随机选择存储节点做到负载均衡。

5.Get:下载文件

将分布式文件存储系统的文件拉取到本地。支持存储节点单节点故障时,不阻塞已有数据的读取。

6.Delete:删除文件或者删除目录及所有子文件

删除分布式文件存储系统中的文件。通过合理构造nameNode和dataNode删除各类数据元数据的先后顺序,实现了在删除中途出错不会使dataNode出现没有nameNode记录的脏数据块。

7.Stat:显示文件元数据信息

获取分布式文件存储系统中文件的元数据信息。使用Hash表和合理设计的nameNode元数据信息组织方法实现了O(1)的时间复杂度。

8.List:显示目录下所有文件元数据信息

获取分布式文件系统中目录下所有文件的元数据信息。使用Hash表和合理设计的nameNode元数据信息组织方法实现了O(1)的时间复杂度。

9.Rename:重命名文件名或者目录

将分布式文件系统中的路径重命名为新的目标路径。通过合理构造nameNode和dataNode重命名修改各类数据元数据的先后顺序,实现了在重命名中途出错不会使dataNode出现没有nameNode记录的脏数据块。

二、系统设计

1、整体架构设计

集群架构图.jpg

2、详细设计

1.nameNode节点初始化

NameNode.jpg

首先检查命令行参数是否正确,生成nameNode服务,添加参数指定的dataNodes节点,对所管理的dataNodes节点进行心跳检测

特殊设计点:

  • 当输入的nameNode节点端口号被占用时,会自动查询空闲端口号使用,返回最后生成的进程端口号

2.dataNode节点初始化

DataNode.jpg 首先检查命令行参数是否正确,生成dataNode服务,记录该节点的根目录,端口号,完成具体的分布式存储

特殊设计点:

  • 输入的dataNode节点端口号被占用时,会自动查询空闲端口号使用,返回最后生成的进程端口号

下次会介绍下client端基础模块,put、get、delete、mkdir、stat、rename、list接口设计和开发。