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


2.1 存储池Ceph存储集群通过‘存储池’这一逻辑划分的概念对数据对象进行存储 。 可以为特定类型的数据创建存储池 , 比如块设备、对象网关 , 亦或仅仅是为了将一组用户与另一组用户分开 。
从Ceph客户端来看 , 存储集群非常简单 。 当有Ceph客户端想读写数据时(例如 , 会调用I/O上下文) , 客户端总是会连接到存储集群中的一个存储池上 。 客户端指定存储池名称、用户以及密钥 , 所以存储池会充当逻辑划分的角色 , 这一角色使得对数据对象访问进行控制 。
实际上 , 存储池不只是存储对象数据的逻辑划分 , 它还扮演着Ceph存储集群是如何分布及存储数据的角色 , 当然了 , 这些复杂的操作对客户端来说也是透明的 。 Ceph存储池定义了:

  • 存储池类型:在以前的老版本中 , 一个存储池只是简单的维护对象的多个深拷贝 。 而现在 , Ceph能够维护一个对象的多个副本 , 或者能够使用纠删码 。 正因为保证数据持久化的2种方法(副本方式与纠删码方式)存在差异 , 所以Ceph 支持存储池类型 。 存储池类型对于客户端也是透明的 。
  • PG:在EB规模的存储集群中 , 一个Ceph存储池可能会存储数百万或更多的数据对象 。 因为Ceph必须处理数据持久化(副本或纠删码数据块)、清理校验、复制、重新再平衡以及数据恢复 , 因此在每个对象基础上的管理就会出现扩展性和性能上的瓶颈 。 Ceph通过散列存储池到PG的方式来解决这个瓶颈问题 。 CRUSH则分配每一个对象到指定的PG中 , 每个PG再到一组OSD中 。
  • CRUSH规则集:Ceph中 , 高可用、持久化能力以及性能是非常重要的 。 CRUSH算法计算用于存储对象的PG , 同时也用于计算出PG的OSD Acting Set译者注:acting set即为活跃的osd集合 , 集合中第一个编号的osd即为主primary OSD 。
  • CRUSH也扮演着其他重要角色:即CRUSH可以识别故障域和性能域(例如 , 存储介质类型、nodes, racks, rows等等) 。 CRUSH使得客户端可以跨故障域(rooms, racks, rows等等)完成数据的写入以便当节点出现粒度比较大的问题时(例如 , rack出问题)集群仍然可以以降级的状态提供服务直至集群状态恢复 。 CRUSH也可使客户端能够将数据写入特定类型的硬件中(性能域) , 例如SSD或具有SSD日志的硬盘驱动器 , 亦或具有与数据驱动相同驱动的日志硬盘驱动器 。 对于存储池来说 , CRUSH规则集决定了故障域以及性能域 。
  • 数据持久化方式:在EB规模的存储集群中 , 硬件故障因为可预期所以一般并不算异常 。 当使用数据对象表示较大粒度的存储接口时(例如块设备) , 对于这种大粒度存储接口来说 , 对象的丢失(不管是1个还是多个)都可能破坏数据的完整性进而导致数据不可用 。 因此 , 数据丢失是不可容忍也是不能接受的 。 Ceph提供了2种持久化方式:第1种为副本存储池方式 , 这种方式将多份相同内容的数据对象通过CRUSH进行故障域的隔离来存储到不同的节点上(比如将对象分别存储在硬件相互隔离的不同节点上) , 这样即使硬件问题也不会对数据的持久化能力产生什么大的影响;第2种为纠删码存储池方式 , 这种方式将对象存储到K+M 个块中 , 其中K表示数据块,M 表示编码块 。 K+M的和表示总的OSD数量 , 可以支持最多同时有M 个OSD出现问题 , 数据也不会丢失 。
从客户端角度来看 , Ceph对外呈现显得优雅而简单 。 客户端只需要读取或写入数据到存储池 。 但是 , 存储池在数据持久化 , 性能以及高可用方面发挥着重要的作用 。
2.2 身份认证为了识别用户并防止中间人攻击 , Ceph提供了cephx认证系统来验证用户和守护进程 。
注: Cephx协议并不处理传输中的数据加密(例如SSL/TLS)也不处理静态数据加密 。
Cephx使用共享的密钥进行认证 , 这也意味着客户端和mon都会有客户端密钥副本 。 认证协议也就是双方都能够向对方证明他们拥有密钥的副本 , 而不会实际泄露密钥 。 这种方式提供了相互认证的机制 , 意味着集群确信用户拥有密钥以及用户确信集群拥有密钥的副本 。
2.3 PG(s)Ceph将存储池分片处理成在集群中均匀且伪随机分布的PG 。 CRUSH算法将每个对象分配到一个指定的PG中 , 并且将每个PG分配到对应的Acting Set集合中—也就是在Ceph客户端和存储对象副本的OSD之间创建一个间接层 。如果Ceph客户端直接就能知道对象存放到具体的哪个OSD中的话 , 那么Ceph客户端和Ceph OSD之间耦合性就太强了 。
相反的 , CRUSH算法会动态的将对象分配到PG中 , 然后再将PG分配到一组Ceph的OSD中 。 有了这个间接层之后 , 当新Ceph OSD加入或者Ceph OSD出现问题时 , Ceph存储集群就可以动态的进行数据再平衡 。 通过在数百到数千个放置组的环境中管理数百万个对象 , Ceph存储集群可以高效地增长和收缩以及从故障中恢复 。