前言
在前面介绍Ozone文章内容中,笔者多次提及Ozone使用的是Raft一致性协议来做副本间的数据一致性的。Ozone使用的是Raft的Java实现库Apache Ratis实现的,在早期Apache Ratis实现里,它需要传入一个Pipeline节点作为命令操作的对象。并且每个Pipeline之间是不能带重复节点。简单来说,这些Pipeline之间是不交叉的。我们可以理解早期Ozone这种Raft的使用是单一的Raft。每个独立Pipeline作为一个Raft Group,集群总节点数的多少直接决定了Pipeline的最大数量,进而决定整个集群Container操作的throughput。单一独享节点的Raft方式的问题在于它没有更好地利用Datanode的节点的资源。倘若一个节点能够被多个Pipeline组所复用,无疑将会提升SCM Pipeline的总数,进而提升Container的请求处理量。Apache Ratis在RATIS-91: Add multi-raft support中实现了Multi-Raft的支持,Ozone基于此改进同时也同时在做Ozone的Multi-Raft的实现,即Pipeline交叉复用Datanode的实现。本文笔者就来讲述讲述Ozone对此的改进实现。
Multi-Raft的支持到Ozone多Pipeline的节点复用支持
有些同学可能还没太理解上下文的关联,从Multi-Raft的支持如何会演变到多Ozone Pipeline的多节点复用呢?
这里的过程是这样的:
Ozone内部基于Raft协议做一致性的实现,使用的