Automating the Choice of Consistency Levels in Replicated Systems(2014)

作者:ChengLi

期刊:usenix

Abstract:提出了SIEVE系统,能够根据目标语义进行自动选择一致性方法。能够静态和动态的分析,自动分类的负载是很低的。

Introduction:很多一致性的方法:都需要程序员指定操作。然后才可能进行强一致性和弱一致性的选择。

还有一种方式,讲操作和一致性进行关联。对一致性级别进行排序和分配实现。(交易强一致性)、(弱一致性)

缺点:这些策略的问题是,它们给应用程序程序员带来了不小的负担,要理解每个操作的语义,以及为不同操作分配不同的一致性级别如何影响用户感知的总体语义。

我们先前的工作是更改复制模型,从一个应用转化为副本的状态。但是这种情况,面临两个困难,第一,必须将每个应用操作转换为一个生成器和一个可交换影子操作。

第二,其次,必须正确地识别哪些影子操作可能破坏应用程序的某些不变式,并适当地标记它们(Red),以便它们在强一致性下执行。

我们设计了SIEVE,能够自动调整。但是必须保留的东西是applicatin的不变式(invariant)和注释少量关于如何合并(merge)并发更新的语义信息。

SIEVE解决的两个主要challenge:

1.如何保证弱一致性的收敛性

SIEVE能够自动的将每个application 转化为可交换的形式。CRDTS类型是主要的可交换类型,程序员在开发的时候可以用符号进行标注。可以总动生成该操作的影子操作。

2.SIEVE使用程序分析来识别在弱一致性语义下执行时可能违反应用程序特定不变量的交换阴影操作,并在强一致性下运行它们(RED操作)。

为了让SIEVE更准确且更轻量级。我们设计了静态检查和运行时动态检查两种方式。静态的做法是:会生成一组抽象的表单,他们表示运行时可能产生影子操作。并为每个表单里的(条目)确定一个逻辑条件(最弱的前提条件),在这个逻辑条件下保证不破坏不变式。然后将该信息存储在字典中,在运行时查找字典并评估满足条件,以确定每个影子操作是否可以在弱一致性下运行。

2背景:

之前的提出来的红蓝一致性,红色的(强一致性),蓝色的(弱一致性)。红色操作是完全相对于彼此的,这意味着它们在所有副本上以相同的相对顺序执行,因此没有两个红色操作同时执行。(符合可串行化操作,顺序一致性)例如 a,b。必须先发生a ,再发生b。相反,蓝色操作可以相对于其他操作重新排序,只要它们保持因果关系(对应因果一致性)。

能够将操作标记为蓝色的一个先决条件是操作应该满足交换条件

为了增加交换的空间,我们把一个操作切分为了生成操作(不会产生任何不良影响)和影子操作。例子:原始情况,S+u=S',u为操作。S为之前状态,S'为之后的状态。

现如今u分解为gu和hu(S),其中gu是生成操作,hu(S)是影子操作。对于任何状态S, S+gu = S and S+hu(S) = S+u 必须满足

3总体概述:

1.使用红蓝一致性要求程序员生成交换阴影运算,并识别哪些可以是蓝色的,哪些必须是红色的。我们的目标是尽可能地自动化这两个任务。(程序员参与的太多)

第一个挑战,我们借用了很多我们利用了丰富的可交换复制数据类型(CRDT)文献(CRDT类型)。

设计了两层架构:带来了两个优势,第一,能够自动识别出引起状态改变的动作。

第二个挑战是,解决自动标注可交换的的操作问题。我们通过(红色划线部分)可以确保影子操作的可交换性(安全的)。这个问题就可以概述为二分类问题(红、蓝两类)。

有两种方式:一种是动态解决方案(它在运行时确定当生成影子操作时,该阴影操作是否满足不变公式安全属性,增加了运行时的开销)。另外一种是静态方案(它决定了对初始操作类型、参数和初始状态的哪些组合进行应用,从而生成一个不变式安全的阴影操作)。

两种方式结合可以实现负载均衡:静态地,我们生成了一组模板,它们对应于CRDT操作的不同可能组合,这些CRDT操作包括阴影操作,以及每个模板保持不变安全的最弱先决条件。然后,在运行时,我们执行一个简单的字典查找,以确定阴影操作属于哪个模板,以便我们可以检索相应的最弱的先决条件,并确定它是否满足。(查字典的方式)

该图中表示架构图:程序员把应用程序的代码写成一系列的事务,这些事务存储起来持久化状态。程序员还需要提供CRDT的标识和应用程序的不变式(安全)。在静态分析者这边,从一系列事务中创造了影子模板。这些模板代表CRDT库中函数的不同调用序列。

运行阶段:

运行代码逻辑和runtime checker。与数据库交互,和复制层交互。在执行事务时,应用服务器在影子操作创建器中运行生成器gu操作,它不是直接向数据库提交effect,而是生成一个由CRDT库调用序列组成的影子操作hu(S)。影子操作被fed in 弱的先决条件检查。为了决定所属于的静态模板(像模式匹配),以及符合不变式安全的最弱条件是什么。

4.如何生成影子操作

介绍如何将应用程序代码自动转换为可交换阴影操作:

4.1 利用CRDTS

利用多种观察技术,达到既保持语义的情况下,又让程序员干预更少。1.多应用程序是在两层模型下构建的,其中服务的所有持久状态都存储在通过SQL命令访问的关系数据库中。2.利用crdts,把所有side effect的操作,封装成可交换的操作。

sql端口(狭窄)是一个限制CRDT的瓶颈(限制吞吐率)。

对元组(c,d)的增加删除可以看作为影子操作(CRDT的增加、删除操作)。只需要修改CRDT merge的方式就可以。不需要转化。

由于update 可能又增加delta 或者后面的更新前面的。本文中提供了一个CRDTS表格。格式为@[CRDTName][TableName|DataFieldName]

这个例子是带注释的 SQL表创建语句。AUSET (append - update Set),一种只允许追加和更新操作的CRDT集,因此排除了对同一项的并发插入和删除(也存在限制较少的CRDT集)。与NUMDELTA关联的objCount字段总是期望一个delta值被添加或减去到它的当前值。默认情况下,如果没有提供注释,我们保守地将相应的表或字段标记为只读。

4.2 运行时,创建影子操作

新用户请求到达时调用原始操作(就跟没使用影子操作一样),不同之处在于,数据库中执行命令的所有调用都被修改JDBC驱动程序截获,构建CRDT操作序列,这些CRDT操作序列在原始操作进行时组成影子操作。此外,通过使用模式注释,SIEVE将每个数据库更新映射为适当的合并语义,并用相应CRDT类型上的适当操作替换特定表上的操作。

例如。上图fig2中的例子  更新objCount创建一个影子操作,当调用update时。会调用查询查到s,之后会返回结果s‘。delta=s'-s,我们可以用主键pk 和delta 构成CRDT的影子操作。读取pk,add delta。最后,当原始操作向数据库发出提交请求时,该工具输出一个包含CRDT操作累积序列的影子操作。

5.分类影子操作(分成红色和蓝色的影子操作)

静态分析,需要又先决条件,和后续条件(不变式)。可能会导致可扩展性问题。(图中的先决条件为找返hash的值,所以是假的)。

这是一个生成操作。先决条件为x不能为负。当输入的值 s 为导致为负数的时候(不变式安全情况),说明不满足先决条件。所以说此操作为强一致性(红色操作)。

这个操作可以生成三个影子操作。空序列、x+10,x-10。只有x-10的能够导致先决条件为假。其他的两种情况,最弱的先决条件都为真。

第二个困难是生成循环。

 fig3中的a是源代码,b为静态分析生成的模板。

之前很多先决条件是程序员指定的。

考虑了两种情况:只需要考虑CRDT操作调用的两套控制流路径,一个循环内的代码不会执行,和另一个与所有可能的控制流路径执行循环和重复迭代消除。然后可以在运行时针对循环的每个单独迭代验证此条件,并且给定独立性属性,此验证将对整个循环执行有效。在我们当前的框架中,迭代独立性属性是手动验证的。(还没实现自动化)

5.1生成模板

通过对生成器操作所采取的每个代码路径的作用进行推理,我们的分析得以简化。我们需要一种算法来提取事务的顺序路径集,并消除循环重复。主要方法是进行分割成为各个分支,且将循环替换为可以在循环中执行的所有非重复分支组合。

原理如下:对于每个交易,抽象化路径。它是一个正则表达式,对该事务中的所有控制流信息进行编码。fig3(a)的抽象路径编码为2 · (3 · (4|6) · 2)∗     数字表示语句标识符、|是一个二元运算符,表示它两边的语句在可选分支中。·连接两个顺序语句。∗表示循环中的重复。(这里面的数字代表行号)。消除循环,需要递归的调用5.1的两种方式。直到消除的成了序列化的方式。破除循环有两种方法,第一破除整体循环,第二把循环放入到循环体中。选择|操作,做了两个重复的路径抽象,一个只有左侧的操作,另外一个只有右边的操作。

近一步,消除*和|。如图第一种情况,是执行外部循环,符合if条件,然后进入内部循环。only if 方式。不符合if条件为only else。我们抽象路径,然后,把操作转换为crdt的影子操作和(只读没有操作),最后把所有的CRDT操作被打包到一个函数中,该函数表示影子操作模板。

最后生成个是<key,value>的字典,key代表模板标识符。value表示值是模板最弱的前提条件。模板的唯一标识符使用正则表达式的受限形式的CRDT操作签名对一组可能路径进行编码

5.2 运行时评估

运行时,如何评估影子操作是否时红色或者蓝色。我们必须在查找匹配(在静态分析期间创建的字典)每个影子操作的模板。此外,我们可以通过消除由于循环而重复的代码段来减少可能的代码路径数量。

第一查找模板:

执行此查找的挑战是,它需要确定对应于所采取的路径的影子操作的标识符。有了字典中标识符和路径匹配起来,通过搜索树。

弱的先决条件检查:

最后,一旦找到与特定阴影操作相对应的模板的最弱前置条件,我们就根据阴影操作的CRDT参数(代码转过来的)来评估该前置条件(字典里的)。这可以通过简单地用实例化(转换过来的)的值替换前置条件中的变量,并将最终表达式计算为true或false来实现。如果最弱的先决条件被评估为真,阴影操作被标记为蓝色,否则阴影操作被标记为红色。在此步骤之后,影子操作被传递到复制层,复制层根据其分类使用不同的策略复制影子操作。

猜你喜欢

转载自blog.csdn.net/zhuiyunzhugang/article/details/111246178