SeaweedFs分布式文件存储使用报告


有一些存储需求,需要测试一下weed-fs,主要是一些功能介绍,官方文档已经挺不错了-> Github Wiki,我整理一下主要还是为了便于以后查看,对了,weed-fs作者是国人,文末参考的知乎链接内有作者本人回复,加作者微信可以让他拉你进入weed-fs交流群

测试环境

Weed-fs: v0.76

Linux: Fedora 25 Server

feed-fs

  1. 三台 Linux 系统的电脑,一台为Master控制端,另外两台为数据仓库
  2. 只有一台电脑的情况下,Master可与Data node同在一台电脑,可将目录与不同的IP端口绑定,以区分数据仓库
  3. Weed文件系统以volume为单位进行管理,启动volume可以指定rack,dataCenter,collection名称进行归类,以便为文件创建不同副本并方便管理

(一)基本操作(CRUD等)

1,递归上传文件夹内文件

weed upload -dir="/some/big/folder"

weed upload -dir="/some/big/folder" -include=*.txt

feed-fs

2,申请文件Key并上传

curl http://172.19.12.239:9333/dir/assign

feed-fs

curl -X PUT -F file=@/root/seaweedfs-test/imgs/01.jpg http://172.19.12.189:8081/13,20579037da84ff

feed-fs

3,有一个快捷的方式,可以直接上传文件

curl -F file=@/root/seaweedfs-test/imgs/01.jpg http://172.19.12.239:9333/submit

feed-fs

4,根据Volume ID查看文件列表

weed export -dir=/root/data189 -volumeId=11

feed-fs

5,获取Volume的访问地址

已知Volume ID,获取Volume所在的服务器地址

feed-fs

6,删除指定文件

curl -X DELETE http://172.19.12.152:8080/3,01637037d6

7,删除Volume

curl "http://localhost:8080/admin/volume/delete?volume=volumeId"

(二)系统信息

1,获取系统状态

feed-fs

在启动Master的时候可以指定Peers,多个Master并存的时候会有一个为主要分配者,当Master意外停止后,系统会在Peers中选择一个接替Master的工作(Issues中有提到多master主控停止后未启用新master的情况,解决办法是设置奇数个master,参见 #512

更为详尽的系统信息

curl "http://172.19.12.239:9333/dir/status?pretty=y"

feed-fs

从web端也可以快速了解系统

访问: http://172.19.12.239:9333/

feed-fs

有Volume个数,数据中心IP:端口信息等

Collection

使用collection可以创建一个Volume集合,比如如下命令会创建四个Volume,它会随机分布在不同的文件服务器,在原有Volume ID前边会显示collection集合名称

curl "http://localhost:9333/vol/grow?collection=test&count=4”

重复运行命令会增加count数量的Volume个数

feed-fs

feed-fs

删除collection

curl "http://172.19.12.239:9333/col/delete?collection=test”

申请文件key的时候指定collection,上传数据就会上传到collection中

curl "http://172.19.12.239:9333/dir/assign?collection=test"

这样,对于临临时性定期删除的数据需求,可以使用collection

(三)文件多副本

feed-fs

在启动Volume时可以指定它的标签,设置标签可以对数据存储进行分类

经测试,指定Rack标签启动Volume,启动master时指定defaultReplication参数为001(默认000不生成副本),则生成Volume的时候会在相同rack标签下创建名称相同的Volume

这时上传文件,则会存在两个副本,不设置默认复制规则的情况下可以在申请文件key的时候指定复制规则(同样也可以指定数据中心参数dataCenter)

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

下表列出一些复制副本的说明

Value Meaning
000 只存储一份,默认设置
001 在相同的Rack复制一份
010 在不同的Rack复制一份,相同的数据中心
100 在不同的数据中心复制一份
200 在不同的数据中心复制两份
110 在不同的Rack复制一份,不同的数据中心复制一份
  • 创建的物理副本数量等于X+Y+Z+1,XYZ数字最大为2

(四)文件生存期

申请文件key的时候指定ttl值可以获取指定ttl时间的volume,如果没有匹配的,则新建一个volume,volume级别的ttl会在两种情况下有作用

  1. 指定的ttl volume满了,则新建一个volume
  2. 如果设置为3分钟,3分钟内没有写操作,则这个volume会被停止并删除

curl http://localhost:9333/dir/assign?ttl=3m

在文件上传的时候也可以指定ttl

curl -F "file=@/root/seaweedfs-test/imgs/01.jpg" http://172.19.12.189:8081/34,2057c526f7598e?ttl=3m

需要注意的是,应保证文件的ttl小于volume的ttl

TTL值:

  • 3m: 3 minutes
  • 4h: 4 hours
  • 5d: 5 days
  • 6w: 6 weeks
  • 7M: 7 months
  • 8y: 8 years

(五)数据迁移

当更换磁盘想将数据移动到另一台电脑时,需要对Volume进行卸载/挂载操作

在数据服务器上执行卸载操作 curl "http://localhost:8080/admin/volume/unmount?volume=volumeId"

将dat文件与idx文件同时拷贝到另一台机器,在新的机器上执行挂载命令即可

curl "http://localhost:8080/admin/volume/mount?volume=volumeId"

(六)数据备份

使用自带的backup命令可以创建备份,在一个磁盘空间充足的磁盘上运行如下命令,并指定远端的地址与端口,和本地的目录,volumeId是需要备份的volume ID

weed backup -server=master:port -dir=. -volumeId=5

远端不存在的volume ID也是可以运行的,会创建空的volume,如果远端增加了此volume,则下次备份会进行同步

此命令不是服务,需要设置为定时任务,每次运行进行一次比对,进行增量备份,备份多个volume可以用脚本遍历一定范围的volume(如1-100)

(七)磁盘写满处理

将两个数据节点同时开放,Master会随机的返回两个数据节点的Fid以便上传数据,手动创建大型文件,将152服务器的磁盘写满,剩下几十M大小空间,接下来大批量申请Fid并上传数据,观察152服务器上磁盘占用情况以及Master的处理

结论:当磁盘写满后,Master依旧会分配此服务器进行存储,不会自动停止152服务器,且会导致历史文件损坏

解决方案:

  1. 设置定时任务,检查磁盘使用情况
  2. 当磁盘使用量百分比高于一定阀值后,将Volume设置为只读(具体为将dat文件权限设置为644,重启服务器)

检验:

记录152服务器现有volume所占磁盘空间

feed-fs

将dat文件权限设置为444,重启服务器并启动weed,再次在主服务器运行批量上传命令,可见Master没有分配152服务器的空间,并且查看磁盘空间占用不变

feed-fs

最后,访问152服务器上的原有资源,可以正常访问,验证服务器152 Volume变为只读成功

(八)性能测试

小文件写入测试

------------ Writing Benchmark ----------
Completed 3670 of 1048576 requests, 0.3% 3666.3/s 3.7MB/s
Completed 9183 of 1048576 requests, 0.9% 5507.1/s 5.5MB/s
Completed 14904 of 1048576 requests, 1.4% 5729.2/s 5.8MB/s
...
Completed 1031488 of 1048576 requests, 98.4% 5675.1/s 5.7MB/s
Completed 1036362 of 1048576 requests, 98.8% 4881.8/s 4.9MB/s
Completed 1041405 of 1048576 requests, 99.3% 5041.6/s 5.1MB/s
Completed 1047020 of 1048576 requests, 99.9% 5613.1/s 5.6MB/s

Concurrency Level:      16
Time taken for tests:   196.281 seconds
Complete requests:      1048576
Failed requests:        0
Total transferred:      1106754322 bytes
Requests per second:    5342.22 [#/sec]
Transfer rate:          5506.46 [Kbytes/sec]

Connection Times (ms)
              min      avg        max      std
Total:        0.4      2.9       322.7      1.9

Percentage of the requests served within a certain time (ms)
   50%      2.6 ms
   66%      3.1 ms
   75%      3.4 ms
   80%      3.7 ms
   90%      4.6 ms
   95%      5.5 ms
   98%      6.7 ms
   99%      7.7 ms
  100%    322.7 ms

说明: 存入100万个1KB小文件

用时:196.281秒

处理速度:5342.22文件/秒

小文件读取测试

  ------------ Randomly Reading Benchmark ----------
Completed 258 of 1048576 requests, 0.0% 257.4/s 0.3MB/s
Completed 538 of 1048576 requests, 0.1% 280.7/s 0.3MB/s
Completed 881 of 1048576 requests, 0.1% 342.7/s 0.3MB/s
Completed 1193 of 1048576 requests, 0.1% 310.7/s 0.3MB/s
Completed 1466 of 1048576 requests, 0.1% 272.2/s 0.3MB/s
...
Completed 1019870 of 1048576 requests, 97.3% 4738.8/s 4.8MB/s
Completed 1024674 of 1048576 requests, 97.7% 4799.7/s 4.8MB/s
Completed 1030101 of 1048576 requests, 98.2% 5431.8/s 5.5MB/s
Completed 1035282 of 1048576 requests, 98.7% 5181.0/s 5.2MB/s
Completed 1039138 of 1048576 requests, 99.1% 3853.2/s 3.9MB/s
Completed 1044840 of 1048576 requests, 99.6% 5705.8/s 5.7MB/s

Concurrency Level:      16
Time taken for tests:   1428.644 seconds
Complete requests:      1048576
Failed requests:        0
Total transferred:      1106784233 bytes
Requests per second:    733.97 [#/sec]
Transfer rate:          756.55 [Kbytes/sec]

Connection Times (ms)
              min      avg        max      std
Total:        0.1      21.7       1381.2      53.2

Percentage of the requests served within a certain time (ms)
   50%      0.4 ms
   66%      0.5 ms
   75%      0.7 ms
   80%      1.1 ms
   90%    108.5 ms
   95%    149.4 ms
   98%    190.0 ms
   99%    218.5 ms
  100%    1381.2 ms

说明: 读取100万个1KB小文件

用时:1428.644秒

处理速度:733.97文件/秒

大文件写入测试

------------ Writing Benchmark ----------
Completed 181 of 1000 requests, 18.1% 181.5/s 177.3MB/s
Completed 366 of 1000 requests, 36.6% 184.9/s 180.6MB/s
Completed 442 of 1000 requests, 44.2% 76.0/s 74.2MB/s
Completed 452 of 1000 requests, 45.2% 10.0/s 9.8MB/s
Completed 538 of 1000 requests, 53.8% 86.0/s 84.0MB/s
Completed 591 of 1000 requests, 59.1% 52.8/s 51.6MB/s
Completed 691 of 1000 requests, 69.1% 100.4/s 98.0MB/s
Completed 725 of 1000 requests, 72.5% 33.9/s 33.1MB/s
Completed 853 of 1000 requests, 85.3% 128.2/s 125.2MB/s
Completed 945 of 1000 requests, 94.5% 92.0/s 89.9MB/s
Completed 997 of 1000 requests, 99.7% 51.9/s 50.7MB/s

Concurrency Level:      16
Time taken for tests:   11.053 seconds
Complete requests:      1000
Failed requests:        0
Total transferred:      1024031671 bytes
Requests per second:    90.47 [#/sec]
Transfer rate:          90472.49 [Kbytes/sec]

Connection Times (ms)
              min      avg        max      std
Total:        7.6      175.2       2231.0      281.2

Percentage of the requests served within a certain time (ms)
   50%     82.5 ms
   66%    120.2 ms
   75%    155.6 ms
   80%    187.6 ms
   90%    426.8 ms
   95%    798.5 ms
   98%    929.6 ms
   99%    1669.4 ms
  100%    2231.0 ms

说明: 存入1000个1MB文件

用时:11.053秒

处理速度:90文件/秒

写入速度:90Mb/s

大文件读取测试

------------ Randomly Reading Benchmark ----------
Completed 51 of 1000 requests, 5.1% 51.0/s 49.8MB/s
Completed 59 of 1000 requests, 5.9% 8.0/s 7.8MB/s
Completed 133 of 1000 requests, 13.3% 74.1/s 72.3MB/s
Completed 203 of 1000 requests, 20.3% 70.0/s 68.4MB/s
Completed 353 of 1000 requests, 35.3% 124.8/s 121.9MB/s
Completed 399 of 1000 requests, 39.9% 46.1/s 45.0MB/s
Completed 467 of 1000 requests, 46.7% 68.0/s 66.4MB/s
Completed 553 of 1000 requests, 55.3% 86.0/s 83.9MB/s
Completed 730 of 1000 requests, 73.0% 116.0/s 113.3MB/s
Completed 805 of 1000 requests, 80.5% 75.0/s 73.2MB/s
Completed 892 of 1000 requests, 89.2% 87.0/s 85.0MB/s
Completed 963 of 1000 requests, 96.3% 71.0/s 69.3MB/s

Concurrency Level:      16
Time taken for tests:   14.322 seconds
Complete requests:      1000
Failed requests:        0
Total transferred:      1024032171 bytes
Requests per second:    69.82 [#/sec]
Transfer rate:          69824.26 [Kbytes/sec]

Connection Times (ms)
              min      avg        max      std
Total:        3.5      227.8       2198.7      423.3

Percentage of the requests served within a certain time (ms)
   50%     12.9 ms
   66%     23.7 ms
   75%    265.0 ms
   80%    495.5 ms
   90%    854.8 ms
   95%    1159.0 ms
   98%    1504.5 ms
   99%    1956.7 ms
  100%    2198.7 ms

说明: 读取1000个1MB文件

用时:14.322秒

处理速度:69.82文件/秒

写入速度:69.8Mb/s

性能报告

小文件读写测试着重测试系统的文件数处理速度,大文件读写着重测试系统的数据吞吐速度

feed-fs

PS: 我的word中表格怎么水平翻转了180°...

weed-fs初步试用还是挺不错的,希望以后可以添加磁盘达到设定阀值自动变为只读的功能,那样就更方便了

参考:

  1. weed-fs分布式文件系统性能及稳定性如何?
  2. Welcome to the SeaweedFS wiki!