zoukankan      html  css  js  c++  java
  • seaweedFS

    那首先我们来分析一下seaweedfs是什么?seaweedfs是一个非常优秀的由 golang 开发的分布式存储开源项目。它是用来存储文件的系统,并且与使用的语言无关,使得文件储存在云端变得非常方便。seaweedfs也是一个非常优秀的开源项目,Seaweedfs的设计原理是基于 Facebook 的一篇图片存储系统的论文Facebook-Haystack。一听就感觉作者很NB,有兴趣的可以去看一看Seaweedfs的源码,本文就讲解seaweedfs的搭建和简单应用。

    seaweedfs的特点: 
    1 可以成存储上亿的文件(根据你硬盘大小变化) 
    2 速度刚刚的

    接下来,便让我们开始进入正文。

    一、seaweedfs的搭建

    seaweedfs可以编译安装(需要VPN,网络环境不好,最好不用该方法安装),也可以下载释放版本镜像安装。
    

    1、安装GO环境

    (1)、下载go语言包,go语言包地址
    wget 地址

    比如:

    wget https://golangtc.com/static/go/1.9.2/go1.9.2.linux-amd64.tar.gz
    (2)、解压到指定目录,并添加环境变量
    sudo tar -C /usr/local -xzf go1.9.2.linux-amd64.tar.gz

    添加环境变量

    #工作目录
    export GOPATH=/opt/go
    #解压目录
    export GOROOT=/usr/local/go
    export GOARCH=386
    export GOOS=linux
    export GOBIN=$GOROOT/bin
    export GOTOOLS=$GOROOT/pkg/tool/
    export PATH=$PATH:$GOBIN:$GOTOOLS
    (3)、安装git、mercurial
    sudo apt-get install git
    suod apt-get install mercurial
    (4)、安装seaweedfs

    如果要编译安装运行下面命令,没有VPN,可以忽略下面命令:

    go get github.com/chrislusf/seaweedfs/go/weed 

    下载安装:seaweedfs地址

    wget  https://github.com/chrislusf/seaweedfs/releases/download/0.76/linux_amd64.tar.gz
    
    sudo tar -zxvf linux_amd64.tar.gz
    
    (5)、配置运行seaweedfs

    进入解压目录,以守护进程启动seaweedfs的主服务及集群

    nohup ./weed master -mdir=/data/fileData -port=9333 -defaultReplication="001" -ip="ip地址" >>/data/fileData/server_sfs.log &
    
    nohup ./weed volume -dir=/data/t_v1 -max=5 -mserver="ip地址:9333" -port=9080 -ip="ip地址" >>/data/t_v1_sfs.log &
    
    nohup ./weed volume -dir=/data/t_v2 -max=5 -mserver="ip地址:9333" -port=9081 -ip="ip地址" >>/data/t_v2_sfs.log &
    
    nohup ./weed volume -dir=/data/t_v3 -max=5 -mserver="ip地址:9333" -port=9082 -ip="ip地址" >>/data/t_v3_sfs.log &

    将上面的ip地址换为具体的ip即可,默认可设为localhost。volume多少可以根据自己的情况添加。mdir、dir是指定文件存储路径。

    一个 MasterServer 对应三个 VolumeServer ,设置复制模式为 “001” , 也就是在相同 Rack 下复制副本为一份,也就是总共有两份。如下:

    更多的其他配置可以查看文档

    二、seaweedfs的文件应用

    访问服务器ip地址:9333,可以看到如下界面 

    (1)获取fid,使用GET或POST访问路径http://localhost:9333/dir/assign,获取fid和上传文件地址,seaweedfs会返回json的结果。

    如下:

    curl -X POST http://localhost:9333/dir/assign

    得到结果:

    {"fid":"1,08e684f060","url":"1ocalhost:9080","publicUrl":"localhost:9080","count":1}

    fid就是上传的标志。 
    使用url或者publicUrl加上fid,就是文件上传的地址。如下:

     http://localhost:9080/1,08e684f060

    接着就可以发起一个PUT或POST请求到上面的地址,把文件上传上去。

    curl -X PUT -F file=@/home/back.png http://localhost:9080/1,08e684f060

    结果如下:

    {
        "name": "back.png",
        "size": 64300
    }

    (2)如果要更新一个文件,直接发起POST或者PUT请求到url+fid的地址即可。fid就是保存图片使用的fid。

    (3)删除图片发起一个DELETE请求即可。

    curl -X DELETE http://localhost:8080/1,08e684f060

    (4)查看文件,需要fid。就是刚刚上传图片得到的fid。可以将其保存在数据库当中,查找文件时再调用。 
    当有多个Volume集群时,可以通过参数指定查看某个卷。

    curl http://localhost:9333/dir/lookup?volumeId=2

    得到具体的地址:

    {"volumeId":"2","locations":[{"url":"localhost:9081","publicUrl":"localhost:9081"}]}

    然后访问具体的路由:

    http://localhost:9081/fid

    比如:http://localhost:9081/1,08e684f060 
    可以带后缀,也可以不带。 
    http://localhost:9081/1,08e684f060.jpg 
    还可以带一些限定参数: 
    http://localhost:9081/1,08e684f060.jpg 
    http://localhost:9081/1,08e684f060.jpg?height=200&width=200 
    http://localhost:9081/1,08e684f060.jpg?height=200&width=200&mode=fit 
    http://localhost:9081/1,08e684f060.jpg?height=200&width=200&mode=fill

    其实刚刚上传的是在9080的volume1,9081是volume2。但是通过fid加上具体的volume端口,依旧可以访问到图片的地址。

    三、seaweedfs客户端使用

    seaweedfs的使用与语言无关,都可以方便进行封装。github上也有一些开放的client。比如这个java的客户端。作者把线程分配、HTTP请求、文件操作进行了封装,更加方便。但是目前作者没怎么更新了,还有些问题。

    我把客户端的java代码进行了重新覆写,上传到github了,seaweedfs-java-client欢迎大家start。

    这里还有一些其他语言的客户端,大家也可以去学习更改一下:

    java-client:https://github.com/Shuyun123/seaweedfs-java-client

    php-client:https://github.com/micjohnson/weed-php

    node-client:https://github.com/cruzrr/node-weedfs

    python-client:https://github.com/darkdarkfruit/python-weed

    scala-client:https://github.com/chiradip/WeedFsScalaClient

    四、扩展

    除了seaweedfs,还有一些其他的文件存储,比如:bfs(支撑Bilibili的小文件存储系统),github地址 bfs。感兴趣的读者可以去学习一下。 
    还有比如阿里的https://github.com/alibaba/tfs,百度的https://github.com/baidu/bfs,fastdfs:https://github.com/happyfish100/fastdfs等。

    作者:Anumbrella

    链接: https://blog.csdn.net/Anumbrella/article/details/78585937

  • 相关阅读:
    MySQL 5.7 解压版 安装教程(图文详细)[Windows]
    Markdown测试
    Iterator-Java
    设计模式-Iterator
    【转载】图解Java常用数据结构(一)
    SpringBoot项目打包成jar后,启动脚本
    spring boot 中文乱码问题
    Error: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster
    Caused by: java.lang.NoClassDefFoundError: javax/el/ELManager
    javax.crypto.BadPaddingException: Given final block not properly padded
  • 原文地址:https://www.cnblogs.com/liuwei0824/p/9242291.html
Copyright © 2011-2022 走看看