Monitor和核心是OSD Monitor,利用分布式领域的一致性算法Paxos来维护集群唯一的一张表OSDMap。
Monitor采用分担负荷的方式,一个集群可以有多个Monitor节点,任何时刻,任何客户端或者OSD都可以通过和任意一个Monitor进行交互,以索取或者请求更新集群表OSDMap。
OSD上下电、故障上报、故障切换等操作都由OSD独立与Monitor通过协商完成,每个操作都有可能多次修改OSDMap,当然每次修改Paxos算法都会维护Monitor集群的OSDMap的一致性。
以OSD上电为例,需要更新OSDMap,因此OSD上电后向Monitor提出更新OSDMap请求,Monitor更新OSDMap后,利用Paxos在Monitor之间传播最新的OSDMap,维护整个集群所有Monitor的OSDMap的一致性,OSDMap一致后,再由Monitor向OSD回复更新请求完成,然后OSD开始在OSD之间点对点传播最新的OSDMap。每个OSD的OSDMap一致后则上电完毕
OSD也需要定期向Monitor上传自身的信息比如磁盘容量,不断请求Monitor修改OSDMap。
参考b站视频:
https://www.bilibili.com/video/BV1t3411J7Hz/?spm_id_from=333.337.search-card.all.click&vd_source=1ab5d58e060892ad6464ac43916f1a28
https://www.bilibili.com/video/BV1X54y1d7xU/?spm_id_from=333.337.search-card.all.click&vd_source=1ab5d58e060892ad6464ac43916f1a28
以及文档:(有很清晰的伪代码)
https://hardcore.feishu.cn/docs/doccnucpEur2hvGGVRtFshRWx0D
https://hardcore.feishu.cn/wiki/wikcn9i4sfdTkxVX0DYrMMbNBpd
需要注意的是,多数派是外部一致性算法,也就是说为了提高性能,多数节点通过则提案通过,但是未通过的节点将永远数据不一致。
总之,Paxos算法保证了OSDMap的一致性,确保了集群唯一的状态。
OSDMap包括cluster map(集群机房机架磁盘等拓扑结构)、所有osd、存储池信息。这些信息都是唯一的,但是有多个monitor分担负荷,所以需要维护一致性。利用monitor提供的CLI命令对OSD、存储池的增删改都会直接修改OSDMap。
由于短时间内如果对OSD、存储池的增删改比较频繁,那么会造成大量OSDMap更新影响ceph性能,所以monitor会有一个Leader,在一段时间的租期(Lease)内,只有Leader才能发起集群表更新,Leader通过二阶段+多数派获取多数monitor的OSDMap,则必有最新的OSDMap,获得最新的OSDMap后开始Leader生涯,整合一个时间段内所有monitor的接受的更新OSDMap操作合并成一个单独的请求进行提交,提交指的就是Paxos算法确保多数monitor执行了提交的更新操作,并维护OSDMap一致性。
基于固定存储池、固定工作负载下训练AI模型输出最优参数的方法,面临的问题是,**实际生产环境虽然会设定特定的存储池来承担特定的业务,因此存储池面临的工作负载相对具有规律,但实际的工作负载难免复杂无法预料且动态变化,可能仍然需要人工或自动调参,**目前的方法似乎是在已训练好的相近的工作负载下微调模型,然而微调就会面临压测获取样本,这样一定会影响甚至为了训练效果必须中断ceph在线业务。
最理想的方法是,离线训练出一个通用模型,类似推荐系统,输入是ceph环境信息,包括当前工作负载、存储池信息、或OSDMap或其他,模型直接输出最优参数。宁可把模型做大,离线训练时间、推理时间拉长,也不能占用ceph在线时间。
这涉及到强化学习到深度学习的转变,目前之所以采用DDPG来调参,原因是强化学习的特点是依赖特定的系统环境,环境空间连续并且成千上万,每一种环境都会导致结果完全不一样,因此总结出一套模型算法,与任意环境交互获得样本,慢慢训练从而让模型适应该环境,这是一套应对变量是环境的方法论。环境很难当做一种输入给模型,因此模型需要根据环境的变化继续探索产生样本来微调模型。环境发生较大变化则需要长时间重新训练。
回到ceph调参,目前也是把ceph系统当成了可以千变万化的环境,ceph小到每一块盘不一样,大到整个集群拓扑结构不一样、网络不一样等,都可以看做环境的变化。ceph环境可以概括上可以由多变的物理构成和工作负载构成。
物理构成比如:每个厂家的磁盘,甚至同一个厂家的磁盘读写速度可能都不一样、磁盘使用时间、网络也会直接影响读写速度。
但是,如果环境无法量化作为模型的输入,那么一旦环境变化,就需要探索环境再次训练,并且对于刚开始的初始随机参数的模型根据特定环境训练的时候也需要大量时间。
对于那种24小时无法中断的ceph业务没有应用空间,同时实际情况下工作负载、OSD故障扩容等等ceph环境的变化非常频繁,Monitor提供的CLI命令非常方便增删改OSD和存储池,这些命令都会引起环境的变化,环境一旦变化就可能需要微调甚至重新训练模型,会造成很大的经济损失。
所以可能的尝试是,将环境量化作为一种输入,将强化学习改成深度学习
一旦可以采用深度学习,那么就可以做到ceph离线时间收集样本构成训练集,独立训练不再需要依赖环境。
OSDMap中存储池相关信息,记录了每个存储池的crush规则,而crush规则包括映射算法、存储池包含哪些OSD以及这些OSD的标签等许多信息。也许这些信息都可以当做深度学习模型的输入。