SeaWeedFS文件存储服务器搭建

SeaWeedFS文件存储服务器搭建

 

概述

seaweedfs是一个非常优秀的由 golang 开发的分布式存储开源项目。它是用来存储文件的系统,并且与使用的语言无关,使得文件储存在云端变得非常方便。

在逻辑上Seaweedfs的几个概念:

  • Node 系统抽象的节点,抽象为DataCenter、Rack、DataNode
  • DataCenter 数据中心,对应现实中的不同机房
  • Rack 机架,对应现实中的机柜
  • Datanode 存储节点,用于管理、存储逻辑卷
  • Volume 逻辑卷,存储的逻辑结构,逻辑卷下存储Needle
  • Needle 逻辑卷中的Object,对应存储的文件
  • Collection 文件集,可以分布在多个逻辑卷上

所有包含模块
模块 模块说明
Weed master 开启一个master服务器
Weed volume 开启一个volume 服务器
Weed filer 开启一个指向一个或多个master服务器的file服务器
Weed upload 上传一个或多个文件
Weed server 启动一个服务器,包括一个volume服务器和自动选举一个master服务器
模块的参数说明及使用说明
Weed master
参数 类型 说明
-cpuprofile String Cpu profile输出文件
-defaultReplication String 如果没有指定默认备份类型。默认”000”
-garbageThreshold String 清空和回收空间的阈值(默认”0.3”)
-ip String Master 服务器ip地址(默认”localhost”)
-ip.bind String 需要绑定的ip地址(默认”0.0.0.0”)
-maxCpu Int 最大cpu数量。0表示所有可用的cpu
-mdir String 存储元数据的数据目录(默认”/tmp”)
-memprofile String 内存配置文件输出文件
-peers String 逗号分隔所有主节点ip:端口列表,示例127.0.0.1:9093,127.0.0.1: 9094
-port Int http监听端口(默认9333)
-pulseSeconds Int 心跳检测的时间间隔单位为秒(默认5)
-secure.secret String 加密json web token方法
-volumePreallocate 无 为volumes预先分配磁盘空间
-volumeSizeLimitMB Uint Master停止指向过量的volumes写的限定(默认30000)
-whiteList string 逗号分隔具有写权限的Ip地址。如果是空的,没有限制。即白名单

说明
defaultReplication
000 不备份, 只有一份数据
001 在相同的rackj里备份一份数据
010 在相同数据中心内不同的rack间备份一份数据
100 在不同的数据中心备份一份数据
200 在两个不同的数据中心各复制2次
110 在不同的rack备份一份数据, 在不同的数据中心备份一次
如果数据备份类型是 xyz形式
各自的意义
x 在别的数据中心备份的份数
y 不相同数据中心不同的racks备份的份数
z 在别的服务器相同的rack的备份份数

Weed volume
参数 类型 说明
-cpuprofile string Cpu profile输出文件
-dataCenter string 当前volume服务的数据中心名称
-dir string 存储数据文件的目录dir[,dir]…(默认”/tmp”)
-idleTimeout Int 连接空闲时间秒数(默认30)
-images.fix.orientation (true/false) 上传时调整jpg方向
-index string 选择内存~性能平衡模式[memory|leveldb|boltdb|btree]。(默认”memory”)
-ip string Ip地址或服务器名称
-ip.bind string 需要绑定的ip地址(默认”0.0.0.0”)
-max string Volumes的最大值,count[,count]…(默认”7”)
-maxCpu Int 最大cpu数量。0表示所有可用的cpu
-memprofile string 内存配置文件输出文件
-mserver string 用逗号分隔的master服务器列表(默认”localhost:9333”)
-port Int http监听端口号(默认8080)
-port.public Int 端口对外开放
-publicUrl string 公开访问地址
-pulseSeconds Int 心跳之间的秒数,必须小于或等于master 服务器设置(默认5)
-rack string 当前volume服务器的rack 名称
-read.redirect (true/false) 重新定向转移或非本地 volumes
-whiteList string 逗号分隔具有写权限的Ip地址。如果是空的,没有限制。
Weed filer
参数 类型 说明
collection String 所有数据将存储在这个集合中
dataCenter String 首选在此数据中心写入volumes
defaultReplicaPlacement String 如果没有指定默认复制类型(默认“000”)
dirListLimit Int 限制子目录列表大小
disableDirListing 无 关闭目录清单
ip String Filter服务器http监听ip地址
master String 用逗号分隔的master服务器(默认“localhost:9333”)
maxMB Int 分割文件大于限制(默认32)
port Int Filer服务器htp监听端口(默认8888)
port.grpc Int Filer grpc服务器监听端口,默认为 http的端口+10000
port.public Int 对外开放的端口
redirectOnRead 无 在文件GET请求期间是代理还是重定向到volumes服务器
secure.secret String 加密Json Web令牌(JWT)的密钥

Weed upload
参数 类型 说明
collection string 可选的集合名称
dataCenter String 可选的数据中心名称
debug 无 显示debug信息
dir String 如果指定,则递归地上传整个文件夹。
include String 需要上传的文件,跟-dir配合使用,例如*.pdf,*.html,ab?d.txt等
master String Seaweedfs master服务器地址(默认”localhost:9333”)
maxMB Int 如果文件超过指定大小则进行分割
replication String 备份类型
secure.secret String 加密Json Web令牌(JWT)的密钥
ttl string 存活时间 1m,1h,1d,1M,1y

以上是maset volume upload filer 的所有参数说明。是主要的功能。

使用接口
申请一个fid
curl http://localhost:9333/dir/assign
上传文件
curl -F file=@/home/chris/myphoto.jpg http://127.0.0.1:8080/3,01637037d6
删除文件
curl -X DELETE http://127.0.0.1:8080/3,01637037d6
申请带存活时间的fid
curl http://localhost:9333/dir/assign?ttl=3m

一. 安装go环境

  • 查看看系统位数
    getconf LONG_BIT
  • 下载源码包

    https://studygolang.com/dl

  • 选择对应的版本下载
  •  下载以及配置:

    #下载:
    wget https://studygolang.com/dl/golang/go1.14.3.linux-amd64.tar.gz #解压
    tar -zxvf
    go1.14.3.linux-amd64.tar.gz
    # 配置 vim /etc/profile 
    #加入
    export GOPATH=/soft/go/path
    export GOROOT=/soft/go
    export GOOS=linux
    export GOBIN=$GOROOT/bin
    export GOTOOLS=$GOROOT/pkg/tool/
    export PATH=$PATH:$GOBIN:$GOTOOLS
    # 使配置文件生效
    source /etc/profile
    # 查看是否生效
    go version

    安装git mercurial

    yum install -y mercurial git

二. 安装seaweedfs

1. 下载

cd /soft/download
打开网站 :

 https://github.com/chrislusf/seaweedfs/releases/       

选择对应的版本下载:

wget https://github.com/chrislusf/seaweedfs/releases/download/1.79/linux_amd64.tar.gz

2. 解压

tar -zxvf linux_amd64.tar.gz

3. ./weed -h 查看帮助

4. 创建运行需要的目录

/usr/software/seaweedfs/master/data
/usr/software/seaweedfs/master/logs
/usr/software/seaweedfs/volume/vol
/usr/software/seaweedfs/volume/logs

  

方案一、设置一台master服务器和一台volume服务器

5. 配置运行master

nohup /usr/software/seaweedfs/weed master -mdir=/usr/software/seaweedfs/master/data -port=9333 -ip="172.21.0.7" -volumeSizeLimitMB=30 &>> /usr/software/seaweedfs/master/logs/master.log & 

6. 配置运行volume

nohup /usr/software/seaweedfs/weed volume -dir=/usr/software/seaweedfs/volume/vol -max=3 -mserver="172.21.0.7:9333" -port=8080 -ip="172.21.0.7"  &>>/usr/software/seaweedfs/volume/logs/vol.log &

7. 上传文件测试

  • 文件上传首先需要请求master, 去分配一个逻辑卷和fid

    curl http://172.21.0.7:9333/dir/assign

    返回结果

  • {"fid":"7,02d41f9f6b","url":"172.21.0.7:8080","publicUrl":"172.21.0.7:8080","count":1}
  • 使用返回的url和fid上传文件

  • curl -F file=@/usr/software/seaweedfs/ww1.JPG http://172.21.0.7:8080/7,02d41f9f6b
    {"name":"ww1.JPG","size":93533,"eTag":"1ae02c89"}

    可以这么理解, 上传文件, 首先请求master分配volume和fid, 然后将文件上传到某个卷下

  • wget http://172.21.0.7:8080/7,02d41f9f6b

    可以将该图片文件下载下来,

  • 也可以在浏览器直接访问

    http://172.21.0.7:8080/7,02d41f9f6b
    或者
    http://172.21.0.7:8080/7/02d41f9f6b

    也可以直接上传文件

  • curl -F file=@/usr/software/seaweedfs/phx.mp4 http://172.21.0.7:9333/submit
    {"eTag":"9cc46572","fid":"7,0572e19181","fileName":"phx.mp4","fileUrl":"172.21.0.7:8080/7,0572e19181","size":941529}



6. 开启filer

nohup /usr/software/seaweedfs/weed filer -ip=XXX X -port=8882 -master=XXXX:9333 -collection=test &>>/usr/software/seaweedfs/filer/logs/filer.log &

方案二、设置多台master服务器和多台volume服务器

5. 配置运行master

我们启动一个master,并设置一些参数,参数有很多都是默认的,可以不设置
# mdir 存储元数据的数据目录
# port 监听端口
# peers 主节点ip:端口
# defaultReplication 备份策略
# ip 服务器ip
# garbageThreshold 清空和回收空间的阈值
# maxCpu 最大cpu数量,0是所有
# pulseSeconds 心跳检测的时间间隔单位为秒
# ip.bind 绑定ip
# volumeSizeLimitMB volumes超载量,最大30G,即一个卷可以存多少数据,当然一个卷不代表一个磁盘,

/root/weed master -mdir=/data/seaweedfs -port=9333 -peers=172.16.100.107:9333,172.16.100.111:9333,172.16.100.106:9333 
-defaultReplication="000" -ip="172.16.100.107" -garbageThreshold=0.3 -maxCpu=0 -pulseSeconds=5 -ip.bind=0.0.0.0 -volumeSizeLimitMB=30000 >>/root/master.out &
./weed -logdir=master/log master -mdir=master/data -port=9333 -peers=172.18.91.2:9333,172.18.91.3:9333,172.18.91.4:9333  -ip=172.18.91.2 -port=9333 -defaultReplication="010" -volumeSizeLimitMB=30000 -defaultReplication=011 &
./weed -logdir=master/log master -mdir=master/data -port=9333 -peers=172.18.91.2:9333,172.18.91.3:9333,172.18.91.4:9333  -ip=172.18.91.3 -port=9333 -defaultReplication="010" -volumeSizeLimitMB=30000 -defaultReplication=011 &
./weed -logdir=master/log master -mdir=master/data -port=9333 -peers=172.18.91.2:9333,172.18.91.3:9333,172.18.91.4:9333  -ip=172.18.91.4 -port=9333 -defaultReplication="010" -volumeSizeLimitMB=30000 -defaultReplication=011 &

6. 配置运行volume

 

# dir 存储数据文件的目录,刚才的挂载点
# mserver master服务器列表
# port 监听端口
# ip 服务器ip
# max 本机volumes的最大值,在master上我们定义的每个卷为30G,可是我们的磁盘不可能就这么点,而max的作用就是表示这个磁盘上可以分多少个卷,默认是7,也就是30G * 7 = 210G,很明显磁盘被浪费了很多空间,因此我们需要指定一个大max值,保证volumeSizeLimitMB * max >= 磁盘容量,当然你可以直接100,简单粗暴
# dataCenter 机房
# rack 机架
# idleTimeout 连接空闲时间秒数
# images.fix.orientation 上传时调整jpg方向
# ip.bind 监听ip
# maxCpu 最大cpu数量
# read.redirect 重新定向转移非本地volumes


/root/weed volume -dir=/data/seaweedfs/volume1 -mserver=172.16.100.107:9333,172.16.100.111:9333,172.16.100.106:9333 -ip="172.16.100.136" -max=100 -dataCenter=zw -rack=openstack-bj-zw-bgp5 -idleTimeout=30 -images.fix.orientation=true -ip.bind=0.0.0.0 -maxCpu=0 -port=8081 -read.redirect=true >>/root/volume1.out &
/root/weed volume -dir=/data/seaweedfs/volume2 -mserver=172.16.100.107:9333,172.16.100.111:9333,172.16.100.106:9333 -ip="172.16.100.136" -max=100 -dataCenter=zw -rack=openstack-bj-zw-bgp5 -idleTimeout=30 -images.fix.orientation=true -ip.bind=0.0.0.0 -maxCpu=0 -port=8082 -read.redirect=true >>/root/volume2.out &
./weed -logdir=volume/log volume -dir=volume/data  -mserver=172.18.91.2:9333,172.18.91.3:9333,172.18.91.4:9333 -ip=172.18.91.2 -port=8080 -publicUrl=124.126.120.19:8080 -max=20 -dataCenter=dc -rack=rack2-4 -images.fix.orientation=true -read.redirect=true &
./weed -logdir=volume/log volume -dir=volume/data  -mserver=172.18.91.2:9333,172.18.91.3:9333,172.18.91.4:9333 -ip=172.18.91.3 -port=8080 -publicUrl=124.126.120.19:8080 -max=20 -dataCenter=dc -rack=rack2-4 -images.fix.orientation=true -read.redirect=true &
./weed -logdir=volume/log volume -dir=volume/data  -mserver=172.18.91.2:9333,172.18.91.3:9333,172.18.91.4:9333 -ip=172.18.91.4 -port=8080 -publicUrl=124.126.120.19:8080 -max=20 -dataCenter=dc -rack=rack2-4 -images.fix.orientation=true -read.redirect=true &
./weed -logdir=volume/log volume -dir=volume/data  -mserver=172.18.91.2:9333,172.18.91.3:9333,172.18.91.4:9333 -ip=172.18.91.5 -port=8080 -publicUrl=124.126.120.19:8080 -max=20 -dataCenter=dc -rack=rack5-7 -images.fix.orientation=true -read.redirect=true &
./weed -logdir=volume/log volume -dir=volume/data  -mserver=172.18.91.2:9333,172.18.91.3:9333,172.18.91.4:9333 -ip=172.18.91.6 -port=8080 -publicUrl=124.126.120.19:8080 -max=20 -dataCenter=dc -rack=rack5-7 -images.fix.orientation=true -read.redirect=true &
./weed -logdir=volume/log volume -dir=volume/data  -mserver=172.18.91.2:9333,172.18.91.3:9333,172.18.91.4:9333 -ip=172.18.91.7 -port=8080 -publicUrl=124.126.120.19:8080 -max=20 -dataCenter=dc -rack=rack5-7 -images.fix.orientation=true -read.redirect=true &

另一种配置分布式环境

启动一个测试集群:2 filer(8801-8802) + 3 master(9331-9333) + 3 volume(8081-8083)

下载seaweedfs:

https://github.com/chrislusf/seaweedfs/releases/download/1.44/linux_amd64.tar.gz

先创建所需要目录

启动master

xuliang@xuliang-PC:/data/seaweedfs$ cat start_master.sh 
./weed -logdir=log/master1 master -mdir=master1 -peers=192.168.11.103:9331,192.168.11.103:9332,192.168.11.103:9333 -ip=192.168.11.103 -port=9331 -defaultReplication=001 &
./weed -logdir=log/master2 master -mdir=master2 -peers=192.168.11.103:9331,192.168.11.103:9332,192.168.11.103:9333 -ip=192.168.11.103 -port=9332 -defaultReplication=001 &
./weed -logdir=log/master3 master -mdir=master3 -peers=192.168.11.103:9331,192.168.11.103:9332,192.168.11.103:9333 -ip=192.168.11.103 -port=9333 -defaultReplication=001 &
xuliang@xuliang-PC:/data/seaweedfs$ 

启动volume

xuliang@xuliang-PC:/data/seaweedfs$ cat start_volume.sh 
./weed -logdir=log/volume1 volume -dir=volume/data1 -max=300 -mserver=192.168.11.103:9331,192.168.11.103:9332,192.168.11.103:9333 -ip=192.168.11.103 -port=8081 &
./weed -logdir=log/volume2 volume -dir=volume/data2 -max=300 -mserver=192.168.11.103:9331,192.168.11.103:9332,192.168.11.103:9333 -ip=192.168.11.103 -port=8082 &
./weed -logdir=log/volume3 volume -dir=volume/data3 -max=300 -mserver=192.168.11.103:9331,192.168.11.103:9332,192.168.11.103:9333 -ip=192.168.11.103 -port=8083 &
xuliang@xuliang-PC:/data/seaweedfs$

使用weed scaffold -config filer -output="." 在当前目录生成配置文件

查看帮助信息知道

The configuration file "filer.toml" is read from ".", "$HOME/.seaweedfs/", or "/etc/seaweedfs/", in that order.

配置文件要放在当前目录或"$HOME/.seaweedfs/", or "/etc/seaweedfs/

修改存储元数据信息默认[leveldb2]

1
2
3
4
5
[leveldb2]
£ local on disk, mostly for simple single-machine setup, fairly scalable
£ faster than previous leveldb, recommended.
enabled = true 
dir "."  

  修改为redis

[redis]
enabled = true
address  = "localhost:6379"
password = ""
database = 0

启动命令:

xuliang@xuliang-PC:/data/seaweedfs$ cat start_filer.sh 
./weed -logdir=./log/filer1 filer -port=8801 -master=192.168.11.103:9331,192.168.11.103:9332,192.168.11.103:9333 -ip=192.168.11.103 -defaultReplicaPlacement=001 &
./weed -logdir=./log/filer2 filer -port=8802 -master=192.168.11.103:9331,192.168.11.103:9332,192.168.11.103:9333 -ip=192.168.11.103 -defaultReplicaPlacement=001 &
xuliang@xuliang-PC:/data/seaweedfs$ 

挂载:

xuliang@xuliang-PC:/data/seaweedfs$ cat start_mount.sh 
./weed mount -filer=192.168.11.103:8801 -dir=/mnt -filer.path=/

xuliang@xuliang-PC:/data/seaweedfs$


 
 
 
 
原文地址:https://www.cnblogs.com/pinghengxing/p/12944605.html