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 次读请求.串行地执行两次读操作和并发地执行读操作产生的结果相同,因为读操作不会
                 改变系统内部的数据结构状态.并且串行执行的状态空间规模远小于并发执行,可以简化分析.
                    操作层一致性的定义是任意时刻多次读同一数据的结果相同,因此在这一实验中,设置不一致状态节点的
                 检查规则为:比较两次读操作返回的数据是否相同,将两次读请求结果不相同的状态节点标记为不一致状态
                 节点.
   32   33   34   35   36   37   38   39   40   41   42