Blobstore简介

参考:spdk.io/doc/blob.html

Blobstore是一种持久的、断电安全的块分配器(block allocator)。它可以代替传统的文件系统,支持上层的存储服务。可以用于数据库(MySQL, RocksDB)、一些专门应用(SAN, NAS)或者分布式存储系统(ex. Ceph, Cassandra)等。Blobstore可以对块设备上一种叫“blob”的块群(groups of blocks)进行异步、非缓存(uncached)、平行的读写。blob通常很大,至少有几百KB,并且总是比块的大小要大。但是Blobstore不是为通用的存储系统设计的,它不支持POSIX。因此为了避免混淆,我们不用文件或者对象来称呼blob

Blobstore是为下一代存储设计的,这种存储设备可以快速随机读写,也不需要垃圾回收。不过目前也可以在NAND上运行。

概念

Blobstore对存储系统进行了如下抽象

  1. 逻辑块(logical block)

磁盘被划分为许多逻辑块,每个逻辑块都有自己从0到N的顺序编号,逻辑块的大小一般是512B或者4KB.

  1. 页(page)

一页由固定数量的逻辑块组成,在创建Blobstore的时候就定好了。组成页的逻辑块总是连续的。每个页也有自己的从0到N的顺序编号。一页的大小一般是4K,所以实际中一般由1~8个块组成。SSD起码要能对页面大小的逻辑块进行原子读写操作。

  1. 集群(cluster)

一个集群由固定大小的页组成,在创建Blobstore的时候就定好了。组成集群的页总是连续的。每个集群也有自己的从0到N的顺序编号。一个集群的大小一般是1M,也就是256页。

  1. blob

一个blob是一个有序的集群列表。blob是通过应用来操作的,这些操作即使断电或者重启也可以继续。应用通过标识号来唯一确定一个blob。在读写的时候,应用给出一个blob内的偏移量来访问blob里面的页面。应用也可以通过键值对的形式存储blob的元数据,也叫做扩展属性(xattrs, extended attributes)

  1. Blobstore

经过应用初始化,支持Blobstore存取方式的SSD叫做“一个Blobstore”。Blobstore元数据确定的区域归这个Blobstore所有。

Blobstore具有原子性:

  1. 写数据时,原子性以一个页面为单位
  1. 设定、修改blob、Blobstore元数据的操作是原子的

在Blobstore的操作没法完成时,系统不会阻塞,而是会调用API提供的回调函数。Blobstore可以在设备上直接运行,也可以在设备的bdev层上运行