The Design of a High-Performance File Server

Time: 七月 20, 2013
Category: storage
目录索引

老论文了,Bullet file Server,文献原址:http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.38.5481&rep=rep1&type=pdf

key point:

  1. to do away with the traditional file server's block model. In fact, we have chosen the extreme, which is to maintain files contiguously throughout the system. That is, files are contiguously stored on disk, contiguously cached in RAM, and kept contiguously in processes’ memories. This dictates the choice for whole file transfer.
  2. Another design choice, which is closely linked to keeping files contiguous, is to make all files immutable. That is, the only operations on files are creation, retrieval, and deletion; there are no update-in-place operations. Instead, if we want to update a data struc-
    ture that is stored on a file, we do this by creating a new file holding the updated data structure.

今天重新思考了一下这几年来了解过的分布式存储系统。

分布式key-value存储系统的设计,可以依据数据类型来进行分类,典型的如数据的大小,因为数据的尺寸通常代表了不同特定的场景和应用:

  1. 对于记录型数据,例如用户信息,日志,消息等等,数据尺寸普遍在100Bytes~20k范围内,绝大多数可能不会超过1k。
  2. 小文件数据,例如搜索引擎抓取的页面,图片等等,数据尺寸普遍在4k~1m范围内,大部分不到100k。
  3. 大文件数据,例如压缩包,软件安装包,高清图片,等等,数据尺寸普遍在1m~100m+范围内

存储引擎和分布式系统通常是解耦的,所以这里仅考虑存储引擎怎么设计的问题。

对于1类型数据,特点是:

  1. 数据量庞大,继而要求系统对读写请求的负载能力非常高
  2. 数据小,高IO

可以按照类似levelDB/nessDB等存储引擎设计,关键是,如何降低随机IO,如何提高缓存命中率。所以重点是缓存怎么设计,这个相比其他两类的系统,复杂很多。

对于3类型数据,特点是:

  1. 数据大,网络带宽受限,如何提升传输速度和降低网络时延?

数据需要进行分块,需要有元数据中心保存key到块列表的map信息,分块的目的,是为了充分利用网络带宽的资源,提高吞吐量。例如GFS等。

而对于2类型数据,则又比较特别,量不算大,尺寸也不大。可以按照类似fastDFS/weed-fs/haystack等系统进行设计,文件聚合存储 + index,减少file handler数量,利用mmap来做缓存,依赖os特性,IO复杂度尽可能的为O(1)

Leave a Comment