weed-fs 学习笔记

优化

下面是一下优化 weed-fs 的最好策略或者方法。

增加并发写

一般来说,weed-fs 会自动地增长 volume 的数量。例如,如果没有副本 volume,那么将就有7个可以写的 volume 被创建。

如果你想把写操作分步到更多的 volume 上,你可以通过 weed-fs 的 master 服务来增加 volume 的数量。

curl http://localhost:9333/vol/grow?count=12&replication=001

该命令会分配12个 volume。因为001副本类型意味着要保存两份同样的数据,所以,实际上需要创建24个物理 volume。

增加并发读

和前面想死,更多的 volume 会增加并发读。

另外,增加副本,也会有帮助的。在不同的服务中保存相同的数据,当然会帮助并发度。

增加硬盘

增加硬盘,可以给你更好的读写性能。

Gzip 保存

weed-fs 判断一个文件是否可以被 gzip 压缩是通过文件扩展名来实现的。所以,如果你要保存一个 text 类型的的文件,最好使用一些通用的文件扩展名,就好像“.txt”,“.html”,“.js”, “.css”等。如果名字是未知的,就好像“go”,weed-fs 是不会 gzip 压缩内容的。

你也可以自己在提交内容之前济宁 gzip 压缩。如果你这样子做,请确保你保存的文件名带上“.gz”。例如“my.css” 可以压缩成“my.css.gz”然后再发给 weed-fs。当检索内容的时候,如果http客户端支持“gzip”编码,那么会返回已经被 gzip 压缩好的内容。否则,会先被解压,然后在发送。

内存消耗

对于 volume 服务,内存的消耗量和文件的数量关系很大。例如:一个32G大小的 volume,如果每个文件20k,那么会有150万的文件。保存150个文件的元数据需要36MB的内存。差不多是每个文件的元数据有24byte。所以,如果创建了64个 volume(2TB),将会需要2-3GB的内存。如果平均文件的大小改变了,例如200KB(这里应该是2KB才对吧??),那么将会需要200-300MB内存。

理论上,如果让文件id简单地增长会减少内存的消耗量。但是 weed-fs 还没有花费时间在实现这个上面。因为对于每一个文件24byte来说,8byte的文件id,4byte的文件大小,然后就是的额外的其他数据,已经是消耗很小了。

使用你自己的key来保存

文件 id 已经足够漂亮了,但是你依然可以通过自己的方法来生成该文件 id。

文件 id 一共有3个部分:

  • volume id:有空空间的 volume
  • file id:单调增长并且唯一的数字
  • file cookie:一个随机数字,你可以自己定义生成方式

你可以直接向 master 服务请求分配一个文件id,然后替换 file id 那个部分为你自己的唯一id,例如:用户id等

当然你也可以从服务状态中获取那个 volume 有空闲空间。

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

如果你确定哪个 volume 有空闲空间,那么,你就可以使用自己的文件 id,只需要兼容格式。

分配的 file cookie 也是可以自定义的。

自定义 file id 或者 file cookie 是可以接受的行为。严格的单调增长不是必须的,但是保持 file id 基本上是增长的,有利于保持内存数据结构的高效。

上传大文件

如果文件很大而且网络很慢,那么服务将会花很长时间来读一个文件。请增加 -readTimeout=3 来配置 volume 服务。这样子就会中断那些长时间没有上传成功的连接。

也可以通过分割/合并来上传文件。

如果文件很大,最好是通过该方法来上传:

weed upload -maxMB=64 the_file_name

这样子会分割文件成每个 chunk 不大于64M的大小来上传。所有 chunk 的文件 id 会被保存在一个额外的 meta chunk 中。会返回一个meta chunk 文件 id 。

当下载文件是,只需要:

weed download the_meta_chunk_file_id

Collection 可以当做是一个简单的命名空间。

当你请求分配 id 的时候可以指定:

curl http://master:9333/dir/assign?collection=pictures
curl http://master:9333/dir/assign?collection=documents

如果 picturesdocuments collection没有被创建将会创建两个 collection。每一个 collection 都会有一个独立的 volume。

实际上,实际数据文件会有 collection 名为前缀。例如:“pictures_1.dat”,“documents_3.dat”。

为了如果你需要把他们删除,你可以去到 volume 服务然后直接删除数据文件。

日志

在生成环境,你可能需要收集日志。weed-fs使用glog来记录日志。

weed -v=2 master
weed -log_dir=. volume

links