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


注: client.admin 用户必须以安全的方式向用户提供用户ID和密钥 。
深入理解Ceph存储架构文章插图
第3章 客户端架构Ceph客户端在数据存储的接口方面还是存在比较大的差异的 。 Ceph的块设备提供了可以像挂载本地物理驱动盘一样的块存储 , 而Ceph对象网关则通过用户的管理提供了兼容S3与Swift的Restful对象存储接口 。 而对于这些接口 , 都是使用的RADOS(可靠且自动分布式的对象存储)协议与Ceph存储集群进行的交互;同时这些接口也都有一些相同的基本前提:

  • Ceph配置文件 , 或集群名称(通常为ceph )与mon地址
  • 存储池名称
  • 用户名以及密钥的路径
Ceph客户倾向于遵循一些类似的模式 , 例如对象的监视-通知以及条带化 。 下面大概介绍下Ceph客户端里使用的RADOS,librados以及常见的模式 。
3.1 本地协议与Librados现代的应用需要有异步通信能力简单的对象存储接口 , Ceph存储集群就有这个能力并提供简单的接口 。 此接口提供了对集群直接、并行的对象存取 。
  • 存储池操作
  • 快照
  • 读、写对象– 创建或删除– 整个对象或字节范围– 追加或截断
  • 创建/设置/获取/删除 XATTRs
  • 创建/设置/获取/删除 K/V对
  • 复合操作和双重ack语义
3.2 对象的监视与通知Ceph客户端可以为对象注册持久的关注点 , 并保持与主OSD的会话开启 。 客户端可以向所有观察者发送通知消息和数据 , 并在观察者收到通知时接收通知 。 这使得客户端可以使用任何对象作为同步/通信的通道 。
深入理解Ceph存储架构文章插图
3.3 独占锁独占锁提供一种功能特性:任一客户端可以对RBD中资源进行’排它的’锁定(如果有多个终端对同一RBD资源进行操作时) 。 这有助于解决当有多个客户端尝试写入同一对象时发生冲突的场景 。 此功能基于前一节中介绍的对象的监视与通知 。 因此 , 在写入时 , 如果一个客户端首先在对象上建立独占锁 , 那么其它的客户端如果想写入数据的话就需要在写入前先检查是否在对象上已经放置了独占锁 。
设置了这一特性的话 , 同一时刻只有一个客户端能够对RBD资源进行修改 , 尤其像快照创建与删除这种改变RBD内部结构的时候 。 这一特性对于失败的客户端也起到了一些保护的作用 , 例如 , 虚拟机没有响应了 , 然后在其他地方使用同一块磁盘启动它的副本 , 那么这个无响应的虚拟机将在Ceph中被列入黑名单 , 并且无法破坏新的虚拟机中数据 。
强制的独占锁功能特性默认是不开启的 , 但是可以在创建镜象时显示的通过加入–image-features参数来开启这一特性 , 例如:
rbd -p mypool create myimage –size 102400 –image-features 5
这里的5是1与4的和值 ,其中1使得分层特性生效 , 4使得独占锁特性生效 。 所以执行上面这个命令后会创建100GB的RBD镜象 , 同时既支持分层特性也支持独占锁特性 。
强制的独占锁也是后面提到的对象索引映射使用的前提 。 如果没有开启强制的独占锁 , 那么对象索引映射也不会生效 。
独占锁也为mirror这块内容做了不少的工作 。
3.4 对象映射索引对象映射索引也是一种功能特性 , 可以在客户端写入rbd映像时跟踪RADOS对象是否已经存在了 。 当有写入操作时 , 写操作被转义为RADOS对象中的偏移 , 如果对象映射索引功能开启那么对于存在的RADOS对象就会被跟踪到 。 所以当对象已经存在时我们就可以提前知道 。 对象映射索引保存在librbd客户端机器内存中 , 所以对于不存在的对象就省去了再去查询OSD的这一步开销 。 对象映射索引对于一些操作还是比较有利的 , 即:
  • 调整大小
  • 导出操作
  • 复制操作
  • 扁平化
  • 删除
  • 读取
缩小操作就像是对尾部对象的部分删除 。 导出操作知道哪些对象被RADOS请求 。 复制操作知道哪些对象存在并需要复制 。 它不需要遍历潜在的数百或数千个可能的对象 。 扁平化操作将所有父对象拷贝到克隆中 , 以便可以将克隆与父项分离 , 即可以删除从子克隆到父快照的引用 。 因此 , 不是对所有潜在的对象 , 仅是对存在的对象进行复制 。
删除操作仅删除镜象中存在的对象 。 读取操作对于不存在的对象会直接跳过 。 因此 , 对于调整大小(仅缩小)、导出操作、复制操作、扁平化和删除等操作 , 这些操作需要针对所有可能受到影响的RADOS对象(无论它们是否存在)发布操作 。 如果启用对象映射索引特性的话 , 对象若不存在就不需要发布操作了 。