问题描述
基于 PCIE 的 SSD 或者基于 NVMe 的 SSD 在技术以及成本上没有可行性;
解决方案
FileStore 是 Ceph 的原始存储实现之一,并且是使用最广泛的实现方式。当 2004 年 Ceph 项目启动时,Ceph 完全依靠机械硬盘进行存储;
原理简述
FileStore 不是直接与原子块设备进行交互,而是与文件系统(通常为 xfs)进行交互。当对象存储处理完对象的语义并将其传递给 FileStore 时,FileStore 会将 PG 视为目录,将对象视为文件,并将元数据视为 XATTR 或 omap 条目,然后将剩下的操作交给文件系统处理,保证数据落盘;
数据的写入分为两个部分:Ceph 日志;Ceph 数据;
第一步、数据写入日志
用户数据文件在客户端写入 Ceph 集群时,将被客户端分割,生成多个以 4MB 为单位的对象。生成的每个对象将来都需要写入 OSD,但首先是写入日志。
Ceph 日志是事物日志系统。Ceph 采用的是全日志系统,即将所有数据存放在日志中。当有突发的大量写入操作时,Ceph 可以先把一些零散的、随机的 I/O 请求保存到缓存中并进行合并,然后再统一向内核发起 I/O 请求。以提高效率,但是一旦 OSD 崩溃,缓存中的数据就会丢失,所以数据在还未写入硬盘时,都会记录到事务日志系统中。当 OSD 崩溃后重新启动时,自动尝试从事务日志系统恢复因崩溃丢失的缓存数据。
写日志有两种模式:
1)Parallel 是日志和磁盘数据同时写;
2)Writeahead 是先写日志,只要日志写成功就返回,后台周期会同步日志中的写操作,实现落盘。其优点是能合并较小 I/O 请求,形成顺序写盘,提高 IOPS。
日志,是提高 FileStore 性能的关键因素,这些都是调优的考量参数:
2)日志同步时间的设置也会影响 Ceph 的性能;
1)日志系统空间大小代表能缓存的数据量;
3)计算日志大小的公式:如果 SSD 的预期吞吐量为 2GB/s,并且文件存储最大同步间隔为 10s,则日志大小应为 40GB(2×2×10);
3)在生产环境中,我们通常使用 SSD 来单独存储日志文件,以提高 Ceph 读写性能;
第二步、日志写入磁盘
在 FileStore 存储模式中,每一个对象都要通过 FileStore 的相关功能写入底层的磁盘。
Ceph 数据就是 Ceph 的对象数据,其中包含元数据。Ceph 在写完日志后,返给 OSD 写完成消息(Writeahead 模式),然后处理下一次写请求。这意味着数据当前保留在日志系统中,还没有真正落入后端的存储磁盘。Ceph OSD 进程根据参数设置的时间定期向文件系统同步数据。此操作执行时,系统会停止写操作,专门执行日志数据到文件系统的同步。
Ceph 的每个对象都要通过 xfs 文件系统落盘。对于文件系统而言,其一定有元数据。为了提高对象的元数据的访问速度,我们可以采用 LevelDB 以 K/V 的方式进行存储,最后将对象落盘;