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


下面的图示描述了部分的PG(非全部PG)从已有的OSD 1 , OSD 2上迁移到新OSD 3上达到数据再平衡的过程(因为对大型集群的影响要小得多 , 所以过程相对粗略一些) 。即使在再平衡过程中 , CRUSH也是稳定的 。 大部分的PG仍然保留着原始的配置 , 由于新增加了OSD , 所以每个OSD都会增加一些(可用的)容量 , 因此在重新平衡完成后 , 新的OSD上也不会出现负载峰值的情况 。
深入理解Ceph存储架构文章插图
2.6.4 校验(或擦除)作为Ceph中维护数据一致性以及整洁性的部分 , Ceph OSD 守护进程也可以完成PG内的对象清理工作 , 意思就是Ceph OSD守护进程比较副本间PG内的对象元数据信息 。 校验/擦除(通常是天级别的调度策略)捕获异常或文件系统的一些错误 。 同时 , Ceph OSD守护进程也可以进行更深层次的比较(对象数据本身的按位比较) , 而这种深层次的比较(可以发现驱动盘上坏的扇区)一般是周级别的调度策略 。
2.7 高可用除了通过CRUSH算法实现高可扩展性外 , Ceph也需要支持高可用性 。 这就意味着即使集群处于降级状态或某个Ceph mon出现问题情况下(译者注:这里出问题的mon个数不能超过mon总数的一半 , 否则集群会阻塞所有操作) , 客户端仍旧可以进行数据的读写 。
2.7.1 数据副本在副本存储池中 , Ceph需要对象的多个副本在降级状态下运行 。 理想情况下 , 即使Acting Set中的一个OSD出现问题 , Ceph存储集群也可以支持客户端读写操作 。 基于此 , Ceph默认也是一个对象保持3副本的设置 , 写操作则要求至少2个副本为clean状态(译者注: 具体设置多少个副本为clena才支持写操作 , 这要依赖于设置存储池时的配置 , 例如 , 在ceph osd dump | grep pool输出中的replicated size 3 min_size 2 , 这里的2就是至少有多少个副本为clean , 在这个存储池上的写操作才被支持 , 而这个值是可以再更新的) 。
如果有2个OSD出现问题 , Ceph仍然可以保留数据不会丢失 , 但是就不能进行写操作了 。
在纠删码存储池中 , Ceph需要多个OSD来存储对象分割后的块以便在降级状态仍然可以操作 。 与副本存储池类似 , 理想情况下 , 在降级状态下纠删码存储池也支持Ceph客户端进行读写操作 。 基于此 , 我们则建议设置K+M=5 通过5个OSD来存储块信息 , 同时设置M=2 以保证即使2个OSD出现问题也可以根据剩余的OSD进行数据的恢复重建 。
2.7.2 Mon集群在客户端进行数据读写之前 , 客户端必须从Ceph mon端获取最新的集群映射关系 。 一个Ceph存储集群可以与一台mon进行通信发起操作 , 然而这就存在单点问题(例如这个单点的mon出现问题 , Ceph客户端则不能进行数据的读写) 。
为了提供服务的可靠性以及容错性 , Ceph支持mon组成集群方式提供服务 。 在mon集群中 , 延迟和其他的故障可能导致一个或多个mon落后于集群当前的状态 。 基于此 , Ceph必须在集群状态的各种mon实例之间达成一致 。 对于集群当前的状态 , Ceph也总是使用大多数的mon(例如: 1、2:3、3:5、4:6等等)或者Paxos算法进行一致性确认 。 同时 , mon集群内机器间也需要NTP时间服务防止时钟漂移 。
2.7.3 CephXCephx 认证协议的操作方式与Kerberos类似 。 用户、角色调用Ceph客户端来与mon交互 , 不像Kerberos , 每一个monitor都可以对用户进行认证并分发密钥 , 所以使用cephx 不存在单点问题或瓶颈 。 mon返回类似于Kerberos的包含会话密钥信息的结构以便调用方可以根据密钥对接Ceph的所提供的服务 。 这里的会话密钥本身使用了用户的永久密钥进行加密 , 因此只有用户自已才可以从Ceph mon请求服务 。
客户端使用会话密钥从monitor处获取想要的服务 , mon则通过认证使得客户端有权限对接OSD来完成数据交互 。 Ceph mon和OSD共享一个秘钥 , 因此客户端可以使用mon提供的凭证与群集中的任何OSD或元数据服务器进行交互 。 和Kerberos类似 , cephx 凭证也有超时时间 , 所以并不能使用一个超时的凭证偷偷的对集群进行攻击 。 只要用户的密钥在到期前不泄露的话 , 这种身份认证的形式可以防止攻击者以其他用户的身份创建伪造消息或更改其他用户的合法消息访问通信介质 。
如果使用Cephx 认证 , 管理员必须先设置用户 。 在下面的图示中 , client.admin 用户通过命令行执行ceph auth get-or-create-key 命令 , 创建用户以及密钥 。 Ceph的auth 子系统生成用户名以及密钥 , 并将其存于mon中以及将用户名与密钥返回给调用命令的client.admin 用户 。这也就意味着客户端与mon共享同一个密钥 。