Page 37 - 《软件学报》2021年第10期
P. 37
乔嘉林 等:基于着色 Petri 网的 HDFS 数据一致性建模与分析 3009
终结状态都是一致的.这说明在没有错误发生的条件下,系统虽然中间状态可能会发生不一致,但最终状态
都是一致的.
本文以一个不一致的状态节点为例,分析出现不一致的条件.在该状态节点的库所中发现文件块存储的位
置为 datanode3 和 datanode2,且只有 datanode3 上实际存储了该文件块,而 datanode2 上并没有.但在其他库所中
可以看到表示发送给 datanode2 的写文件块请求的令牌.因此,这种不一致状态所表达的是:发往 datanode3 的文
件块已在本地写成功,而由 datanode3 发往 datanode2 的文件块还在发送的过程中,两个文件块因为传播的过程
有快有慢,所以出现数据不一致现象.当继续分析该状态节点的后继状态时,可以发现最终都会达到一致状态.
综合分析无错条件下的数据层一致性有以下结论.
(1) 系统会出现数据层的不一致,导致不一致的原因是多个副本之间传播的快慢程度不同;
(2) 经过足够时间的传播,系统最终会达到数据层的一致状态.
4.3.2 有错情况下的数据层一致性
有错情况下的数据层一致性实验中的状态空间报告见表 2.
Table 2 State space report of data layer consistency with error
表 2 有错情况下数据层一致性状态空间报告
统计项 个数
状态节点 211
终结状态 9
不一致状态 4
以其中一个不一致状态为例进行分析.在该状态节点的库所中发现 datanode2 实际存储了该文件块,但是写
文件回复库所中的令牌状态是失败的.因此,这种不一致状态所表达的是:datanode2 的文件块写成功,而另一块
文件写失败,导致整个操作的失败,所以出现不一致现象.由于不一致状态是终结状态,这种不一致并不会随着
时间的推移而自动消失.
综合分析有错条件下的数据层一致性有以下结论.
(1) 系统会出现数据层的不一致,导致不一致的原因包括:多个副本之间传播的快慢程度不同;副本传播
过程中出错,造成一部分副本没有写成功;
(2) 有错误发生时,即使经过足够时间的传播,系统最终也不会达到数据层的一致状态.
4.4 操作层一致性分析
操作层一致性必须通过读操作来实现,既要有写文件输入,又要有读文件输入.因此在该场景下,本文在模
型中设置了两个客户端:一个客户端负责写入文件,一个客户端负责读文件.为了检查文件在写入过程中的不一
致性对读操作是否可见,本文提出了“时点重复读”,即:在文件写入过程中的任意时点,暂停写操作流程,先后执
行两次相同的读文件请求,比较两次读操作的结果是否相同.如果不同,证明在写文件过程中出现的不一致是对
读操作可见的.在建模时设置所有读操作的优先级高于写操作,能够在不改变网络结构的前提下,实现这种操作
的模拟.当需要进行时点重复读测试时,在写操作进行到任意步骤时发起两次读操作请求,即可在写流程状态不
变的情况下完成两次读取.
两次读操作的局部模型如图 17 所示.在原有的模型之外,添加了两个库所 FirstRead 和 SecondRead,以及两
个变迁 GenerateFirstRead 和 GenerateSecondRead,每个库所中只有一个令牌,用于表示读操作请求.
GenerateSecondRead 变迁的一条输入弧来自于库所 ReadFileResponse,这可以保证只有当第 1 个读请求完
成后才开始发送第 2 次读请求.串行地执行两次读操作和并发地执行读操作产生的结果相同,因为读操作不会
改变系统内部的数据结构状态.并且串行执行的状态空间规模远小于并发执行,可以简化分析.
操作层一致性的定义是任意时刻多次读同一数据的结果相同,因此在这一实验中,设置不一致状态节点的
检查规则为:比较两次读操作返回的数据是否相同,将两次读请求结果不相同的状态节点标记为不一致状态
节点.