飞道的博客

Ozone SCM的Pipeline状态转化分析

256人阅读  评论(0)

前言


在前几篇讲述Ozone SCM的文章中,笔者多次提及到了Container,Pipeline的概念。Ozone SCM服务围绕着这2个概念,对外提供核心的存储服务。本文笔者将对其中的Pipeline进行更为深入的分析阐述。Pipeline在SCM中的生命周期是如何的呢?它在SCM是如何发挥作用的呢?

SCM的Pipeline处理流程


如果大家了解过HDFS Datanode数据Pipeline的写过程,想必不会对Pipeline较为陌生。Pipeline在这里的简单意思为 同一批数据处理过程中的节点。副本数据就是存放于Pipeline节点之上的。

不过这里SCM和HDFS不同的点在于,HDFS没有单独把Pipeline信息单独提取出来进行维护管理,而SCM进行了细致化的管理。那么为什么SCM服务要这么做呢?信息解耦?更易于管理系统?

这里的核心点在于依托于SCM Datanode上采用了基于Raft的一致性控制协议,这里面需要提供每次请求操作要覆盖的Pipeline内的节点列表,每个唯一的Pipeline作为一个独立的Raft Group。然后外部对于这个Raft Group的操作最后会原子性地执行在Pipeline的节点中。基于这个背景设计,于是有了上述SCM的Pipeline精细化管理。

在这里SCM的Datanode自身会保留创建过的Pipeline信息,SCM中心服务保留有全局总的Pipeline信息。这部分类似HDFS的Block管理。

然后全局的Pipeline使用过程如下图所示:


对应上图的步骤说明:
1)Datanode将自身创建过的Pipeline上报给SCM服务,只有当Pipeline包含的Datanode节点都成功上报了此Pipeline信息后,才表明该Pipeline是可用的。
2)SCM接收来自下面Datanode的Pipeline信息后,进行内部Pipeline状态的更新,从ALLLOCATED状态变为OPEN的可用状态。SCM服务在初始化时加载Pipeline信息后,所有的Pipeline初始都为ALLOCATED的已分配状态(不可用)。
3)Ozone OM服务向SCM申请Block块,SCM向其返回的分配块信息中包含有Pipeline信息。
4) OM服务向Datanode进行读写数据操作时,将会利用Block块信息中的Pipeline节点信息进行命令的发送。Pipeline中的节点在收到外部命令操作时,会进行Pipeline节点内的一致性状态控制。

SCM Pipeline的生命周期


下面我们再来细致了解下SCM Pipeline的生命周期,即Pipeline的状态转化。SCM Pipeline的状态可不仅仅只有ALLOCATED和OPEN状态两种,它在不同的场合会进行不同状态的切换,

在目前的最新代码中,SCM Pipeline总共有以下4种状态。

  • PIPELINE_ALLOCATED,初始分配状态,不可用,等待Datanode创建好Pipeline并成功上报。
  • PIPELINE_OPEN,Pipeline成功上报,可以被外部使用,有效的Pipeline信息。
  • PIPELINE_DORMANT,临时不可用状态,用于admin的Pipeline的调试,跟踪。
  • PIPELINE_CLOSED,Pipeline关闭状态,常发生于Pipeline节点dead的或Datanode上Pipeline创建失败导致需要SCM关闭掉这个“问题”Pipeline,此Pipeline信息损坏不可用状态。被Close的Pipeline信息将会从SCM中被移除。

上述Pipeline状态对应的切换关系如下图所示:

DORMANT和OPEN之间状态的切换的触发行为来自于admin命令的操作行为,用以调试时跟踪问题时使用。另外创建失败的Pipeline会被SCM close掉。

SCM为外部应用比如(Ozone OM服务)分配块时,会首先选择SCM内现有可使用的Pipeline(OPEN状态)。如果没有可用Pipeline,则会新创建一个Pipeline,初始状态为ALLOCATED。随后为新Pipeline的Datanode节点创建create Pipeline的心跳回复命令。于是在下一次SCM和Datanode的心跳处理中交互过程中,目标Datanode会收到创建Pipeline的SCM response命令后,进行Pipeline的创建,随后汇报给SCM。然后SCM标记汇报的Pipeline状态从ALLOCATED到OPEN,此举代表此Pipeline已经是可用状态了。

在SCM的Pipeline中,还有另外一类单节点副本模式对应的Pipeline,此Pipeline在后续Datanode的数据读写通信采用的方式上和多副本节点的实现不同(因为不用考虑多副本状态一致性控制的问题),但这两类Pipeline在处理过程以及生命周期状态规则是一致的。

以上就是本文所主要阐述的关于SCM Pipeline的相关内容了。


转载:https://blog.csdn.net/Androidlushangderen/article/details/104159237
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场