本项目是在我们基于多斜率码链阵列纠删码的验证Demo的基础上,使用Golang 重新编写的多节点版本。
本项目不再使用本地单个计算机中的不同文件夹作为不同的存储节点,而是使用不同的计算机作为不同的存储节点,在同一局域网中实现分布式存储及灾后恢复的功能。 同时,从之前Demo的Windows Form 应用程序的形式改为了由命令行启动中心节点和存储节点,在Web 端进行系统管理和对文件的存取等操作。
- 理论上不受限制的容错能力
- 运算效率上较RS码的提升超过2个数量级
- 效率能随着条块尺寸的增加而提高(固定容错能力)
> .\Master.ps1
默认端口8080,文件存储路径 $mydoc\MatrixFS\Master\
> .\Node.ps1
默认端口从9090开始,启动26个存储节点,存储路径 $mydoc\MatrixFS\Node\
http://localhost:8080
通过以上链接进入管理页面后,在首页配置系统最大容错数和存储阵列分块行数。
完成配置后进入节点列表,可以查看所有数据节点的状态。点击右上方的“文件管理”可进入文件管理页面。
当系统中有数据节点丢失时,“系统恢复”按钮会变为黄色背景,此时加入足够量的空闲数据节点,点击该按钮,即可开始恢复系统。
在文件管理页面可对文件进行上传,下载,删除等操作。通过右上方“系统信息”按钮即可进入节点管理页面。
点击“添加文件”按钮,会弹出文件上传窗口,选择文件并点击“上传”按钮,即可将文件存储在系统中。
-
用户通过网页端上传文件,文件将使用HTTP协议发送至Master Server。
-
Master Server首先获取该文件的文件名,扩展名,文件大小等信息,将这些信息存储于一个与该文件对应的对象中。每个文件对象中包含以下信息:
a. 文件名
b. 扩展名
c. 原文件大小
d. 补齐大小(如果未补齐,则为0)
-
Master Server将整个文件读入内存,并按列数分块,分别存入byte数组中,之后进行冗余文件的计算。
-
运算过程中通过Slice获取当前生成的冗余文件所需要的分块,冗余文件同样按列存储在不同的byte数组中,按顺序生成冗余文件。举例如下:
a. 生成第一个冗余文件时,需要将数据分块0的0到n/6部分和数据分块1的n/6到n/3部分分别读入Slice中,之后即可通过这两个Slice计算得到第一个冗余文件的第一部分
b. 之后读取数据分块1的0到n/6部分和数据分块2的n/6到n/3部分,计算生成冗余分块0的第二部分,此时冗余分块0已经完成
c. 之后按照类似的方式生成冗余分块1和冗余分块2
-
在所有冗余分块都生成完毕后,将各数据(或冗余)分块发送至对应的节点
-
各节点获取到文件分块后,再将其按需要的行数进行分割,最终存入系统中。最终文件名格式为 [原文件名].[原扩展名].[节点编号/斜率][行号/起始列号].[data/rddt]
- 用户在网页端提交下载文件的请求,该请求发送至Master Server
- Master Server通过文件名和扩展名,在内存中确定与其对应的对象。之后向所有的数据节点发送该文件对象,请求文件内容
- 各个数据节点将所有分块按顺序组合,文件名中去掉最后的行号,上传至Master Server
- Master Server在接收到所有的分块后,按顺序组合成一个文件,如果补齐大小不为0,则删除文件最后的占位字节
- 最终文件名为原文件名,返回给用户
- Master Server使用专用线程,对队列表中所有的节点执行Ping操作
- 自定义Ping过程的回显内容,如果发现有节点丢失,确定丢失节点类型及编号,等待新节点启动服务器端程序,等待恢复
- 当加入足够数量的新节点后,即可在Master Server端启动恢复过程
-
每个节点分别检测以本节点第一个分块为起点的各斜率中是否所有文件都存在,或只缺少一个文件。如果只缺少一个文件,则执行恢复操作,从其他节点中获取所需的分块,在本节点中执行恢复操作得到缺失的文件后,将其发送至正确的节点。例如:
对于节点1,需要检测File10.data - File21.data – File11.rddt 和 File10.data – File01.data – File11.rddt这两条线。
-
当一个节点检测到所有斜率上的文件都存在,意味着属于这个节点的恢复工作已经完成,可以停止检测。当所有节点全部完成后,说明系统已经恢复。