这是我参与「第四届青训营 」笔记创作活动的第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、整体架构设计
2、详细设计
1.nameNode节点初始化
首先检查命令行参数是否正确,生成nameNode服务,添加参数指定的dataNodes节点,对所管理的dataNodes节点进行心跳检测
特殊设计点:
- 当输入的nameNode节点端口号被占用时,会自动查询空闲端口号使用,返回最后生成的进程端口号
2.dataNode节点初始化
首先检查命令行参数是否正确,生成dataNode服务,记录该节点的根目录,端口号,完成具体的分布式存储
特殊设计点:
- 输入的dataNode节点端口号被占用时,会自动查询空闲端口号使用,返回最后生成的进程端口号
下次会介绍下client端基础模块,put、get、delete、mkdir、stat、rename、list接口设计和开发。