Ceph存储基本架构:
Ceph存储可分为块存储,对象存储和文件存储。Ceph基于对象存储,对外提供三种存储接口,故称为统一存储。
Ceph的底层是RADOS(分布式对象存储系统),RADOS由两部分组成:OSD和MON。
MON负责监控整个集群,维护集群的健康状态,维护展示集群状态的各种图表,如OSDMap、MonitorMap、PGMap和CRUSHMap。
OSD负责存储数据、复制数据、平衡数据、恢复数据,与其它OSD间进行心跳检查等。通常情况下一块硬盘对应一个OSD。
Ceph数据的存储过程:
无论使用哪种存储方式(对象、块、文件),存储的数据都会被切分成对象(Objects)。
存储池:
不同用户因为不同的目的把对象存储在不同的存储池里,这些对象分布于OSD上。
对象保存在不同的存储池(Pool)中,是对象存储的逻辑组,对应不同的用户。存储池管理着归置组数量、副本数量、和存储池规则集。
归置组:
归置组(PGPlacementGroup)是对象池的片段,Ceph根据对象的Oid和一些其他信息做计算操作,映射到归置组,无数的对象被划分到不同的归置组。PG是一个逻辑概念,它在数据寻址时类似于数据库中的索引。
每个对象都会固定映射进一个PG中,所以当我们要寻找一个对象时,只需要先找到对象所属的PG,然后遍历这个PG就可以了,无需遍历所有对象。而且在数据迁移时,也是以PG作为基本单位进行迁移。
OSD:
最后PG会根据管理员设置的副本数量进行复制,然后通过crush算法存储到不同的OSD节点上,最终把PG中的所有对象存储到OSD节点上。
BlueStore:
新版本中,Ceph默认以Bluestore存储引擎,作为RADOS中OSD的ObjectStore存储底层实现BlueStore整体架构。
存储空间:
BlueStore将整个存储空间分为3个部分:WAL,DB,SLOW
慢速(Slow)空间:主要用于存储对象数据,由BlueStore管理。
高速(DB)空间:存储blufs和rocksdb产生的数据,由BlueFS直接管理,如果不存在或者DB设备空间不足,则选择Slow类型设备空间。
超高速(WAL)空间:主要存储RocksDB的WAL(即.log)文件,由BlueFS直接管理,如果不存在或者WAL设备空间不足,则逐级降级选择DB、SLOW分区。
Rocksdb:
BlueStore使用Rocksdb作为自己元数据存储的底层实现,将各种元数据以kv型记录的方式存在数据库中。
写入机制:任何元数据的写入都会先写到WAL,然后再写入MemoryTable(Memtable)。
当一个Memtable写满了之后,就会变成immutable的Memtable,RocksDB在后台会通过一个flush线程将这个Memtableflush到磁盘,生成一个SortedStringTable(SST)文件。
BlueFS:
BlueFS与通用文件系统不同,是Bluestore专为Rocksdb所设计的精简文件系统。
BlueFS的文件和目录的元数据以日志事务的形式保存在日志文件中,在上电过程中,replay日志文件中的事务,就可以加载所有的元数据到内存中。
北亚企安针对Ceph的数据恢复流程:
1、制作磁盘镜像,用于数据提取和备份。
2、提取BlueFS中数据库文件。从磁盘镜像的分区获取超级块,得到日志的节点信息。回放整个日志中的事务,得到目录结构和数据库文件节点信息,根据数据库文件节点信息提取数据库文件。提取从每个OSD提取出来的数据库中的object记录。
3、对于损坏的数据库,根据文件格式提取数据库完好文件中的object记录。
4、解析object记录,从各镜像上提取对应的object数据。
5、根据object的id按序组合卷文件的所有object数据块,还原整个卷数据。
6、修复卷的文件系统和其中文件。
对于损坏缺失程度不高的卷文件系统,尝试修复损坏的卷,得到卷中的文件。
对于有固定格式的文件,尝试修复损坏文件。