简单的分布式文件系统

smally84 · · 782 次点击    
这是一个分享于 的资源,其中的信息可能已经有所发展或是发生改变。
#### 项目地址: https://github.com/smally84/go-dfs # go-dfs 简单的分布式文件系统,该项目使用纯go语言编写,并完全开源,部署简单方便。 ``` 客户端 ---> tracker------>storage1 \------>storage2 ``` # 项目说明 本项目参考fastdfs逻辑进行简单实现,主要功能包括: - 文件上传 - 临时文件上传 - 文件删除 - 文件下载 - 文件多副本同步保存和删除 - tracker自动容量均衡到不同的存储组 > 临时文件上传功能,需要二次确认,否则会被系统自动删除, > 该功能需要使能配置: enable_temp_file # 使用说明 >特别说明,无论是tracker还是storage,使用的都是同个编译输出文件,仅仅配置不同而已 ## 一、源码安装 - 1.clone源代码,编译出二进制文件 ``` cd cmd go build main.go -o dfs ./dfs ``` - 2.配置文件 将 configs/dsf.yml放到dfs可执行文件目录 ``` #服务类型tracker or storage service_type: "storage" #对外提供服务的ip和端口信息,用于storage上报自己的ip及端口信息 service_scheme: "http" service_ip: 127.0.0.1 service_port: 9000 #bind_port,服务运行的端口 bind_port: 9000 #默认语言 default_lang: zh_cn #跟踪服务器的配置 tracker: node_id: 1 enable_temp_file: true # 存储服务器的配置 storage: #存储服务所属的group group: group1 #文件大小限制(byte) file_size_limit: 10000000 #存储目录 storage_path: ./dfs #跟踪服务器,可以有多个 trackers: - http://127.0.0.1:9000 ``` 服务的类型:用server_type来定义。 最小系统,要配置一个tracker,一个storage #### 配置参考 - [tracker配置文件](https://github.com/smally84/easy-dfs/blob/main/docs/tracker.yml) - [storage1配置文件](https://github.com/smally84/easy-dfs/blob/main/docs/storage-1.yml) - [storage2配置文件](https://github.com/smally84/easy-dfs/blob/main/docs/storage-2.yml) ## 二、docker安装 参考docker-compose.yml配置 ``` version: "3.7" services: #tracker tracker: image: golang:1.15 container_name: "dfs_tracker" expose: - 9000 volumes: - ./go-dfs/tracker:/app working_dir: /app command: /app/tracker_app restart: "always" networks: dfs: ipv4_address: 172.20.0.2 logging: options: max-size: "10M" max-file: "5" storage_1: image: golang:1.15 container_name: "dfs_storage_1" expose: - 9000 volumes: - ./go-dfs/storage-1:/app working_dir: /app command: /app/storage_app restart: "always" networks: dfs: ipv4_address: 172.20.0.3 logging: options: max-size: "10M" max-file: "5" storage_2: image: golang:1.15 container_name: "dfs_storage_2" expose: - 9000 volumes: - ./go-dfs/storage-2:/app working_dir: /app command: /app/storage_app restart: "always" networks: dfs: ipv4_address: 172.20.0.4 logging: options: max-size: "10M" max-file: "5" # 网络配置 networks: dfs: name: dfs ipam: driver: default config: - subnet: "172.20.0.0/16" ``` 目录结构 ``` -go-dfs |_ _tracker | |_ _ configs | | |_ _ dfs.yml | |_ _ tracker |_ _storage-1 | |_ _ configs | | |_ _ dfs.yml | |_ _ storage |_ _storage-2 |_ _ configs | |_ _ dfs.yml |_ _ storage ``` dfs.yml的配置请参考configs/dfs.yml 其中:serverType要配置对应的服务类型,跟踪服务器为`tracker`,存储服务器为`storage` 另外存储服务器时,要配置tracker服务器的host地址 #### 配置参考 - [tracker配置文件](https://github.com/smally84/easy-dfs/blob/main/docs/tracker.yml) - [storage1配置文件](https://github.com/smally84/easy-dfs/blob/main/docs/storage-1.yml) - [storage2配置文件](https://github.com/smally84/easy-dfs/blob/main/docs/storage-2.yml) # 接口说明 统一返回格式: ``` { "code": 0, "data": {}, "msg": "" } ``` code为0表示操作成功,非0表示有错误,msg为错误信息 - 上传 - api: /upload - method: post - 参数:file - 返回结果示例: ``` { "code": 0, "data": { "url": "/group1/2020/11/12/7/1326785062468919296.png" }, "msg": "" } ``` - 上传确认 - api: /confirm - method: post - 参数:file - 备注:需要在配置文件中启用enable_temp_file:true - 下载 - api: /完整文件路径 - method: get - 删除 - api: /delete - method: post - 参数: file(值为完整的文件路径) - 返回结果示例: ``` { "code": 0, "msg": "" } ``` # 测试用例 参考目录: easy-dfs/internal/app/dfs_test.go ```go func TestDfs(t *testing.T) { // 启动tracker config1 := pkg.DsfConfigType{ ServiceType: "tracker", BindPort: "9000", DefaultLang: "zh_cn", } config1.Tracker.NodeID = 1 config1.Tracker.EnableTempFile = true go Start(&config1) // 启动storage config2 := pkg.DsfConfigType{ ServiceType: "storage", ServiceScheme: "http", ServiceIP: "127.0.0.1", ServicePort: "9001", BindPort: "9001", DefaultLang: "zh_cn", } config2.Storage.Group = "group1" config2.Storage.StoragePath = "./dfs/1" config2.Storage.Trackers = []string{"http://127.0.0.1:9000"} go Start(&config2) // 启动storage config3 := pkg.DsfConfigType{ ServiceType: "storage", ServiceScheme: "http", ServiceIP: "127.0.0.1", ServicePort: "9002", BindPort: "9002", DefaultLang: "zh_cn", } config3.Storage.Group = "group1" config3.Storage.StoragePath = "./dfs/2" config3.Storage.Trackers = []string{"http://127.0.0.1:9000"} go Start(&config3) <-make(chan bool) } ``` # 项目工具 - gin,高效的golang web框架 - leveldb,基于golang的kv数据库 # License Use of easy-dfs is governed by the Mit License found at [LICENSE](https://github.com/smally84/easy-dfs/blob/main/LICENSE)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

782 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传