Google File System

2018-11-09  本文已影响0人  滩主

背景

GFS是Google为其内部应用设计的分布式存储系统。Google可能是这个星球上最大的数据工厂了。如何高效可靠地存储如此大规模的数据成为一个很棘手的问题。纵观Google的内部应用,数据访问有以下特点:

  1. 数据集庞大,数据总量和单个文件都比较大,如应用常常产生数GB大小的单个文件;
  2. 数据访问特点多为顺序访问,比较常见的场景是数据分析,应用程序会顺序遍历数据文件,产生顺序读行为;
  3. 多客户端并发追加场景很常见,极少有随机写行为;
  4. 一次写入,多次读取,例如互联网上的网页存储。
    GFS是Google针对其数据访问模式而设计的分布式存储系统

架构

GFS系统主要存储文件系统两类数据:

文件元数据:包括file system namespace(目录结构、文件元数据等)、文件存储位置信息等;
文件数据:文件在磁盘上的存储格式
在GFS中,文件被切割为固定大小的Chunk然后分散存储,典型的Chunk大小为64MB。Chunk也是数据复制的基本单位,每个Chunk默认复制三份存放在不同的地方(机架、机器、磁盘)


image.png

Master

Master主要存储文件元数据信息,包括:id、文件大小、创建时间、文件的chunk信息等。在论文中说明单个文件的元数据信息不超过64字节。Master会将这些元数据信息进行持久化存储
由于元数据的重要性,Master会将文件元数据持久化存储。每一次元数据的更新操作都会先写日志,再应用到内存的B树,这样即使出现断电等异常,也不会丢失更新。系统重启时,会重放日志在内存中构建B树。
为了避免日志过大而引发启动缓慢问题,Master会定期进行日志回收,原理是:将当前内存状态冻结并持久化存储到磁盘上,称为Checkpoint;然后,回收该时刻之前的所有日志。若系统此时重启,只需要:1. 将Checkpoint加载入内存;2. 重放Checkpoint点之后的日志即可在内存中重构最新状态。

Chunk管理

大文件会被切割成Chunk(64MB)存储,每个文件至少存储为一个chunk,于是,小文件的chunk大小就会小于64MB。每个Chunk有全局唯一标识符。文件元数据中存储了file id至chunk映射关系。

由于Chunk以多副本方式存储,Master还需要维护Chunk位置信息。Chunk的位置信息ChunkServer周期性汇报,Master只在内存中维护该信息,无需持久化

副本选择

GFS在论文中说明了创建chunk时副本位置的选择算法:
选择存储空间利用率最低的节点和磁盘;
选择最近一段时间内新建chunk数量较少的节点和磁盘;
将多个副本分散在不同的rack上。

Chunk size

chunk size的大小直接影响系统的吞吐指标,chunk size越大越能利用磁盘的顺序读能力,4M的chunk能够利用到磁盘50%多的吞吐,而64M的chunk能够充分利用磁盘的顺序读能力

# 磁盘的顺序读性能
fio -name iops -rw=read -bs=4k -size=8796093022208 -runtime=20 -iodepth=1024 -filename=/dev/sdi -ioengine=libaio -direct=1 -numjobs=1 -group_reporting
# r=238MiB/s  r=60.9k IOPS

# 磁盘随机读块大小对吞吐的影响
fio -name=iops -rw=randread -bs=4k -size=8796093022208 -runtime=30 -iodepth=1024 -filename=/dev/sdi -direct=1 -numjobs=1 -group_reporting
# r=332KiB/s r=83 IOPS

fio -name=iops -rw=randread -bs=16k -size=8796093022208 -runtime=30 -iodepth=1024 -filename=/dev/sdi -direct=1 -numjobs=1 -group_reporting
# r=1329KiB/ss r=83 IOPS

fio -name=iops -rw=randread -bs=64k -size=8796093022208 -runtime=30 -iodepth=1024 -filename=/dev/sdi -direct=1 -numjobs=1 -group_reporting
# r=5317KiB/s r=83 IOPS

fio -name=iops -rw=randread -bs=256k -size=8796093022208 -runtime=30 -iodepth=1024 -filename=/dev/sdi -direct=1 -numjobs=1 -group_reporting
# r=20.0MiB/s r=80 IOPS

fio -name=iops -rw=randread -bs=1m -size=8796093022208 -runtime=30 -iodepth=1024 -filename=/dev/sdi -direct=1 -numjobs=1 -group_reporting
# r=60.0MiB/s r=60 IOPS

fio -name=iops -rw=randread -bs=4m -size=8796093022208 -runtime=30 -iodepth=1024 -filename=/dev/sdi -direct=1 -numjobs=1 -group_reporting
# r=124MiB/s r=31 IOPS

fio -name=iops -rw=randread -bs=16m -size=8796093022208 -runtime=30 -iodepth=1024 -filename=/dev/sdi -direct=1 -numjobs=1 -group_reporting
# r=160MiB/s r=10 IOPS

fio -name=iops -rw=randread -bs=64m -size=8796093022208 -runtime=30 -iodepth=1024 -filename=/dev/sdi -direct=1 -numjobs=1 -group_reporting
# r=192MiB/s r=3 IOPS
上一篇 下一篇

猜你喜欢

热点阅读