【背景】
ceph后端支持多种存储引擎,以插件的方式进行管理和使用,默认使用filestore,如ext4、btrfs,xfs。理论上每个文件系统都实现了POSIX协议,但是每个文件系统都会有那么一些不标准的地方。主要存在以下几个方面:
1. Ceph的实现非常注重可靠性,因而需要为每种文件系统引入不同的Walkaround或者Hack;例如Rename不幂等性,等等。这些工作为Ceph的不断开发带来了很大负担。
2. FileStore构建与Linux文件系统之上。POSIX提供了非常强大的功能,但大部分并不是Ceph真正需要的;这些功能成了性能的累赘。另一方面,文件系统的某些功能实现对Ceph并不友好,例如对目录遍历顺序的要求等等。
3. 日志双写问题。为了保证覆写中途断电能够恢复,以及为了实现单OSD内的事务支持,在FileStore的写路径中,Ceph首先把数据和元数据修改写入日志,日志完后后,再把数据写入实际落盘位置。这种日志方法(WAL)是数据库和文件系统标准的保证ACID的方法。但用在Ceph这里,带来了问题:
数据被写入两遍,即日志双写问题,这意味着Ceph牺牲了一半的磁盘吞吐量。
(1) Ceph的FileStore做了一遍日志,而Linux文件系统自身也有日志机制,实际上日志被多做了一遍。
(2) 对于新型的LSM-Tree类存储,如RocksDB、LevelDB,由于数据本身就按照日志形式组织,实际上没有再另加一个单独的WAL的必要。
(3) 更好地发挥SSD/NVM存储介质的性能。与磁盘不同,基于Flash的存储有更高的并行能力,需要加以利用。CPU处