https://github.com/xpzoumeng/bd_hdfs.git# bd_dfs
Implementation of simple distributed storage system
ByteDance Distributed File System(以下简称 bd_dfs)是为完成字节跳动青训营大项目设计的分布式文件系统的名称。bd_dfs 实现了在分布式文件系统中的文件上传、文件读取、文件删除 、文件元数据信息获取, 文件目录创建,文件重命名, 文件目录信息等基本的文件操作功能。从架构上,bd_dfs 与 HDFS/GFS 有着类似的 Master/Slave 架构,bd_dfs 包括客户端 Client、名称节点 NameNode(以下简称 NN)、数据节点 DataNode(以下简称 DN)三部分构成。从编程实现上,我们使用 Go 语言编写了 bd_dfs,并且使用了 Go 语言中的 Gin 框架来编写 NN、DN 服务器的后端。
bd_dfs 使用主从式(Master/Slave)架构。一个集群分为名称节点 NN 和多个数据节点 DN。NN 存放了文件目录和 bd_dfs 的全部控制信息。而 DN 存放所有文件的块副本数据及其哈希。
其中文件存储实现了分块存储:文件通过客户端发送给名称节点 NN,然后 NN 对文件切分成等大小的文件块,然后把这些块发给特定的 DN 进行存储。而且还实现了冗余存储(bd_dfs 的默认冗余系数是 2):一个文件块会被发给多个 DN 进行存储,这样在一份文件块数据失效之后,还有一块备份。冗余存储也是分布式文件系统中标配的。DN 上不仅会存储文件块数据,还会存储文件块数据的哈希值(bd_dfs 默认使用 sha256 哈希函数)。
另外文件读取实现了数据完整性检测。被分布式存储的文件在读取时 NN 会去相应的 DN 上进行读取文件块副本数据。然后 NN 会对返回的文件块副本数据进行校验和(Checksum)检测,即对其数据内容进行哈希计算,然后和存储在 DN 上的文件哈希进行对比,如果不一致说明数据块已经遭到破坏,此时 NN 会去其他 DN 上读取另一个块副本数据。
在 bd_dfs 的项目下所有文件及文件夹如下所示:
├── README.md
├── client_main
│ ├── Client.go // 来模拟一个 bd_dfs 的 Client
│ ├── Client_test.go
│ └── test.txt
├── dn
│ └── DN.go //启动一个 bd_dfs 的 DataNode
├── go.mod
├── hdfs
│ ├── client.go // client 相关的所有操作
│ ├── config.go // 系统的所有数据结构定义、参数相关
│ ├── datanode.go // datanode 相关的所有操作
│ ├── metrics.go // 系统的监控函数定义
│ ├── namenode.go // namenode 相关的所有操作
│ ├── raft.go // Raft算法实现定义
│ ├── utils.go // 文件操作的一些工具函数
│ └── zaplog.go // 系统日志的定义
├── nn1
│ └── NN.go //启动一个 bd_dfs 的 DataNode1
├── nn2
│ └── NN.go //启动一个 bd_dfs 的 DataNode2
└── nn3
└── NN.go //启动一个 bd_dfs 的 DataNode3
-
上传文件:将本地文件上传至分布式文件系统
go run Client.go -local <本地文件路径> -remote <远程文件路径>
-
下载文件:将分布式文件系统文件下载至本地
go run Client.go -getfile <远程文件路径>
-
删除文件:将分布式文件系统指定文件删除
go run Client.go -delfile <远程文件路径>
-
获取文件列表:获取指定文件夹下对应的文件列表
go run Client.go -filesNameOfGet <文件夹>
-
获取目录列表: 获取指定文件夹下的目录列表
go run Client.go -foldersNameOfGet <文件夹>
-
目录路径重命名: 对目录进行重命名
go run Client.go -curFolder <文件夹路径> -reNameFolder <新命名>
-
在指定文件夹下创建新的目录
go run Client.go -curFolder <文件夹> -newFolder <新的文件夹名称>
-
节点扩容: 根据 node 名称和端口在本地开启新的 datanode
go run Client.go -newNodeDir <datanode地址> -newNodePort <datanode端口>
cd nn1
go run NN.go //启动 namenode 和多个 datanode
cd nn2
go run NN.go //启动 namenode2
cd nn3
go run NN.go //启动 namenode3
(当前目录下)
cd ../client_main
(调用客户端发出执行,以上传文件为例)
go run Client.go -local <本地文件路径> -remote <远程文件路径>
其他命令可以参考3
请在至少上传一个文件后执行后面操作
Windows 下: