weedfs java_初窥weedfs分布式文件系统

介绍

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

存储数十亿级的文件

快速响应文件。

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

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

架构

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

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

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)。

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

使用示例

本示例简单搭建一个集群,集群规划如下

Master Server :

192.168.0.193

Volmue Server:

192.168.0.191

192.168.0.193

192.168.0.195

192.168.0.196

启动Master Server

./weed master -ip=192.168.0.193

启动Volume Server

./weed volume -dir=/weedfs_data -mserver=192.168.0.193:9333 -port=8083 -ip=`hostname -i`

文件写入

要上传文件:首先,向/ dir / assign发送HTTP POST,PUT或GET请求以获取fid和卷服务器url

> curl -X POST http://192.168.0.193:9333/dir/assign

{"fid":"8,081df3da0dce77","url":"192.168.0.196:8083","publicUrl":"192.168.0.196:8083","count":1}

其次,要存储文件内容,请向响应中的url +'/'+ fid发送HTTP多部分PUT或POST请求:

> curl -X PUT -F file=@./test.log http://192.168.0.196:8083/8,081df3da0dce77

{"name":"test.log","size":8}

更新文件,只需使用新的文件内容再次发送一个PUT或POST请求。

删除文件,只需发送HTTP DELETE请求到相同的URL +'/'+ fid URL:

> curl -X DELETE http://192.168.0.196:8083/8,081df3da0dce77

文件读取

首先通过文件的volumeId查找volume server

> curl -X get http://192.168.0.193:9333/dir/lookup?volumeId=8

{"volumeId":"8","locations":[{"url":"192.168.0.196:8083","publicUrl":"192.168.0.196:8083"}]}

现在您可以使用公共URL从卷服务器读取

http://192.168.0.196:8083/8,081df3da0dce77

性能

使用weedfs自动的命令对搭建的四个数据节点的集群进行了简单的性能测试

使用50万大小为50KB的文件进行读写操作,测试命令及结果如下:

在写的过程中由于194节点磁盘满了导致有极少一部分写入请求失败,不过不影响测试结果,各位就将就一下吧

./weed benchmark -size=51200 -n=500000 -server=192.168.0.193:9333

------------ Writing Benchmark ----------

Concurrency Level: 16

Time taken for tests: 278.368 seconds

Complete requests: 499520

Failed requests: 480

Total transferred: 25591146326 bytes

Requests per second: 1794.46 [#/sec]

Transfer rate: 89778.15 [Kbytes/sec]

Connection Times (ms)

min avg max std

Total: 0.7 8.8 18660.8 106.4

Percentage of the requests served within a certain time (ms)

50% 7.1 ms

66% 8.4 ms

75% 9.3 ms

80% 10.0 ms

90% 12.9 ms

95% 16.3 ms

98% 21.0 ms

99% 24.6 ms

100% 18660.8 ms

------------ Randomly Reading Benchmark ----------

Concurrency Level: 16

Time taken for tests: 196.642 seconds

Complete requests: 500000

Failed requests: 0

Total transferred: 25615722837 bytes

Requests per second: 2542.69 [#/sec]

Transfer rate: 127212.71 [Kbytes/sec]

Connection Times (ms)

min avg max std

Total: 0.2 6.2 219.8 4.2

Percentage of the requests served within a certain time (ms)

50% 5.8 ms

66% 7.5 ms

75% 8.2 ms

80% 8.7 ms

90% 10.7 ms

95% 14.0 ms

98% 16.8 ms

99% 18.6 ms

100% 219.8 ms

其他特性

可以选择是否使用数据副本,以及副本的级别

master servers失败自动漂移-杜绝但点故障

根据文件的mime类型自动进行gzip压缩(linux查看文件的mime类型,file --mime-type)

删除及更新操作之后通过压缩实现自动的磁盘空间回收

集群中的服务器之间可以存在不同的磁盘空间,文件系统,操作系统

添加/删除服务不会导致数据的重新平衡

可选择修复jpeg图片的方向

以下特性还没有研究,后期再补上吧

Optional filer server provides "normal" directories and files via http

Support Etag, Accept-Range, Last-Modified, etc.

Support in-memory/leveldb/boltdb/btree mode tuning for memory/performance balance.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值