初窥weedfs分布式文件系统

介绍

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

  1. 存储数十亿级的文件

  2. 快速响应文件。

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.
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,475评论 4 372
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,744评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,101评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,732评论 0 221
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,141评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,049评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,188评论 2 320
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,965评论 0 213
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,716评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,867评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,341评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,663评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,376评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,200评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,990评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,179评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,979评论 2 279

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,112评论 18 139
  • FastDFS是用C语言编写的一款开源的轻量级分布式文件系统。它对文件进行管理,功能包括:文件存储、文件同步、文件...
    欢醉阅读 3,955评论 3 12
  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 3,757评论 0 5
  • 初次看到这章母女同框照时大吃一惊,她们真的好像姐妹啊,能在女儿这么大年龄时还保持如此好的状态真的很难得。随着年龄增...
    伊达生活笔记阅读 333评论 3 4
  • 对于这样的URL请求地址:http://www.abc.com?id=001,如何获取传入的id值呢?...
    考考拉拉阅读 1,069评论 0 0