有一些存储需求,需要测试一下weed-fs,主要是一些功能介绍,官方文档已经挺不错了-> Github Wiki,我整理一下主要还是为了便于以后查看,对了,weed-fs作者是国人,文末参考的知乎链接内有作者本人回复,加作者微信可以让他拉你进入weed-fs交流群
测试环境
Weed-fs: v0.76
Linux: Fedora 25 Server
- 三台 Linux 系统的电脑,一台为Master控制端,另外两台为数据仓库
- 只有一台电脑的情况下,Master可与Data node同在一台电脑,可将目录与不同的IP端口绑定,以区分数据仓库
- Weed文件系统以volume为单位进行管理,启动volume可以指定rack,dataCenter,collection名称进行归类,以便为文件创建不同副本并方便管理
(一)基本操作(CRUD等)
1,递归上传文件夹内文件
weed upload -dir="/some/big/folder"
weed upload -dir="/some/big/folder" -include=*.txt
2,申请文件Key并上传
curl http://172.19.12.239:9333/dir/assign
curl -X PUT -F file=@/root/seaweedfs-test/imgs/01.jpg http://172.19.12.189:8081/13,20579037da84ff
3,有一个快捷的方式,可以直接上传文件
curl -F file=@/root/seaweedfs-test/imgs/01.jpg http://172.19.12.239:9333/submit
4,根据Volume ID查看文件列表
weed export -dir=/root/data189 -volumeId=11
5,获取Volume的访问地址
已知Volume ID,获取Volume所在的服务器地址
6,删除指定文件
curl -X DELETE http://172.19.12.152:8080/3,01637037d6
7,删除Volume
curl "http://localhost:8080/admin/volume/delete?volume=volumeId"
(二)系统信息
1,获取系统状态
在启动Master的时候可以指定Peers,多个Master并存的时候会有一个为主要分配者,当Master意外停止后,系统会在Peers中选择一个接替Master的工作(Issues中有提到多master主控停止后未启用新master的情况,解决办法是设置奇数个master,参见 #512)
更为详尽的系统信息
curl "http://172.19.12.239:9333/dir/status?pretty=y"
从web端也可以快速了解系统
访问: http://172.19.12.239:9333/
有Volume个数,数据中心IP:端口信息等
Collection
使用collection可以创建一个Volume集合,比如如下命令会创建四个Volume,它会随机分布在不同的文件服务器,在原有Volume ID前边会显示collection集合名称
curl "http://localhost:9333/vol/grow?collection=test&count=4”
重复运行命令会增加count数量的Volume个数
删除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
(三)文件多副本
在启动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会在两种情况下有作用
- 指定的ttl volume满了,则新建一个volume
- 如果设置为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服务器,且会导致历史文件损坏
解决方案:
- 设置定时任务,检查磁盘使用情况
- 当磁盘使用量百分比高于一定阀值后,将Volume设置为只读(具体为将dat文件权限设置为644,重启服务器)
检验:
记录152服务器现有volume所占磁盘空间
将dat文件权限设置为444,重启服务器并启动weed,再次在主服务器运行批量上传命令,可见Master没有分配152服务器的空间,并且查看磁盘空间占用不变
最后,访问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
性能报告
小文件读写测试着重测试系统的文件数处理速度,大文件读写着重测试系统的数据吞吐速度
PS: 我的word中表格怎么水平翻转了180°...
weed-fs初步试用还是挺不错的,希望以后可以添加磁盘达到设定阀值自动变为只读的功能,那样就更方便了
参考: