levy5307 / blog

https://levy5307.github.io/blog/
MIT License
0 stars 0 forks source link

SpanDB #50

Open levy5307 opened 3 years ago

levy5307 commented 3 years ago

https://levy5307.github.io/blog/spandb/

KV存储支持了很多关键应用和服务。他们在内存中执行快速处理,但是仍然经常受到IO性能的限制。最新出现的高速商用NVMe SSD推动了新的KV系统设计,以利用其超低延迟和高带宽的优势。同时,将整个数据库扩展到该高端SSD需要很多资金。并且我们的研究表明,当前基于LSM的KV存储并未完全发挥NVMe的潜力,例如在50%写负载的情况下,在Optane PX4800X上部署的RocksDB与SATA SSD相比吞吐仅仅提高了23.58%。特别的,普通的KV存储设计的IO路径很严重的未充分利用超低延迟的NVMe SSD,尤其是对于small write。例如,通过ext4带来的延迟比通过英特尔SPDK接口高6.8-12.4倍。

在这个背景下,SpanDB出现了。它允许将大量数据托管在更便宜、更大的SSD上,同时将WAL和LSM-tree的前几层定位在更小、更快的NVMe上。为了更好的利用NVMe,SpanDB通过SPDK提供高速、并行的WAL写入,并启用异步请求处理以减轻线程间的同步开销,并通过基于polling-based IO高效工作。

SpanDB Overview

上图为SpanDB的整体架构图

将磁盘分为SD和CD。SD意为speed disk,即高速磁盘,这里是指NVMe。CD意为capacity disk,是低速大容量盘。

  将WAL和LSM的top n层放到SD里。因为WAL直接影响写请求的延迟和吞吐,而WAL通常是GB级别的,并且LSM的top n层是热数据,所以这两者放入SD。这里的n是根据负载情况动态自适应的,并非将CD简单的作为溢出层
  将LSM的剩余层放入CD中,这一部分数据大多是冷数据,且数据量大。将这一部分数据放入CD主要是基于成本考虑

通过SPDK通过使用SPDK直接访问NVMe SSD设备,绕过文件系统和Linux IO stack。SPDK意为Storage Performance Development Kit,其通过引入以下技术,实现高性能存储技术:

  将存储用到的驱动转移到用户态,避免系统调用
  支持零拷贝
  避免在IO链路上使用锁
  使用轮询硬件,而不是中断。断模式带来了不稳定的性能和延时的提升

Design And Implementation