Ceph----纠删码
3.1 RAID
RAID 0
条带化存储数据,将一个文件分块存储到多个磁盘中,理论上能够提供n倍的读取速度,但是没有容错。
RAID 1
使用两块(多块)磁盘,镜像存储,能够在一块磁盘上数据失效的情况下,从另一块磁盘中读取数据。
RAID 5
使用k块磁盘存储数据,1块磁盘存储校验码,使得能提供更快的读取速度时还能够提供一定的容错性。为了防止校验码出错,一般使用数据库存储保证其不会出错。
3.2 高阶RAID
使用Jerasure或者其他算法,使用k个数据盘,m个校验盘,能够提供在m个盘数据失效的情况下还能够读取正确数据。
3.3 纠删码应用
在Ceph中也有两种方式实现数据的容错,一种是采用多副本,另外一种就是纠删码,虽然纠删码能够提供并发读,但是因为需要将对象数据组合以及校验导致其实际的读写处理时间慢于多副本方式。
3.3.1 新写
纠删码:编码后,将数据和校验码一起写入。
3.3.2 读
Primary Shard 收到客户端的读请求,首先将请求的逻辑地址范围进行条带对齐,据此计算得到每个 PG 实例需要读取的数据范围然后分别读取 ,最后再由 Primary Shard 统一汇总后向客户端应答 。
- 需要条带对齐,便于数据修复
- 不需要对校验块位置进行调整,因为CRUSH算法本身带有一定的随机性
3.3.3 覆盖写
基于上述基本读写流程,我们可以着手来分析一种更复杂的情形一一覆盖写( overwri能) 。顾名思义,覆盖写是针对对象的已有内容进行改写 。 对多副本而言, PG 处理新写和覆盖写并无区别,然而纠删码则不然,纠删码通过引人条带的概念,将条带变成了更新对象数据的最小单位(这里指逻辑 PG 以条带为单位更新对象内的数据,对应到每个 PG 实例,则是以块为单位更新 。 纠删码的实现要求数据更新必须以条带为单位进行,即更新条带中任意数据块的同时必须同步更新校验块,否则后续无法进行数据恢复,或者说恢复的是错误的数据),因此如果覆盖写的起始或者结束地址没有进行条带对齐,那么对于不足一个完整条带的部分,其写人只能通过“读取完整条带→修改数据→基于条带重新计算校验数据→写人(被修改部分和校验和)”这样的步骤来进行,这个过程被称为RMW ( Read Modify Write ) 。
为了处理多个写操作造成多次RMW的情况,引入了写缓存操作,将多个写操作合并之后一起写入,能够减少RMW的次数,但是这会明显降低写操作的响应速度。
3.3.4 日志
对于纠删码而言,新写和覆盖写都是分布式写,需要使用日志,保证PG之间数据一致性,掉电后能够恢复写之前状态。多副本只需要一个副本更新成功,就可以同步其他副本数据,但纠删码则需要等待真正完成所有的写操作后才算写操作完成。
3.4 总结
纠删码优点:
- 磁盘的空间利用率高
缺点(相较于多副本):
- 实现更复杂
- 性能更差