在 PLStore 中我们使用数据分层管理的方式来减少在进行空间回收时对底层 SSD 对性能和寿命的影响。
如上图所示,我们将数据分为 3 个层次:
热数据 ,经常被更新的数据,并且被集中存放在 SSD zone1 的数据区中
温数据 ,被更新次数较少的数据,被集中存放在 SSD zone2 的数据区中
冷数据 ,最少被更新的数据,被集中存放在 SSD zone3 的数据区中
其中 zone 由多个 segment 构成,通过数据的分层管理,能够实现在空间回收时将需要被回收的数据集中存放,这样在执行空间回收的过程搬动的数据量较少,在空间回收时对正常业务的性能影响较小。同时在执行空间回收的过程中需要回写的数据量较少,能够有效的较低空间回收对 SSD 寿命的影响。
在进行数据分区管理后,空间回收是以 segment 为执行单位,可以通过灵活的空间回收的策略选择代价较小(需要搬动数据较少)的 segment 进行空间回收,这种空间回收过程对上层业务的性能影响较小,而且配合 SSD 中 discard 指令,还能够降低对 SSD 的寿命的影响。
在空间回收的处理时,PFStore 同时会配合其 Qos 模块,选择合适的时机进行空间回收,从各个方向降低对正常业务的影响,避免分布式系统中出现性能抖动和“毛刺”。
PFStore 只在一个线程中运行,采用 run-to-completion 的编程模型,这样既简化了系统,也消除了系统的性能抖动。但在实际中一个 CPU 的 core 并不能完全发挥出一块 NVMe SSD 的全部性能,所以我们在一个进程中启动多个独立线程,每个独立线程绑定一个 PFStore,而不同的 PFStore 分别管理不同的 SSD 的物理空间,如下图所示。
总结
对于一个分布式系统而言,本地存储引擎只是一个基础组件,需要与其他模块,如一致性协议,网络传输等模块相互配合才能发挥其价值。Ceph 社区在 2018 年提出 Seastore 草案后,在 2019 年又重新提出了新的 OSD(Crimson)来满足高性能应用场景的需求。感兴趣的同学可以阅读 Crimson:A New Ceph OSD for the Age of Persistent Memory and Fast NVMe Storage 的相关内容。
最近几年存储领域有着非常大的进展,硬件领域中非易失性内存、SCM 等技术的逐步成熟与落地,NVMe-OF 等协议逐渐被各个操作系统所支持,同时学术界也出现很多好的 Idea,这些都促进了分布式存储的软件革新和高速发展。