前言
在分布式存储系统中,为了保证文件数据的冗余性,系统往往会对数据进行多副本的设置保存,比如典型的HDFS三副本文件设置。在Ozone中,同样也有副本的概念,不过它的副本单位粒度比HDFS的Block要粗一些。Ozone的是以Datanode上的Container为粒度,进行Container级别的Replication。在一个Container下 ,才是实际具体的block chunk文件。因此在Replication的数据规模上来说,Ozone的Container Replication要比HDFS的Block Replication要略微复杂一些。本文笔者来聊聊Ozone的Container Replication原理内容,在Ozone Datanode基于Container提供数据存储服务以及分布式元数据管理的模式下,它是如何来做Container副本复制的。
Ozone Datanode Container Replication请求处理
说到副本的复制,首先始发点比较容易能够联系到无非是主服务发现某个副本损坏了达不到期望副本数,然后发送新的副本复制请求命令到别的机器上进行Replication的复制。在Ozone中,同样也是如此。
因此第一步,类似地,Datanode收到了SCM服务的Replication请求命令,然后此请求被dispatch到对应的CommandHandler中被处理,
以下为类ReplicateContainerCommandHandler的handle方法处理逻辑:
@Override
public void handle(SCMCommand command, OzoneContainer container,
StateContext context, SCMConnectionManager connectionManager) {
final ReplicateContainerCommand replicateCommand =
(ReplicateContainerCommand) command;
final List<DatanodeDetails> sourceDatanodes =
replicateCommand.getSourceDatanodes();
final long containerID = replicateCommand.getContainerID();
Preconditions.checkArgument(sourceDatanodes.size() >