深入理解Ceph存储架构( 八 )


例如 , 我们有一个RBD镜象 , 有1TB的数据且比较稀疏 , 可能拥有数百或数千个RADOS对象 。 如果不开启对象映射索引的话 , 执行删除操作则需要对每一个潜在的目标对象发布删除对象操作;但是如果开启了这一特性 , 那么只需要对真正存在的对象发布一个删除对象的操作就可以了 。
对象映射索引对于克隆是比较有价值的(自身没有实际对象但可以从父对象那获取) 。 当有一个克隆的镜象时 , 克隆初始并没有什么对象 , 所有对克隆对象的读操作都会重定向到父对象中 。 开启对象映射索引可以改善读操作 , 首先对于克隆对象向OSD发布读操作 , 如果读失败了 , 那么再向克隆对象的父对象发布读操作 。 读操作会直接忽略掉根本不存在的对象 。
对象映射索引默认是不开启的 , 但是可以在创建镜象时显示的通过加入–image-features参数来开启这一特性 。 同时独占锁 也是对象映射索引功能特性的使用前提 。 如果不开启独占锁功能特性则对象映射索引也不会生效 。 创建镜象时如果开启对象映射索引 , 可以执行:
rbd -p mypool create myimage –size 102400 –image-features 13
这里的13是1、4、8的和值 ,其中1 使得分层特性生效,4 使得独占锁特性生效 , 8 使得对象映射索引特性生效 。 所以执行上面这个命令后会创建100GB的RBD镜象 , 同时既支持分层特性也支持独占锁特性和对象映射索引特性 。
3.5 数据条带化存储设备一般在吞吐量上都有限制 , 这就会影响到服务的性能和伸缩性 。 因此 , 存储系统一般会提供条带化方案来提高性能与吞吐能力(即 , 将有序的信息分割成多个区段后存储到多个设备上) 。 关于条带化最常见的就是RAID(译者注: 磁盘阵列RAID , 意为将多个磁盘组合成一个容量更大的磁盘组 , 利用单块盘存储的叠加效果来提升整个磁盘存储冗余能力 。 采用这种方案后 , 将存储的数据切割成许多个区段数据 , 然后分别存放在各个硬盘上) 。 与Ceph中条带化最相似的RAID类型就是RAID 0或’条带化卷’ 。 Ceph的条带化提供了RAID 0级的吞吐能力以及n路RAID镜像的可靠性和快速的数据恢复能力 。
Ceph提供3种客户端对接类型: Ceph块设备(CephRBD)、Ceph文件系统(CephFS)、Ceph对象存储(一般是Ceph RGW) 。 数据存储方面 , Ceph客户端会将用户提交的数据转换为Ceph存储集群内部的格式存储到集群中 , 在提供给用户的接口上也是按照这3种类型完成的:块设备镜像、对象存储的RESTful接口、以及CephFS系统目录 。
提示: 存储在Ceph存储集群中的对象自身并没有条带化 。Ceph对象存储 , Ceph块设备和Ceph文件系统将客户端数据条带化后存储在Ceph集群内的多个对象中 。 如果想充分发挥并行能力 , 使用librados库直接将数据写入到Ceph存储集群的Ceph客户端必须执行条带化(以及并行I/O) 。
最简单的Ceph条带化格式即为条带数量为1的单个对象 。Ceph客户端将条带单元块写入到Ceph存储集群对象中 , 直到对象达到其最大容量 , 然后再为额外的条带化数据创建另一个对象 。 对于较小的块设备镜像、S3或Swift对象来说 , 这种简单的条带化方式可能就完全能够满足需求 , 然而 , 这种简单的形式并没有最大限度的利用Ceph在整个放置组中分布数据的能力 , 因此并不能有较大的性能提升 。 下面图示描述了这种最简单的条带化方式:
深入理解Ceph存储架构文章插图
译者注: 例如每一个对象存储上限是4M , 同时每一个单元块占1M , 这时我们有一个8M大小的文件想进行存储 , 这样前4M存储在对象0中 , 后4M就创建另一个对象1来存储 。
如果可以预知存储需求为较大的图像 , 或较大的S3对象或Swift对象(例如视频) , 若想有较大的读写性能提升 , 则可以通过将客户端数据条带化分割存储到多个对象上 。 如果客户端将条带单元块并行的写入到对应对象中 , 由于对象映射到不同的PG上进而会映射到不同的OSD上 , 每个写操作都以最大化速并行进行 , 那么写性能的提升是相当明显的 。
如果完全只对一块磁盘写入操作的话 , 受限就比较多: 磁头的移动(例如每次6ms的寻址时间开销)、设备的带宽(例如每秒最大100MB) 。 通过扩展多个对象上的写入(映射到不同的PG以及OSD上) , Ceph不但可以降低每个驱动盘的寻址时间 , 同时也可以合并多个驱动盘的吞吐能力以获取更快的读写速度 。
注: 条带化独立于对象的副本 。 由于CRUSH跨OSD复制对象 , 所以条带化也会自动完成复制 。