简单的分布式文件系统

smally84 · 2020-12-21 10:34:48 · 1876 次点击    
这是一个分享于 2020-12-21 10:34:48 的资源,其中的信息可能已经有所发展或是发生改变。

项目地址: 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配置文件
  • storage1配置文件
  • storage2配置文件

    二、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配置文件
  • storage1配置文件
  • storage2配置文件

    接口说明

    统一返回格式:
    {
      "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


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

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