Ozone BlockCommitSequenceId在Container上的运用

本文介绍了Ozone中Container的BlockCommitSequenceId,作为一个自增型TransactionId,用于确保不同副本间的一致性。BlockCommitSequenceId通过Raft log id生成,保证唯一性,并记录在Block数据中。用途包括判断副本间数据状态一致性、检测Datanode数据变更,对于Container健康状态管理和复制操作至关重要。
摘要由CSDN通过智能技术生成

前言


在Ozone中,Container以Pipeline节点组织的方式通过StateMachine的形式进行状态一致性的更新。不过这里面对可能存在的一些边缘情况,例如Pipeline节点的突然重启,Container目录的意外删除,我们需要有别的手段来表明Container当前所处于的最新状态。以此我们可以知道一个Container存储于Pipeline节点上的副本间的状态是否是一致的,是否包含一致的Block数据等等。为此,社区在Container中引入了一个自增型的transactionId,表明当前Container的最新的状态。本文笔者来聊聊这个自增型transaction ID在Ozone Container中的实现和运用。

Ozone Container自增型TransactionId:BlockCommitSequenceId


这里笔者要首先介绍介绍Ozone Container自增型Id的由来了。在Ozone中,Container是面向外部提供Block数据存储的单元,其内部会接受来自于外部Block的数据读写请求。简单来说,一个Container在其空间还有富余的情况下,会有外部源源不断的Block的数据写入。鉴于同一Container不同副本所在机器可能存在的通信,网络的延时,会存在数据写入快慢的问题,因此Container在同一时间所处于的最新“数据状态”会有所不同。如果我们把每一次操作当作一个Transaction的话,执行了最新Transaction的Container会有最新的“数据状态”。不过,最终这些Container的副本会执行完写入的Transaction操作,然后达到最终一致的“数据状态”。

那么问题来了,在Ozone中,我们如何实现这样的TransactionId呢?它需要保证每个操作Id在Pipeline节点的Container内是具有唯一性的。在Ozone中,Datanode是通过Apache Ratis+ContainerStateMachine的方式实现了Container操作一致性的控制,而ContainerStateMachine本身是会apply来自于Raft server的Raft log,我们可以充分利用Raft log id作为Container的Transaction更新Id。这样的话,我们也无须另外生成专属于Container的TransactionId。在这里,Ozone将这个TransactionId称为BlockCommitSequenceId,意为每次Block数据写完提交后的Id。

BlockCommitSequenceId遵循以下的原则:

同一Container的多个副本的最终BlockCommitSequenceId是一致的,意为最终Container“数据状态”的一致性。如果有小于Container当前最新的BlockCommitSequenceId的id transaction在写入的时候,说明此Block数据之前已经被写入过了,可以忽略此写入操作。

BCSID(BlockCommitSequenceId的简称)除了在Container层面进行了更新外,还会被记录在每次的Block数据中,以Id的属性形式保存在Block信息中。

此过程转化图如下所示:
在这里插入图片描述
上图显示BCSID除了在Container上会维护一个最新的值外,每次的写入的Block数据中也会带有一个相应的BCSID。

BlockCommitSequenceId的使用用途


BCSID是被记录并更新在了Container中了,那么它有哪些额外的使用用途呢?

根据BCSID在Ozone内的使用场景,它至少有以下用途:

  • 判断Container副本间的数据状态是否是一致的。比如在做Container replication操作的时候,检查现有Container副本状态的BCSID和SCM中心管理服务所维护的BCSID是否一致,如果不一致,则不进行Container Replication操作。如果一致,进行Container的closed操作,并进行后续Replication操作。
  • 判断Datanode本地Container状态数据是否发生更改。如果Container状态在Datanode重启前后发生数据变更,它的BCSID会发生变化,倘若在重启前记录当前的BCSID的值,在重启后,发现它加载的BCSID值不同,则说明数据发生了变化。以此表明此Container的数据已发生变更,为不健康的状态。

引用


[1].https://issues.apache.org/jira/browse/HDDS-1843
[2].https://issues.apache.org/jira/browse/HDDS-935
[3].https://issues.apache.org/jira/browse/HDDS-603

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值