Seaweedfs的安装和使用

https://github.com/chrislusf/seaweedfs/wiki/Getting-Started

Seaweedfs的安装和使用--研究_~银开~的博客-CSDN博客_seaweedfs

SeaweedFS基本介绍 - ROCKG - 博客园

seaweedfs文件存储服务器搭建 - 简书

seaweedfs使用说明 - 简书

seaweedfs的filer使用说明 - 简书

SeaWeedfs 分布式网络文件存储介绍_shanggl8的博客-CSDN博客_seaweedfs

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

介绍

随着业务量增长,一个系统需要存储上百万文件的情况越来越多,尤其是互联网网站。在这种情况下依然使用传统磁盘/共享存储的方式进行支持会有以下问题:
* 文件的备份、恢复困难,大量文件的copy 耗时耗力
* 文件数量暴增占满操作系统文件系统inode,导致磁盘空间虽然没有用完但是因为inode用尽无法使用
* 文件读取效率太低,无法应对高并发读取要求
针对以上问题,facebook 提出了自己的方案 Facebook’s Haystack design paper 。 之后各种实现出现,如tfs、MogileFS、GlusterFS等,其中Seaweedfs是一个比较优秀的实现。具有效率高、结构简单、代码清晰等优点。本文针对seaweesfs进行简要的分析,在开始之前推荐阅读facebook的论文以学习理解NoFS(Net Object File System) 相关的理念。

拓扑结构

                111 模式下的复写
 --------------------------------------------------------
|            DataCenter A          DataCenterB    ....  |
|              |                       |                |
|              ├─Rack a                ├─Rack b         |
|              |                       |                |
|              ├─DataNode1             ├─DataNode3      |
|              |    ├─Volume1          |      ├─Volume2 |
|              |    ├─Volume2          |      ├─Volume3 |
|              ├─Rack c                ├─Rack d
|              ├─ DataNode2            ├─DataNode4      |
|              |  ├─Volume2            |   ├─Volume1    |
|              |  ├─Volume3            |   ├─Volume3    |
 --------------------------------------------------------

代码结构

文件目录          逻辑层级   用途
weed
├── command          1    weed的命令抽象
├── filer            2 
├── filer2           2    Filer 实现
├── filesys          2    FUSE mount到本地操作系统的实现
├── glide.yaml       0    包依赖关系
├── glog             4    日志组件
├── images           3    对图片的伸缩/矫正操作
├── operation        4    对于查询/读写的一些原子操作工具类,如通过http请求查询master下指定的volume
├── pb               4    MasterServer和VolumeServer之间 gRpc 心跳实现,主要是两个pb 文件以及自动生成的go-grpc文件
├── security         4    安全模块,主要是黑白名单实现,JWT实现
├── sequence         3    序列号生成
├── server           2    服务器实现,包括MasterServer/VolumeServer/FilerServer的实现
├── stats            3    监控状态,主要是主机内存、磁盘等
├── storage          3    物理存储的部分,包括物理Needle/物理卷Volume 的读写
├── tools            1    实用的工具
├── topology         2    逻辑拓扑结构,Datacenter、Rack、DataNode,主要是全局卷伸缩/查找等操作
├── util             4    工具类
└── weed.go          0    主程序

部署结构

 ----------------------------------------------------------------------------------------------------------------
|             HttpClient
|                 |
|             MasterServer1 <====Http/Raft=====> MasterServer2 <====Http/Raft=====> MasterServer3(leader)
|                     ||                                    ||
|               ( grpc||HeartBeat)                   ( grpc||HeartBeat)
|                     ||                                    ||
|                    ├─VolumeServer(多个)                    ├─VolumeServer(多个)
|                         ├─Stroage
|                             ├─VolumeData(.dat/.idx)
|                                ├─Needles
|                             ├─VolumeData(.dat/.idx)
|                                ├─Needles
|                         ├─Stroage
|                             ├─VolumeData(.dat/.idx)
|                                ├─Needles
|
----------------------------------------------------------------------------------------------------------

SeaweedFS组件

SeaweedFS包含3个主要的概念组件。主服务和卷服务一起提供了一个分布式对象存储,以及用户可配置的复制和冗余。可选的文件管理器和S3服务是对象存储之上的附加层。这些服务中的每一个都可以在各种实际服务器上作为一个实例或单独的实例运行。

Master service

基本的主服务可以很聪明地工作,而不是很难。

它代表由1个(或3个或更多服务器)组成的集群,这些集群拥有整个SeaweedFS集群的一致视图,并通过Raft协议选举产生的Leader将其传达给所有参与的节点。

主服务中的服务器数量必须始终为奇数,以确保可以形成多数共识。最好不要增加此数量,少量稳定的服务器要比大量的flakey box好。典型值为1或3。

通过定期的木筏选举从所有可用的主服务器中任意选择领导者。它分配文件ID,指定要在其中存储对象的卷,还拥有确定哪些节点是群集的一部分的所有权。

SeaweedFS中的所有其他卷服务器都将心跳发送给领导者,领导者使用它们来决定将流量路由到何处以及如何处理复制。

如果领导者不可用,则筏共识协议可确保在整个集群的同意下任命新的领导者,并且将现有的不在场的领导者降级,直到能够再次正常运行。

Volume service

批量服务是完成艰苦工作的地方。

它将许多对象(文件和文件块)有效地打包到更大的单个卷中,这些卷可以是磁盘上任意大的块。数据的冗余和复制是在卷级别而不是在每个对象级别管理的。

每个卷服务器都通过主机将定期的心跳以及状态和卷信息发送回给领导者。

Filer service

可选的文件管理器服务可以减轻您的负担,因此您不必这样做。

它通过HTTP或UNIX FUSE挂载将SeaweedFS卷和对象组织到用户可见的路径(如URL或文件系统)中。

Filer提供了一个方便且通用的抽象,可用于为现有应用程序提供正常外观的文件系统或Web API,以用于向下/上载,而无需进行修改。

S3 service

该可选服务提供了类似于filer服务的AWS样式S3存储桶。它可以单独启动,也可以与文件管理器一起启动。

Volume Concept

SeaweedFS中的卷意味着单个实际文件由许多小文件组成。当master启动时,它将配置卷文件大小,默认为30GB。最初,创建了8个卷。

每个卷都有其自己的TTL和复制。

Collection Concept

一个集合基本上是一组卷。最初,如果集合中不存在任何卷,则将自动创建这些卷。

TTL和复制选项适用于每个卷,不适用于集合。一个集合可以具有不同的TTL或复制选项卷。

可以快速删除该集合,因为它只是删除集合中的所有卷。

如果要使用S3服务,则每个存储桶都有一个专用的集合。因此,卸下水桶也很快。

由于一个集合需要有多个卷,并且默认情况下每个卷为30GB,因此您可能会很快用完磁盘空间。您可以将卷大小减小到1GB或512MB,以解决此限制。

说明

Seaweedfs是一个简单,高扩展性的分布式文件系统,它的两个目标分别是:

存储数十亿级的文件

快速响应文件。

seaweedfs选择以键值对(key->file)的实现方式,这有点像“NoSQL",你可以陈其为”NoFS“。

seaweedfs的中心节点(center master)并不会管理所有文件的元数据而仅仅管理文件卷(file volmume),文件及其元数据的管理是由volume server实现的。这可以缓解center master的并发压力,并且将文件元数据分配到volume server可以实现更快的文件访问(只需一次磁盘读取操作)。

SeaweedFS包含3个主要的概念组件。主服务(weed master)和卷服务(weed volume server)一起提供了一个分布式对象存储,以及用户可配置的复制和冗余。可选的文件管理器(filer)和S3服务是对象存储之上的附加层。这些服务中的每一个都可以在各种实际服务器上作为一个实例或单独的实例运行。

架构

通常,分布式文件系统将每个文件拆分为块,中央主服务器保持文件名,到块句柄的块索引以及每个块服务器具有的块。

主要缺点是中央主服务器无法高效地处理许多小文件,并且由于所有读请求都需要通过块主服务器,所以对于许多并发用户来说可能无法很好地扩展。

SeaweedFS管理主服务器中的数据卷,而不是管理块。每个数据卷大小为32GB,并且可以容纳大量文件。每个存储节点可以有很多数据卷。所以主节点只需要存储关于卷的元数据,这是相当少量的数据,并且通常是稳定的。

实际的文件元数据存储在卷服务器上的每个卷中。由于每个卷服务器只管理自己磁盘上的文件的元数据,每个文件的元数据只有16个字节,因此所有文件访问都可以从内存中读取文件元数据,只需要一次磁盘操作即可实际读取文件数据。

主服务器(master server)和卷服务器(volmue server)

该架构非常简单。实际数据存储在存储节点的卷上。一个卷服务器可以有多个卷,并且都可以支持基本认证的读写访问。

所有卷由主服务器管理。主服务器包含卷ID到卷服务器映射。这是相当静态的信息,可以轻松缓存。

在每个写入请求上,主服务器还会生成一个file key,这是一个不断增长的64位无符号整数。由于写入请求通常不如读取请求频繁,因此一台主服务器应该能够很好地处理并发

读写文件

当客户端发送写入请求时,主服务器为该文件返回(volume id, file key, file cookie, volume node url)。客户端然后联系卷节点并发送文件的内容。

当客户端需要根据(volume id, file key, file cookie)读取文件时,它可以通过卷标id询问主服务器(volume node url, volume node public url),或从缓存中检索。然后客户端可以获取内容,或者只是在网页上呈现URL并让浏览器获取内容。

存储大小

在当前的实现中,每个卷可以是8x2 ^ 32个字节(32GiB)。这是因为将内容对齐到8个字节。通过更改2行代码,可以轻松地将其增加到64G或128G,或者更多,代价是由于对齐而导致的一些浪费的填充空间。

可以有2 ^ 32卷。因此总系统大小为8 x 2 ^ 32字节x 2 ^ 32 = 8 x 4GiB x 4Gi = 128EiB(2 ^ 67字节或128 exbibytes)。

每个单独的文件大小都受限于卷大小。

volume个数

默认最大7个,你可以设置100等等。。。

其他特性

  • 可以选择无复制或不同复制级别,机架和数据中心都可以识别。
  • 自动主服务器故障转移-无单点故障(SPOF)。
  • 根据文件mime类型自动进行Gzip压缩。
  • 在删除或更新后自动压缩以回收磁盘空间。
  • 自动输入TTL到期
  • 任何具有某些磁盘空间的服务器都可以添加到总存储空间中。
  • 添加/删除服务器并不会造成任何数据重新平衡,除非管理员命令触发。
  • 可选图片尺寸调整。
  • 支持ETag,Accept-Range,Last-Modified等
  • 支持内存/ leveldb /只读模式调整,以实现内存/性能平衡。
  • 支持重新平衡可写卷和只读卷。
  • 透明的云集成:通过分层的云存储无限容量以存储温暖的数据。
  • 用于热存储的擦除编码 机架感知10.4擦除编码可降低存储成本并提高可用性。

weed-fs起初是为了搞一个基于Fackbook的Haystack论文的实现,Haystack旨在优化Fackbook内部图片存储和获取。

后来这个基础上,weed-fs作者又增加了若干feature,形成了目前的weed-fs。

SeaweedFS最初作为一个对象存储来有效地处理小文件。中央主服务器只管理文件卷,而不是管理中央主服务器中的所有文件元数据,它允许这些卷服务器管理文件及其元数据。这减轻了中央主服务器的并发压力,并将文件元数据传播到卷服务器,允许更快的文件访问(只需一个磁盘读取操作)。

每个文件的元数据只有40字节的磁盘存储开销。使用O(1)磁盘读取非常简单。
Githup地址为: https://github.com/chrislusf/seaweedfs
官方文档:https://github.com/chrislusf/seaweedfs/wiki
相关背景技术论文:
中文版: http://www.importnew.com/3292.html
英文版: http://static.usenix.org/event/osdi10/tech/full_papers/Beaver.pdf

官网

https://github.com/chrislusf/seaweedfs

volume的备份机制 Replication

基本概念

1

2

3

4

5

6

7

8

master 存储映射关系,文件和fid的映射关系 weed master
Node 系统抽象的结点,抽象为datacenter、rack、datanode
datacenter 数据中心,包含多个rack,类似一个机房
rack :属于一个datacenter,类似机房中的一个机架
datanode : 存储节点,存储多个volume,类似机架中的一个机器 weed volume
volume :逻辑卷,存储needle
needle: 逻辑卷中的object,对应存储的文件
collection:文件集,默认所有文件都属于""文件集。如果想给某些文件单独分类,可以在申请id的时候指定相同的文件集
filer :指向一个或多个master的file服务器,多个使用逗号隔开。 weed filer

datanode的由来:weed volume会创建一个 datanode ,可以指定所属的 datacenter rack和master ,会根据配置存储文件,默认一开始没有volume,当开始存储文件的时候才会创建一个volume,当这一个volume大小超过了volumeSizeLimitMB 就会新增一个volume,当volume个数超过了max则该datanode就不能新增数据了。那就需要在通过weed volume命令新增一个datanode。

启动一个master
weed master -ip -mdir -port -peers -defaultReplication -volumeSizeLimitMB -whiteList

启动一个volume的时候会创建一个datanode 

weed volume -dir -max=100 -mserver -port -dataCenter -rack -whiteList

启动服务的方式

方式1
weed scaffold -config=filer -output=. 然后修改里面leveldb的目录
weed server -dir=./vtmp -master.port=9333 -master.dir=./mtmp -volume.max=5 -volume.port=9991 -filer -filer.port=8888 -master.volumeSizeLimitMB=10 -whiteList
-filer.dir 目录来存储元数据,默认为指定-dir的“filer”子目录
-master.volumeSizeLimitMB 默认最大30000000 (30G)
-master.dir用于存储元数据的数据目录,默认为与指定的-dir相同

方式2
weed master -port=9333 -mdir=./mtmp
weed volume -port=9991 -dir=./vtmp -max=100 -mserver=localhost:9333
weed scaffold -config=filer -output=.
weed filer -port=8888 -master=localhost:9333

volume个数和最大存储

默认最大(-max)7个,你可以设置100等等。。。

所有包含模块

Weed master    开启一个master服务器
Weed volume    开启一个volume 服务器
Weed filer     开启一个指向一个或多个master服务器的file服务器
Weed upload    上传一个或多个文件
Weed server    启动一个服务器,包括一个volume服务器和自动选举一个master服务器

以上为主要使用的模块,以下为模块的参数及使用说明

1.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地址。如果是空的,没有限制。即白名单
复制代码




volume的备份机制 Replication 


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

2.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地址。如果是空的,没有限制。

3.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)的密钥

4.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

搭建


有两种安装方式,第一种下载编译好的直接使用,第二种是下载源码进行编译。由于暂时不更改源码, 故使用第一种方式运行
下载地址:https://github.com/chrislusf/seaweedfs/releases     下载完成后,解压出来直接运行。
相关定义意义说明

因为是研究测试使用,就粗糙一点,都是在一台机器上完成
计划: 一个master(master只能为奇数个【好像master是以ip来做确定个数的,我做实验时,使用不同的端口启动三个master,在申请卷信息的时候报错,所以这里改成一个】)三个volume 一个filter

从官网的release仓库选择一个版本下载下来,这里选择的是2.20版本

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

上传到/usr/local/weedfs目录

mkdir -p /usr/local/weedfs/
cd /usr/localweedfs/
tar -xzvf linux_amd64.tar.gz 

得到一个weed可执行文件,weedfs的master 和volume的可执行文件都是它。
创建数据卷根目录以及各个数据卷目录、master数据目录和filter目录

mkdir -p /data/weedfs_data
mkdir -p /data/weedfs_data/vola
mkdir -p /data/weedfs_data/volb
mkdir -p /data/weedfs_data/volc
mkdir -p /data/weedfs_data/master
mkdir -p /data/weedfs_data/filter

启动master 

[root@k8s weedfs]#nohup ./weed -v=3 master -mdir=/data/weedfs_data/master  -peers=localhost:9333,localhost:9334,localhost:9335 -defaultReplication="001" >> /data/weedfs_data/master/wdfsmaster.log &  ##同个ip指定使用三个端口启动的master,在后面使用中会报错。master集群是用ip来区分的
[root@k8s weedfs]# nohup ./weed -v=3 master -mdir=/data/weedfs_data/master -defaultReplication="001" >> /data/weedfs_data/master/wdfsmaster.log &

启动完成以后就会生成下面文件和文件夹 

[root@k8s weedfs_data]# ll *
filer:
total 0
drwxr-xr-x 2 root root 6 Feb  3 16:17 leveldb2

filermount:
total 0
drwxr-xr-x 2 root root 6 Feb  3 15:32 data

master:
total 16
-rw------- 1 root root   28 Feb  3 16:52 conf
-rw------- 1 root root  112 Feb  3 16:52 log
drw------- 2 root root    6 Feb  3 16:52 snapshot
-rw-r--r-- 1 root root 4513 Feb  3 16:52 wdfsmaster.log

vola:
total 0

volb:
total 0

volc:
total 0

vold:
total 0

vole:
total 0

volf:
total 0
[root@k8s weedfs_data]# ps -ef | grep weed
root       16171   15806  0 16:52 pts/3    00:00:00 /usr/local/weedfs/weed -v=3 master -mdir=/data/weedfs_data/master -defaultReplication=001
root       16190   15473  0 16:52 pts/1    00:00:00 grep --color=auto weed
[root@k8s weedfs_data]#

启动volume

[root@k8s weedfs]# nohup ./weed -v=3 volume -port=8081 -dir=/data/weedfs_data/vola -mserver=localhost:9333 -rack=rack1 >> /data/weedfs_data/vola/wefsvola.log &
[root@k8s weedfs]# nohup ./weed -v=3 volume -port=8082 -dir=/data/weedfs_data/volb -mserver=localhost:9333 -rack=rack2 >> /data/weedfs_data/volb/wefsvolb.log &
[root@k8s weedfs]# nohup ./weed -v=3 volume -port=8083 -dir=/data/weedfs_data/volc -mserver=localhost:9333 -rack=rack3 >> /data/weedfs_data/volc/wefsvolc.log &

启动完成以后就会生成下面文件和文件夹 

[root@k8s weedfs_data]# ps -ef | grep weed
root       16171   15806  0 16:52 pts/3    00:00:00 /usr/local/weedfs/weed -v=3 master -mdir=/data/weedfs_data/master -defaultReplication=001
root       16191   15806  0 16:54 pts/3    00:00:00 ./weed -v=3 volume -port=8081 -dir=/data/weedfs_data/vola -mserver=localhost:9333 -rack=rack1
root       16217   15806  0 16:55 pts/3    00:00:00 ./weed -v=3 volume -port=8082 -dir=/data/weedfs_data/volb -mserver=localhost:9333 -rack=rack2
root       16359   15806  1 16:56 pts/3    00:00:00 ./weed -v=3 volume -port=8083 -dir=/data/weedfs_data/volc -mserver=localhost:9333 -rack=rack3
root       16378   15473  0 16:56 pts/1    00:00:00 grep --color=auto weed
[root@k8s weedfs_data]# ll *
filer:
total 4
-rw-r--r-- 1 root root 2715 Feb  3 16:55 filer.log
drwxr-xr-x 2 root root    6 Feb  3 16:17 leveldb2

filermount:
total 0
drwxr-xr-x 2 root root 6 Feb  3 15:32 data
-rw-r--r-- 1 root root 0 Feb  3 16:55 wefsmount.log

master:
total 24
-rw------- 1 root root    28 Feb  3 16:52 conf
-rw------- 1 root root   112 Feb  3 16:52 log
drw------- 2 root root     6 Feb  3 16:52 snapshot
-rw-r--r-- 1 root root 14495 Feb  3 16:56 wdfsmaster.log

vola:
total 8
-rw-r--r-- 1 root root 1267 Feb  3 16:55 wefsvola.log
-rw-r--r-- 1 root root 1151 Feb  3 16:55 wefsvolb.log

volb:
total 4
-rw-r--r-- 1 root root 1151 Feb  3 16:55 wefsvolb.log

volc:
total 8
-rw-r--r-- 1 root root 4644 Feb  3 16:56 wefsvolc.log

vold:
total 4
-rw-r--r-- 1 root root 1151 Feb  3 16:55 wefsvold.log

vole:
total 4
-rw-r--r-- 1 root root 1151 Feb  3 16:55 wefsvole.log

volf:
total 4
-rw-r--r-- 1 root root 1151 Feb  3 16:55 wefsvolf.log
[root@k8s weedfs_data]#

此时volume下面还没有任何数据,volume server会在第一次写入数据时建立相应的.idx文件和.dat文件

启动filer

文件服务

可选的文件管理器服务可以减轻您的负担,因此您不必这样做。

它通过HTTP或UNIX FUSE挂载将SeaweedFS卷和对象组织到用户可见的路径(如URL或文件系统)中。

Filer提供了一个方便且通用的抽象,可用于为现有应用程序提供正常外观的文件系统或Web API,以用于向下/上载,而无需进行修改。

可以使用文件, MySQL, redis等保存 filer metadata, 只需要启用或者停用对应的配置

先生成一个配置文件,如下图

[root@k8s weedfs]# ./weed scaffold -config=filer -output=.

修改filer.toml,把filer的数据目录指向导/data/weedfs_data/filer/leveldb2下

mkdir -p /data/weedfs_data/filer/leveldb2
[leveldb2]
# local on disk, mostly for simple single-machine setup, fairly scalable
# faster than previous leveldb, recommended.
enabled = true
dir = "/data/weedfs_data/filer/leveldb2"

然后启动

[root@k8s weedfs]# nohup ./weed -v=3 filer -port=8888  -master=localhost:9333 >> /data/weedfs_data/filer/filer.log &
[root@k8s weedfs_data]# ls filer/*
filer/filer.log

filer/leveldb2:
00  01  02  03  04  05  06  07

最后

所有的启动完成以后,如下图所示:

[root@k8s weedfs_data]# ps -ef | grep weed
root       16171   15806  0 16:52 pts/3    00:00:00 /usr/local/weedfs/weed -v=3 master -mdir=/data/weedfs_data/master -defaultReplication=001
root       16191   15806  0 16:54 pts/3    00:00:00 ./weed -v=3 volume -port=8081 -dir=/data/weedfs_data/vola -mserver=localhost:9333 -rack=rack1
root       16217   15806  0 16:55 pts/3    00:00:00 ./weed -v=3 volume -port=8082 -dir=/data/weedfs_data/volb -mserver=localhost:9333 -rack=rack2
root       16359   15806  0 16:56 pts/3    00:00:00 ./weed -v=3 volume -port=8083 -dir=/data/weedfs_data/volc -mserver=localhost:9333 -rack=rack3
root       16458   15806  0 17:06 pts/3    00:00:00 ./weed -v=3 filer -port=8888 -master=localhost:9333
root       16469   15473  0 17:07 pts/1    00:00:00 grep --color=auto weed

filer的mount挂载

为了方便本地操作,把一个collection里面的内容挂载导某个目录,方便操作

[root@k8s weedfs]# yum install -y fuse
mkdir -p /data/weedfs_data/filermount/data
nohup ./weed mount -filer=localhost:8888 -dir=/data/weedfs_data/filermount/data -filer.path=/   >> /data/weedfs_data/filermount/wefsmount.log &

./weed mount -filer=localhost:8888 -dir=~/wz/mdir(本地目录) -filer.path=/(上传的filer中的目录)

直接往weed filer中拷贝目录或者文件把wubo目录拷贝到/ 根目录下也就是本地目录目录下/data/weedfs_data/filermount/data 下面

[root@k8s weedfs]# ls wubo/
a  b  c
[root@k8s weedfs]# ./weed filer.copy wubo http://localhost:8888/
uploaded c to http://10.10.3.163:8084/1,030dfa7a23
copied c => http://localhost:8888/wubo/c
uploaded b to http://10.10.3.163:8084/2,02a5ddaae7
copied b => http://localhost:8888/wubo/b
uploaded a to http://10.10.3.163:8081/4,04153475ab
copied a => http://localhost:8888/wubo/a

cd  /data/weedfs_data/filermount/data, 就可以查看具体上传的文件

[root@k8s weedfs]# ls /data/weedfs_data/filermount/data
topics  wubo
[root@k8s weedfs]# ls /data/weedfs_data/filermount/data/wubo/
a  b  c

浏览器查看根目录文件

测试

curl http://IP:9333/dir/assign
{"fid":"4,02d6944eef","url":"IP:9080","publicUrl":"172.19.131.45:9080","count":1}

关于filer mount的问题

weed mount -filer=localhost:8888 -dir= /data/weedfs_data/filermount/data本地目录) -filer.path=/(上传的filer中的目录)

weed mount 像访问本地目录一样访问文件系统,前提是开启了 master volume filer
(它使用bazil.org/FUSE,它允许在Linux和OSX上编写FUSE文件系统。在OSX上,它需要OSXFUSE)
weed mount -filer=localhost:8888 -dir= /data/weedfs_data/filermount/data  -filer.path=/home/chris -collection=chris
weed mount -filer=localhost:8888 -dir= /data/weedfs_data/filermount/data  -filer.path=/
关闭挂在需要关闭mount并且手动umont  -l /data/weedfs_data/filermount/data 目录,如果一般用户失败请使用root用户

其中mount只是为了本地操作方便,不想本地操作,可以不使用mount

使用

上传文件

要上传文件:首先,向/ dir / assign发送HTTP POST,PUT或GET请求以获取fid和卷服务器url【理解:master负责管理卷,并生成要上传文件的fid,并给指定需要上传文件的卷服务器,所以我们在上传文件之前,需要向master请求获得这些信息,然后根据这些信息直接往指定的volume里面上传文件】
SeaweedFS在卷级应用复制策略。因此,当您获得文件id时,您可以指定复制策略。例如

curl http://localhost:9333/dir/assign?replication=001

当申请卷信息时,报如下错误。这是因为我们使用的replication模式是 001,即对于一个needle来说,会在同一个机架下的两个volume中保存相同的文件。由于上面我们创建的3个volume都分别指定了不同的机架,所以本教程目前的拓扑(逻辑)结构就是: 只有一个数据中心(默认的数据中心),包含有三个机架 rack1,2,3。每个机架下各只有一个节点(datanode --默认的节点,相当于一台机器,即localhost),然后这个datanode下面又有一个volume server(创建的,比如8081)然后这个volume又会创建默认

[root@k8s weedfs]# curl http://localhost:9333/dir/assign?replication=001
{"error":"Cannot grow volume group! No matching data node found! \nDefaultDataCenter:Only has 0 racks with more than 2 free data nodes, not enough for 1."}[root@k8s weedfs]# 

拓扑结构如下

在这里插入图片描述

数据中心(datacenter):包含多个rack(机架)相当于机房

rack:属于一个数据中心(datacenter),类似机房中的一个机架

datanode : 存储节点,存储多个volume,类似机架中的一个机器 weed volume

volume server:逻辑卷服务,多个逻辑卷服务,每个逻辑卷服务(volume server)可以有多个逻辑卷(volume ),默认7个

volume :逻辑卷,存储needle文件对象

needle: 逻辑卷中的object,对应存储的文件

collection:文件集,默认所有文件都属于""文件集。如果想给某些文件单独分类,可以在申请id的时候指定相同的文件集

filer :指向一个或多个master的file服务器,多个使用逗号隔开。 weed filer

weed volume会创建一个 datanode ,可以指定所属的 datacenter rack和master ,会根据配置存储文件,默认一开始没有volume,当开始存储文件的时候才会创建一个volume,当这一个volume大小超过了volumeSizeLimitMB 就会新增一个volume,当volume个数超过了max则该datanode就不能新增数据了。那就需要在通过weed volume命令新增一个datanode。

按上面的添加volume的方式再添加一个vold

[root@k8s weedfs]# nohup ./weed -v=3 volume -port=8084 -dir=/data/weedfs_data/vold -mserver=localhost:9333 -rack=rack1 >> /data/weedfs_data/vold/wefsvold.log &

并重新申请就能返回如下结果 

[root@k8s weedfs]# curl http://localhost:9333/dir/assign?replication=001
{"fid":"4,01c1810497","url":"10.10.3.163:8081","publicUrl":"10.10.3.163:8081","count":1}[root@k8s weedfs]#

服务情况vola和vold 属于一个数据中心同一个机架(rack1)

[root@k8s weedfs_data]# ps -ef | grep weed
root       16171   15806  0 16:52 pts/3    00:00:01 /usr/local/weedfs/weed -v=3 master -mdir=/data/weedfs_data/master -defaultReplication=001
root       16191   15806  0 16:54 pts/3    00:00:00 ./weed -v=3 volume -port=8081 -dir=/data/weedfs_data/vola -mserver=localhost:9333 -rack=rack1
root       16217   15806  0 16:55 pts/3    00:00:00 ./weed -v=3 volume -port=8082 -dir=/data/weedfs_data/volb -mserver=localhost:9333 -rack=rack2
root       16359   15806  0 16:56 pts/3    00:00:00 ./weed -v=3 volume -port=8083 -dir=/data/weedfs_data/volc -mserver=localhost:9333 -rack=rack3
root       16458   15806  0 17:06 pts/3    00:00:01 ./weed -v=3 filer -port=8888 -master=localhost:9333
root       16811   15806  0 17:11 pts/3    00:00:00 ./weed mount -filer=localhost:8888 -dir=/data/weedfs_data/filermount/data -filer.path=/
root       16841   15806  4 17:22 pts/3    00:00:00 ./weed -v=3 volume -port=8084 -dir=/data/weedfs_data/vold -mserver=localhost:9333 -rack=rack1
root       16850   15473  0 17:22 pts/1    00:00:00 grep --color=auto weed

 这个时候看一个各个volume下的情况,如下图
因为vola和vold同属于一个机架rack1 而replication策略又是001,所以vola和vold都有数据,并且数据是相同的两份。

[root@k8s weedfs_data]# ll vol*
vola:
total 64
-rw-r--r-- 1 root root    8 Feb  3 17:23 1.dat
-rw-r--r-- 1 root root    0 Feb  3 17:23 1.idx
-rwxr-xr-x 1 root root   57 Feb  3 17:23 1.vif
-rw-r--r-- 1 root root    8 Feb  3 17:23 2.dat
-rw-r--r-- 1 root root    0 Feb  3 17:23 2.idx
-rwxr-xr-x 1 root root   57 Feb  3 17:23 2.vif
-rw-r--r-- 1 root root    8 Feb  3 17:23 3.dat
-rw-r--r-- 1 root root    0 Feb  3 17:23 3.idx
-rwxr-xr-x 1 root root   57 Feb  3 17:23 3.vif
-rw-r--r-- 1 root root    8 Feb  3 17:23 4.dat
-rw-r--r-- 1 root root    0 Feb  3 17:23 4.idx
-rwxr-xr-x 1 root root   57 Feb  3 17:23 4.vif
-rw-r--r-- 1 root root    8 Feb  3 17:23 5.dat
-rw-r--r-- 1 root root    0 Feb  3 17:23 5.idx
-rwxr-xr-x 1 root root   57 Feb  3 17:23 5.vif
-rw-r--r-- 1 root root    8 Feb  3 17:23 6.dat
-rw-r--r-- 1 root root    0 Feb  3 17:23 6.idx
-rwxr-xr-x 1 root root   57 Feb  3 17:23 6.vif
-rw-r--r-- 1 root root 8569 Feb  3 17:23 wefsvola.log
-rw-r--r-- 1 root root 1151 Feb  3 16:55 wefsvolb.log

volb:
total 4
-rw-r--r-- 1 root root 1151 Feb  3 16:55 wefsvolb.log

volc:
total 8
-rw-r--r-- 1 root root 4644 Feb  3 16:56 wefsvolc.log

vold:
total 60
-rw-r--r-- 1 root root    8 Feb  3 17:23 1.dat
-rw-r--r-- 1 root root    0 Feb  3 17:23 1.idx
-rwxr-xr-x 1 root root   57 Feb  3 17:23 1.vif
-rw-r--r-- 1 root root    8 Feb  3 17:23 2.dat
-rw-r--r-- 1 root root    0 Feb  3 17:23 2.idx
-rwxr-xr-x 1 root root   57 Feb  3 17:23 2.vif
-rw-r--r-- 1 root root    8 Feb  3 17:23 3.dat
-rw-r--r-- 1 root root    0 Feb  3 17:23 3.idx
-rwxr-xr-x 1 root root   57 Feb  3 17:23 3.vif
-rw-r--r-- 1 root root    8 Feb  3 17:23 4.dat
-rw-r--r-- 1 root root    0 Feb  3 17:23 4.idx
-rwxr-xr-x 1 root root   57 Feb  3 17:23 4.vif
-rw-r--r-- 1 root root    8 Feb  3 17:23 5.dat
-rw-r--r-- 1 root root    0 Feb  3 17:23 5.idx
-rwxr-xr-x 1 root root   57 Feb  3 17:23 5.vif
-rw-r--r-- 1 root root    8 Feb  3 17:23 6.dat
-rw-r--r-- 1 root root    0 Feb  3 17:23 6.idx
-rwxr-xr-x 1 root root   57 Feb  3 17:23 6.vif
-rw-r--r-- 1 root root 9604 Feb  3 17:23 wefsvold.log

vole:
total 4
-rw-r--r-- 1 root root 1151 Feb  3 16:55 wefsvole.log

volf:
total 4
-rw-r--r-- 1 root root 1151 Feb  3 16:55 wefsvolf.log
[root@k8s weedfs_data]#

同样的操作也rack2和3也创建相应的volume

[root@k8s weedfs]# nohup ./weed -v=3 volume -port=8085 -dir=/data/weedfs_data/vole -mserver=localhost:9333 -rack=rack2 >> /data/weedfs_data/vole/wefsvole.log &
[root@k8s weedfs]# nohup ./weed -v=3 volume -port=8086 -dir=/data/weedfs_data/volf -mserver=localhost:9333 -rack=rack3 >> /data/weedfs_data/volf/wefsvolf.log &

服务启动情况

[root@k8s weedfs_data]# ps -ef | grep weed
root       16171   15806  0 16:52 pts/3    00:00:02 /usr/local/weedfs/weed -v=3 master -mdir=/data/weedfs_data/master -defaultReplication=001
root       16191   15806  0 16:54 pts/3    00:00:00 ./weed -v=3 volume -port=8081 -dir=/data/weedfs_data/vola -mserver=localhost:9333 -rack=rack1
root       16217   15806  0 16:55 pts/3    00:00:00 ./weed -v=3 volume -port=8082 -dir=/data/weedfs_data/volb -mserver=localhost:9333 -rack=rack2
root       16359   15806  0 16:56 pts/3    00:00:00 ./weed -v=3 volume -port=8083 -dir=/data/weedfs_data/volc -mserver=localhost:9333 -rack=rack3
root       16458   15806  0 17:06 pts/3    00:00:01 ./weed -v=3 filer -port=8888 -master=localhost:9333
root       16811   15806  0 17:11 pts/3    00:00:00 ./weed mount -filer=localhost:8888 -dir=/data/weedfs_data/filermount/data -filer.path=/
root       16841   15806  0 17:22 pts/3    00:00:00 ./weed -v=3 volume -port=8084 -dir=/data/weedfs_data/vold -mserver=localhost:9333 -rack=rack1
root       16855   15806  0 17:25 pts/3    00:00:00 ./weed -v=3 volume -port=8085 -dir=/data/weedfs_data/vole -mserver=localhost:9333 -rack=rack2
root       16864   15806  3 17:26 pts/3    00:00:00 ./weed -v=3 volume -port=8086 -dir=/data/weedfs_data/volf -mserver=localhost:9333 -rack=rack3
root       16873   15473  0 17:26 pts/1    00:00:00 grep --color=auto weed

上传文件
上传文件之前

[root@k8s weedfs_data]# ll .
total 0
drwxr-xr-x 3 root root  39 Feb  3 17:06 filer
drwxr-xr-x 3 root root  39 Feb  3 17:11 filermount
drwxr-xr-x 3 root root  67 Feb  3 16:52 master
drwxr-xr-x 2 root root 280 Feb  3 17:23 vola
drwxr-xr-x 2 root root  26 Feb  3 16:55 volb
drwxr-xr-x 2 root root  26 Feb  3 16:55 volc
drwxr-xr-x 2 root root 260 Feb  3 17:23 vold
drwxr-xr-x 2 root root  26 Feb  3 16:55 vole
drwxr-xr-x 2 root root  26 Feb  3 16:55 volf
[root@k8s weedfs_data]# du -sh *
104K	filer
4.0K	filermount
44K	master
76K	vola
4.0K	volb
8.0K	volc
76K	vold
4.0K	vole
4.0K	volf
[root@k8s weedfs_data]#

 上传完以后,再测试了一下下载

保存文件ID

现在,fid在这种情况下,您可以将4,01c1810497保存到数据库字段中。

开头的数字3表示卷ID。逗号后是一个文件密钥01和一个文件cookie c1810497。

卷ID是32位无符号整数。文件密钥是一个无符号的64位整数。文件cookie是32位无符号整数,用于防止URL猜测。

文件密钥和文件cookie均以十六进制编码。您可以使用自己的格式存储<卷ID,文件密钥,文件cookie>元组,也可以将其存储fid为字符串。

如果理论上以字符串形式存储,则需要8 + 1 + 16 + 8 = 33个字节。char(33)就足够了,如果还不够的话,因为大多数用法不需要​​2 ^ 32卷。

如果确实需要空间,则可以使用自己的格式存储文件ID。卷ID需要一个4字节整数,文件密钥需要8字节长数字,文件cookie需要4字节整数。因此16个字节绰绰有余。

[root@k8s weedfs]# curl http://localhost:9333/dir/assign?replication=001
{"fid":"4,01c1810497","url":"10.10.3.163:8081","publicUrl":"10.10.3.163:8081","count":1}[root@k8s weedfs]#
[root@k8s weedfs]# curl -F file=@acme.sh.tar.gz http://10.10.3.163:8081/4,01c1810497
{"name":"acme.sh.tar.gz","size":205121,"eTag":"0e2e8219a406a0cb817f24716caa9432"}[root@k8s weedfs]#

下载:

[root@k8s weedfs]# wget  http://10.10.3.163:8081/4,01c1810497
--2021-02-03 17:29:44--  http://10.10.3.163:8081/4,01c1810497
Connecting to 10.10.3.163:8081... connected.
HTTP request sent, awaiting response... 200 OK
Length: 205121 (200K) [application/x-gzip]
Saving to: ‘4,01c1810497’

4,01c1810497                                              100%[===================================================================================================================================>] 200.31K  --.-KB/s    in 0.001s  

2021-02-03 17:29:44 (249 MB/s) - ‘4,01c1810497’ saved [205121/205121]

[root@k8s weedfs]# ll
total 70368
-rw-r--r-- 1 root root   205121 Feb  3 17:28 4,01c1810497
-rw-r--r-- 1 root root   205121 Feb  3 16:11 acme.sh.tar.gz
-rw-r--r-- 1 root root     5718 Feb  3 17:04 filer.toml
-rwxrwxr-x 1 2000 2000 71629836 Feb  1 12:50 weed

比较上传前后卷空间大小变化,可以发现,卷空间增加的大小正好等于上传文件的大小

[root@k8s weedfs_data]# du -sh *
104K	filer
4.0K	filermount
44K	master
76K	vola
4.0K	volb
8.0K	volc
76K	vold
4.0K	vole
4.0K	volf
[root@k8s weedfs_data]# du -sh *
104K	filer
4.0K	filermount
44K	master
288K	vola
4.0K	volb
8.0K	volc
284K	vold
4.0K	vole
4.0K	volf

删除文件:
因为weedfs对删除文件,磁盘空间释放需要额外的操作,这里做一下测试,验证一下
调用删除api 删除刚刚上传的acme.sh.tar.gz

[root@k8s weedfs]# curl -X DELETE 127.0.0.1:8081/4,01c1810497
{"size":205147}[roowget  http://10.10.3.163:8081/4,01c1810497
--2021-02-03 17:34:19--  http://10.10.3.163:8081/4,01c1810497
Connecting to 10.10.3.163:8081... connected.
HTTP request sent, awaiting response... 404 Not Found
2021-02-03 17:34:19 ERROR 404: Not Found.

删除在wget 404 说明已经删除,但是果然如官方所说,删除完以后,并不会释放磁盘空间

[root@k8s weedfs_data]# du -sh *
104K	filer
4.0K	filermount
44K	master
316K	vola
4.0K	volb
8.0K	volc
312K	vold
4.0K	vole
4.0K	volf
[root@k8s weedfs_data]#

使用下面的api查看卷状态信息,可以看到,id为4的卷文件数目是1,因为我删除了id为4的卷上面的文件,所以下面id为4的卷信息显示"DeleteCount": 1。 (有个疑问是,replication为001的模式,为啥没有看到其他卷上面有删除记录)

[root@k8s weedfs]# curl "http://localhost:8081/status?pretty=y"
{
  "DiskStatuses": [
    {
      "dir": "/data/weedfs_data/vola",
      "all": 214432849920,
      "used": 5096587264,
      "free": 209336262656,
      "percent_free": 97.62322,
      "percent_used": 2.3767755
    }
  ],
  "Version": "30GB 2.23 318a3d2",
  "Volumes": [
    {
      "Id": 1,
      "Size": 0,
      "ReplicaPlacement": {
        "SameRackCount": 1,
        "DiffRackCount": 0,
        "DiffDataCenterCount": 0
      },
      "Ttl": {
        "Count": 0,
        "Unit": 0
      },
      "Collection": "",
      "Version": 3,
      "FileCount": 0,
      "DeleteCount": 0,
      "DeletedByteCount": 0,
      "ReadOnly": false,
      "CompactRevision": 0,
      "ModifiedAtSecond": 0,
      "RemoteStorageName": "",
      "RemoteStorageKey": ""
    },
    {
      "Id": 2,
      "Size": 0,
      "ReplicaPlacement": {
        "SameRackCount": 1,
        "DiffRackCount": 0,
        "DiffDataCenterCount": 0
      },
      "Ttl": {
        "Count": 0,
        "Unit": 0
      },
      "Collection": "",
      "Version": 3,
      "FileCount": 0,
      "DeleteCount": 0,
      "DeletedByteCount": 0,
      "ReadOnly": false,
      "CompactRevision": 0,
      "ModifiedAtSecond": 0,
      "RemoteStorageName": "",
      "RemoteStorageKey": ""
    },
    {
      "Id": 3,
      "Size": 0,
      "ReplicaPlacement": {
        "SameRackCount": 1,
        "DiffRackCount": 0,
        "DiffDataCenterCount": 0
      },
      "Ttl": {
        "Count": 0,
        "Unit": 0
      },
      "Collection": "",
      "Version": 3,
      "FileCount": 0,
      "DeleteCount": 0,
      "DeletedByteCount": 0,
      "ReadOnly": false,
      "CompactRevision": 0,
      "ModifiedAtSecond": 0,
      "RemoteStorageName": "",
      "RemoteStorageKey": ""
    },
    {
      "Id": 4,
      "Size": 205147,
      "ReplicaPlacement": {
        "SameRackCount": 1,
        "DiffRackCount": 0,
        "DiffDataCenterCount": 0
      },
      "Ttl": {
        "Count": 0,
        "Unit": 0
      },
      "Collection": "",
      "Version": 3,
      "FileCount": 1,
      "DeleteCount": 1,
      "DeletedByteCount": 205147,
      "ReadOnly": false,
      "CompactRevision": 0,
      "ModifiedAtSecond": 0,
      "RemoteStorageName": "",
      "RemoteStorageKey": ""
    },
    {
      "Id": 5,
      "Size": 0,
      "ReplicaPlacement": {
        "SameRackCount": 1,
        "DiffRackCount": 0,
        "DiffDataCenterCount": 0
      },
      "Ttl": {
        "Count": 0,
        "Unit": 0
      },
      "Collection": "",
      "Version": 3,
      "FileCount": 0,
      "DeleteCount": 0,
      "DeletedByteCount": 0,
      "ReadOnly": false,
      "CompactRevision": 0,
      "ModifiedAtSecond": 0,
      "RemoteStorageName": "",
      "RemoteStorageKey": ""
    },
    {
      "Id": 6,
      "Size": 0,
      "ReplicaPlacement": {
        "SameRackCount": 1,
        "DiffRackCount": 0,
        "DiffDataCenterCount": 0
      },
      "Ttl": {
        "Count": 0,
        "Unit": 0
      },
      "Collection": "",
      "Version": 3,
      "FileCount": 0,
      "DeleteCount": 0,
      "DeletedByteCount": 0,
      "ReadOnly": false,
      "CompactRevision": 0,
      "ModifiedAtSecond": 0,
      "RemoteStorageName": "",
      "RemoteStorageKey": ""
    }
  ]
}

既然空间没有释放出来,那么我们就按官网的说明,手动释放一下。

[root@k8s weedfs]# curl http://localhost:9333/vol/vacuum
{"Topology":{"DataCenters":[{"Free":36,"Id":"DefaultDataCenter","Max":48,"Racks":[{"DataNodes":[{"EcShards":0,"Free":2,"Max":8,"PublicUrl":"10.10.3.163:8081","Url":"10.10.3.163:8081","VolumeIds":"1-6","Volumes":6},{"EcShards":0,"Free":2,"Max":8,"PublicUrl":"10.10.3.163:8084","Url":"10.10.3.163:8084","VolumeIds":"1-6","Volumes":6}],"Free":4,"Id":"rack1","Max":16},{"DataNodes":[{"EcShards":0,"Free":8,"Max":8,"PublicUrl":"10.10.3.163:8082","Url":"10.10.3.163:8082","VolumeIds":"","Volumes":0},{"EcShards":0,"Free":8,"Max":8,"PublicUrl":"10.10.3.163:8085","Url":"10.10.3.163:8085","VolumeIds":"","Volumes":0}],"Free":16,"Id":"rack2","Max":16},{"DataNodes":[{"EcShards":0,"Free":8,"Max":8,"PublicUrl":"10.10.3.163:8086","Url":"10.10.3.163:8086","VolumeIds":"","Volumes":0},{"EcShards":0,"Free":8,"Max":8,"PublicUrl":"10.10.3.163:8083","Url":"10.10.3.163:8083","VolumeIds":"","Volumes":0}],"Free":16,"Id":"rack3","Max":16}]}],"Free":36,"Layouts":[{"collection":"","replication":"001","ttl":"","writables":[1,2,3,5,6,4]}],"Max":48},"Version":"30GB 2.23 318a3d2"}[root@k8s weedfs]#

前后对比

[root@k8s weedfs_data]# du -sh *
104K	filer
4.0K	filermount
44K	master
316K	vola
4.0K	volb
8.0K	volc
312K	vold
4.0K	vole
4.0K	volf
[root@k8s weedfs_data]# du -sh *
104K	filer
4.0K	filermount
48K	master
180K	vola
4.0K	volb
8.0K	volc
176K	vold
4.0K	vole
4.0K	volf
[root@k8s weedfs_data]#

发现磁盘空间果然被释放了。这个时候再查看一个卷信息

[root@k8s weedfs]# curl "http://localhost:8081/status?pretty=y"
{
  "DiskStatuses": [
    {
      "dir": "/data/weedfs_data/vola",
      "all": 214432849920,
      "used": 5096337408,
      "free": 209336512512,
      "percent_free": 97.623344,
      "percent_used": 2.376659
    }
  ],
  "Version": "30GB 2.23 318a3d2",
  "Volumes": [
    {
      "Id": 1,
      "Size": 0,
      "ReplicaPlacement": {
        "SameRackCount": 1,
        "DiffRackCount": 0,
        "DiffDataCenterCount": 0
      },
      "Ttl": {
        "Count": 0,
        "Unit": 0
      },
      "Collection": "",
      "Version": 3,
      "FileCount": 0,
      "DeleteCount": 0,
      "DeletedByteCount": 0,
      "ReadOnly": false,
      "CompactRevision": 0,
      "ModifiedAtSecond": 0,
      "RemoteStorageName": "",
      "RemoteStorageKey": ""
    },
    {
      "Id": 2,
      "Size": 0,
      "ReplicaPlacement": {
        "SameRackCount": 1,
        "DiffRackCount": 0,
        "DiffDataCenterCount": 0
      },
      "Ttl": {
        "Count": 0,
        "Unit": 0
      },
      "Collection": "",
      "Version": 3,
      "FileCount": 0,
      "DeleteCount": 0,
      "DeletedByteCount": 0,
      "ReadOnly": false,
      "CompactRevision": 0,
      "ModifiedAtSecond": 0,
      "RemoteStorageName": "",
      "RemoteStorageKey": ""
    },
    {
      "Id": 3,
      "Size": 0,
      "ReplicaPlacement": {
        "SameRackCount": 1,
        "DiffRackCount": 0,
        "DiffDataCenterCount": 0
      },
      "Ttl": {
        "Count": 0,
        "Unit": 0
      },
      "Collection": "",
      "Version": 3,
      "FileCount": 0,
      "DeleteCount": 0,
      "DeletedByteCount": 0,
      "ReadOnly": false,
      "CompactRevision": 0,
      "ModifiedAtSecond": 0,
      "RemoteStorageName": "",
      "RemoteStorageKey": ""
    },
    {
      "Id": 4,
      "Size": 0,
      "ReplicaPlacement": {
        "SameRackCount": 1,
        "DiffRackCount": 0,
        "DiffDataCenterCount": 0
      },
      "Ttl": {
        "Count": 0,
        "Unit": 0
      },
      "Collection": "",
      "Version": 3,
      "FileCount": 0,
      "DeleteCount": 0,
      "DeletedByteCount": 0,
      "ReadOnly": false,
      "CompactRevision": 1,
      "ModifiedAtSecond": 0,
      "RemoteStorageName": "",
      "RemoteStorageKey": ""
    },
    {
      "Id": 5,
      "Size": 0,
      "ReplicaPlacement": {
        "SameRackCount": 1,
        "DiffRackCount": 0,
        "DiffDataCenterCount": 0
      },
      "Ttl": {
        "Count": 0,
        "Unit": 0
      },
      "Collection": "",
      "Version": 3,
      "FileCount": 0,
      "DeleteCount": 0,
      "DeletedByteCount": 0,
      "ReadOnly": false,
      "CompactRevision": 0,
      "ModifiedAtSecond": 0,
      "RemoteStorageName": "",
      "RemoteStorageKey": ""
    },
    {
      "Id": 6,
      "Size": 0,
      "ReplicaPlacement": {
        "SameRackCount": 1,
        "DiffRackCount": 0,
        "DiffDataCenterCount": 0
      },
      "Ttl": {
        "Count": 0,
        "Unit": 0
      },
      "Collection": "",
      "Version": 3,
      "FileCount": 0,
      "DeleteCount": 0,
      "DeletedByteCount": 0,
      "ReadOnly": false,
      "CompactRevision": 0,
      "ModifiedAtSecond": 0,
      "RemoteStorageName": "",
      "RemoteStorageKey": ""
    }
  ]
}[root@k8s weedfs]#

发现id为4的卷下的DeleteCount也变成了0了,验证了官网所说。

常用api记录

weedfs的使用
master
申请volume信息:curl http://localhost:9333/dir/assign?replication=001 ###文件上传首先需要请求master, 去分配一个逻辑卷和fid
查看集群信息:http://$IP:9333/cluster/status?pretty=y
查看某个卷的上传信息:http://localhost:9333/dir/lookup?volumeId=3
上传文件:curl -F file=@/home/chris/myphoto.jpg http://127.0.0.1:8080/3,01637037d6
请求一个上传了的文件: http://localhost:8080/3,01637037d6.jpg
删除文件:curl -X DELETE http://127.0.0.1:8080/3,01637037d6
查看集群toplogy结构: curl “http://localhost:9333/dir/status?pretty=y”
上传一个目录:curl -F file=@/home/chris/myphoto.jpg http://localhost:9333/submit
强制垃圾回收:curl “http://localhost:9333/vol/vacuum” curl “http://localhost:9333/vol/vacuum?garbageThreshold=0.4”
给某个collection指定volume的数量:curl “http://localhost:9333/vol/grow?collection=staff&count=1”

volume
查看volume中某个大文件被分块的清单:curl http://127.0.0.1:8080/3,01637037d6?cm=false
查看卷信息:curl “http://localhost:8080/status?pretty=y” ##可以看到删除了多少文件,以及删除的大小。这个对调试还有多少空间没有释放很有帮助

下面是使用filer的一些api

# POST a file and read it back
curl -F "filename=@README.md" "http://localhost:8888/path/to/sources/"
curl "http://localhost:8888/path/to/sources/README.md"

# POST a file with a new name and read it back
curl -F "filename=@Makefile" "http://localhost:8888/path/to/sources/new_name"
curl "http://localhost:8888/path/to/sources/new_name"

# list sub folders and files, use browser to visit this url: "http://localhost:8888/path/to/"
# To list the results in JSON:
curl -H "Accept: application/json" "http://localhost:8888/path/to"
# To list the results in pretty JSON
curl -H "Accept: application/json" "http://localhost:8888/path/to?pretty=y"

# The directory list limit is default to 100
# if lots of files under this folder, here is a way to efficiently paginate through all of them
http://localhost:8888/path/to/sources/?lastFileName=abc.txt&limit=50

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值