# minfs **Repository Path**: zzk123456/minfs ## Basic Information - **Project Name**: minfs - **Description**: 分布式文件存储系统minfs - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 0 - **Created**: 2023-08-24 - **Last Updated**: 2023-09-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 简单实现一些NAS功能 ## 说明 ![image-20230807152434942](https://cloud.iava.top/markdown/image-20230807152434942.png) ### 实现一个拥有最基础的文件操作的分布式文件存储系统 1. 支持文件创建(create、createDirectory)、查看属性信息(listStatus,getStatus)、删除(delete) 2. 支持文件open 3. 支持文件的write 4. 支持文件read 5. 获取集群信息(主节点信息,从节点信息) 6. 可采用http 协议模拟以上文件操作功能 7. 要求按照文件元数据、内容数据的方式存储设计实现,元数据的定义为包含文件的基本信息如文件名、大小、创建、修改时间、内容数据的三副本索引等,内容数据为实际文件内所存储的内容信息 8. 元数据服务高可用,元数据的操作支持分布式的一致性 9. 文件内容数据,可支持3副本写(强一致写)、随机一个副本读(实现读写一致性) 10. 3副本分布可支持合理分区,消除热点 11. 对于一个稳定运行的系统,可以主动发现文件副本不足隐患,同时可以自我修复补足不足3副本的数据 12. 最后运用前几周学习过的的maven打包知识,及Linux下的程序部署所需的shell 脚本等知识,可以将程序部署到服务器上运行起来 ## 各模块说明 1. bin:项目一键启动脚本,用于编译完成后,上传至服务器上,可以将minFS服务整体启动起来 2. dataServer:主要提供数据内容存储服务能力,单节点无状态设计,可以横向扩容 3. metaServer:主要提供文件系统全局元数据管理,管理dataserver的负载均衡,主备模式运行 4. easyClient:一个功能逻辑简单的SDK,用来与metaServer、dataServer通信,完成文件数据操作 ## 使用 ### 服务端启动说明 1. 打包编译: ```mvn clean package``` 2. 各服务模块打包完成后的jar包均在workpublish目录下 3. 一键启动:启动workpublish下bin目录的start.sh脚本(请勿修改脚本所在位置) 1. 配置zookeeper地址启动: ```./start.sh -Dzookeeper.addr=xxxxx:2181,aaaa:2181``` 1. 注意:-Dzookeeper.addr=xxxxx:2181,aaaa:2181 正确性,否则无法启动 2. 默认zookeeper地址启动 : ```./start.sh``` 4. 一键停止服务: ```./stop.sh``` ### 客户端使用说明 1. 编译打包后, 客户端sdk在workpublish的easyClient目录下名为easyClient-1.0.jar 2. 可将easyClient-1.0.jar引入至其他项目中使用 ```java //创建一个客户端 "volumeName" 为卷名,对volumeName卷中的数据进行操作,默认为"default" // EFileSystem eFileSystem = new EFileSystem("volumeName"); //"xxx:2181" zookeeper连接地址, 默认为"10.0.0.201:2181" // EFileSystem eFileSystem = new EFileSystem("volumeName","xxx:2181"); //创建一个默认配置客户端 EFileSystem eFileSystem = new EFileSystem(); //创建目录 eFileSystem.mkdir("/123"); //列出目录下的所有内容 eFileSystem.listFileStats("/demo"); //... ``` ## 更新日志 ### 2023.08.13 1. 客户端 1. 实现获取集群信息功能 2. 元数据服务 1. 新增获取数据集群接口 2. 自动修复,解决自动修复副本重复选取节点bug 3. 数据服务 1. 节点信息新增id字段 2. 修复删除文件后数据节点使用容量不改变的问题 4. 配置打包路径 5. 新增一键启动、一键停止脚本 ### 2023.08.12 1. 数据服务 1. 数据传输完成 调用关闭流之后 进行副本同步 2. 修改关闭流之后返回副本信息,更新元数据信息 3. 修复数据写入后为0字节的问题 4. 实现数据的删除, 以及副本文件删除 2. 客户端 1. 修改关闭流之后, 获取三副本信息 更新元数据信息 2. 实现删除功能 3. 元数据服务 1. 实现文件元数据删除,副本文件删除 ### 2023.08.11 1. 客户端 1. 优化文件传输 2. 传输完成后调用close关闭数据服务的输入流 3. 新增创建文件夹 4. 新增获取文件信息 5. 列出目录列表 6. 新增FSHttpUtils的一个get方法 7. 优化客户端的创建,优化异步启动zk监听 2. 元数据服务 1. 配置打包插件 2. 优化文件夹创建 1. 在创建多级文件夹时如 /demo/demo/123 时, 直接创建会导致中间层段的文件夹元数据丢失,所以采用递归创建的方式 2. 文件的创建亦是如此 3. 数据服务 1. 配置打包插件 2. 在文件写入时,将输出流放入map中以下次写入使用,从而实现文件写入的追加,当完成写入时,提供客户端调用close接口以关闭输出流,完成文件数据的传输 3. 新增关闭输入流接口 ### 2023.08.10 1. 客户端 1. 完善写数据 1. 先调用元数据服务获取一个数据节点,调用数据写接口写入数据 2. 读数据,实现流操作 2. 元数据服务 1. 新增获取一个数据节点信息接口 3. 数据服务 1. 修改接口返回数据类型 4. 通用模块 1. 将通用类放入通用模块 ### 2023.08.09 1. 客户端 1. 创建时,创建fileSystem路径 2. 启动zk元数据服务监听 3. 添加文件http传输的工具类 4. 添加log4j日志输出 2. 元数据服务 1. 修改元数据部分接口 2. 启动服务时先查询zk中是否存在主节点 3. 退出程序注销服务 4. 定时检查元数据服务的主节点,如果主节点挂了,存活节点更新成为主节点 1. 目前只能实现2个节点的主从转换,如果为三个以上节点,主节点挂了,存活节点如何重新成为主节点呢(未解决) 3. 数据服务 1. 退出程序注销服务 4. 通用模块 1. 新增数据服务和元数据服务接口的字符串常量 ### 2023.08.08 1. 元数据服务 1. 单例模式实例化服务信息 2. 监听数据服务,将服务信息进行缓存做对应修改 3. 随机选择一个可用数据节点,热点消除尚未实现 4. 元数据各接口测试 5. 服务启动初始化zk元数据存储路径 2. 数据服务 1. 定时上报服务信息 2. 服务启动扫描磁盘文件信息,并更新节点信息 3. 对文件写完成时更新节点信息, 文件总数更新,使用容量等 4. 新增Root根路径进行初始化 ### 2023.08.07 1. 元数据服务 1. 对zk中的数据服务进行监听 2. 数据服务 1. 对数据实现基本读写 2. 优化数据读写 ### 2023.08.06 1. 添加通用模块 1. 添加常量 2. 添加数据、元数据服务信息实例 2. 元数据服务 1. 服务注册至zk ### 2023.08.05 1. 元数据服务 1. 配置zk信息 ### 2023.08.04 1. 数据服务 1. 配置zookeeper,对数据操作进行封装 2. 解决zk依赖问题,调整curator依赖版本以兼容zk