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


在下面的图示中 , 客户端跨越对象集(对象集 1)来获取条带数据 。 对象集中由4个对象组成 , 第1个条带单元块是存储在object 0中的stripe unit 0 , 第4个条带单元块是存储在 object 3中的stripe unit 3 。 当写完第4个单无块时 , 客户端会判断对象集是否已满 , 如果没有满的话 , 客户端继续将条带单元块写入第1个对象中(下图中的object 0) 。 如果对象集已满 , 那么客户端就会创建一个新的对象集(下图中的对像集 2) , 然后将第1个条带单元块(stripe unit 16)写入到新对象集中的第1个对象中(下图中的object 4) 。
深入理解Ceph存储架构文章插图
Ceph数据条带化过程中 , 有3个比较重要的参数会对条带化产生影响:

  • 对象大小:Ceph存储集群中可以配置对象大小的上限值(比如2M、4M等) , 对象大小也应该足够的大以便与条带单元块相适应 , 同时设置对象的大小也应该是单元块大小的倍数 。 Red Hat则建议对象大小比较合理的值是16MB 。
  • 条带宽度:条带化中的单元块大小也是可配置的(例如64kb) 。 Ceph客户端将写入对象的数据划分为相同大小的条带单元块(因为写入的数据不一定是单元块的倍数 , 所以最后剩余的一个单元块可能大小与其它的不一样) 。 条带宽度应该是对象大小的一个分数(比如对象是4M , 单元块是1M , 则一个对象能包含4个单元块) , 以便对象可以包含更多条带单元块 。 (译者注:条带宽度也是指同时可以并发读或写的条带数量 。 一般这个数量等于RAID中的物理硬盘数量)
  • 条带数量:根据条带数量 , Ceph客户端将一批条带单元块写入到一系列对象中 。 这里的一系列对象也就是对象集 。 在Ceph客户端写入对象集中最后一个对象之后会返回到对象集中的第1个对象 。
重要提示: 在服务上线生产环境前 , 最好对条带化进行性能上的测试 , 因为一旦数据写入 , 就无法再更改条带参数信息了 。
一旦Ceph客户端将条带化数据映射到条带单元块上 , 进而映射到对象上 , 在对象最终以文件形式存储在磁盘上之前 , Ceph的CRUSH算法会将对象映射到PG中 , 然后再将PG映射到OSD守护进程中 。
注: 由于客户端写入单个存储池中 , 因此条带化到对象中的所有数据都会映射到同一个存储池的PG内 。 所以也会使用相同的CRUSH映射关系以及相同的访问控制策略 。
译者注: 在Ceph存储中 , 涉及条带化的主要是Order、stripe_unit和stripe_count这3个参数 。 由这3个参数确定了数据的写入与存储编排方式 。 默认情况order是22 , 也即对象大小为4MB(2的22次方) , strip_unit大小与对象大小一致(也是4M) , strip_count为1(对象集中只有1个对象) 。
第4章 加密相关LUKS磁盘加密及带来的好处: 在Linux系统中 , 可以使用LUKS方法对磁盘分区进行加密 , 由于LUKS是对整个块设备进行加密 , 所以对于便携式存储能够起到较好的数据保护作用 。
可以使用Ceph-ansible工具创建加密的OSD存储节点 , 这样可以对OSD上存储的数据进行保护 。 更详细的内容可以参考中的Ceph OSD配置章节 。
如何使用ceph-ansible创建加密的磁盘分区: 在OSD安装过程中 , ceph-ansible会调用ceph-disk工具来完成创建加密分区的工作 。
除了数据和日志分区外(Ceph data和ceph journal) , ceph-disk 工具也会创建一个小的密码箱分区以及名称为cephx client.osd-lockbox 的用户 。 ceph密码箱分区包含一个密钥文件 , client.osd-lockbox 用户使用这个密钥文件获取LUKS私钥 , 从而对ceph data和ceph journal分区进行解密 。
之后 , Ceph-disk会再调用cryptsetup 工具为ceph data和ceph journal分区创建2个dm-crypt设备 。 其中dm-crypt设备使用ceph data和ceph journal的GUID作为标识 。
【深入理解Ceph存储架构】Ceph-ansible如何处理LUKS密钥: Ceph-ansible工具将LUKS私钥存储在Ceph monitor监视器的K/V存储中 。 每个OSD都有自己的密钥将存储在dm-crypt设备上加密的OSD数据和日志进行解密 。 加密分区在服务启动时就自动的进行了解密操作 。