因果的保证是什么,但休闲

||分布式系统

传统的数据库,因为他们的服务可以读取和单个节点的写入,自然提供了被称为“因果一致性”读取和写入操作的顺序排序保证。分布式系统可以提供这些保证,但为了做到这一点,就必须协调和为了在其所有节点的相关事件,并限制某些操作的速度完成。虽然因果一致性是最容易理解的,当所有的数据排序保证被保留 - 模仿垂直缩放数据库,即使像节点崩溃或网络分区的系统遇到故障 - 存在着许多合法的一致性和耐久性权衡所有系统都需要做。

188金宝搏手机客户端安卓下载MongoDB中已连续运行 - 并通过 -杰普森测试多年。最近,我们一直在努力与杰普森组队测试因果一致性。在他们的帮助,我们了解到,如果你交易一致性保证吞吐量数据和新近故障模式成为多么复杂。

因果一致性定义

为了保持一致性因果关系,以下保证必须满足:

看了你写 读操作反映了它们之前的写操作的结果。
单调读 读操作不返回结果对应于数据的以前的状态比前面的读操作。
单调写 必须先另一个写的写操作与其他写之前执行。
写入后续读 写操作必须在读操作之后执行,写操作必须在读操作之后执行。

为了展示因果保证如何为应用程序提供价值,让我们回顾一个示例,其中没有因果顺序强制执行。在图1中所描绘的分布系统是一个副本集。此副本集具有接受该复制这些写入所有传入的客户端的写操作和两个次级(或跟随)一个主(或前导)。主或次级可服务的客户端读取。

图1:业务流程中的一个副本集而不强迫因果一致性

图1:业务流程中的一个副本集而不强迫因果一致性

  1. 客户端应用程序写入顺序234到主
  2. 主要的响应,它已经成功地应用于写
  3. 订购234从主复制到次级之一
  4. 客户端应用程序读取次要的订单集合
  5. 目标二级服务器没有看到订单234,因此没有响应结果
  6. 顺序234从主复制到其他次级

客户端通过应用程序进行订单。应用程序将订单写入主服务器,并从辅助服务器读取订单。如果读操作的目标是尚未接收复制的写操作的辅助服务器,则应用程序无法读取自己的写操作。为了确保应用程序能够读取自己的写操作,我们必须将单个节点上操作的顺序扩展为系统中所有节点的全局部分顺序。

履行

到目前为止,这篇文章只讨论了副本集。然而,为了建立跨分布式系统的事件的全局局部排序,MongoDB不仅需要考虑复制集,还需要考虑分片集群,其中每个分片都是一个包含一个数据分区的复制集。188金宝搏手机客户端安卓下载

要建立副本集事件和分片集群的全球部分排序,MongoDB中实现了一个基于混合逻辑时钟188金宝搏手机客户端安卓下载兰波特逻辑时钟.当它被施加到初级每一个系统中的变化状态的写入或事件分配的时间。这时候可以在整个部署的所有成员进行比较。在分片群集中的每个参与者,从司机查询路由器数据承载节点,必须跟踪并让自己的最新时间值每则消息中,允许在他们的最新时间观念跨碎片每个节点收敛。初选使用最新的逻辑时间,以新的时代分配给后续写入。这为任何一系列相关操作的因果顺序。节点可以使用的因果顺序等待执行所需的读或写操作之前,确保它后会发生另一个操作。

有关实现群集范围的因果一致性更深的下潜,审查米莎Tyulenev的说话.

让我们重温从图1我们的例子,但现在执行因果一致性:

图2:具有强制因果一致性的副本集的操作流程

图2:具有强制因果一致性的副本集的操作流程

  1. 客户端应用程序写入顺序234到主
  2. 主响应说,它已经在T1时间成功地记录了写入
  3. 订购234从主复制到次级之一
  4. 在辅助时间T1后,客户端应用程序读取
  5. 有针对性的二次未见时间T1,所以必须等待回应
  6. 顺序234从主复制到其他次级
  7. second可以响应订单234的内容

写和读的担忧

写的关心和关注的读取是可以应用到每一个操作,即使是那些中的因果关系一致的操作设置。写关注报价延迟和耐用性之间做出选择。阅读关注的是多一点微妙的;它为交易近因严格的隔离级别。这些设置会影响在系统故障保留的保障

写关注

写的关注,或写确认,指定的写入耐用性要求,即必须返回成功信息给客户端之前,必须满足。写关注的选项有:

1 一旦它已经被应用到主写返回成功
n 一旦它已经被应用到节点的n个写返回成功
多数 一旦它被应用到大多数节点写入成功返回

只有成功的写操作与写入关注多数保证是持久的任何系统故障和永不回滚。

在网络分区,两个节点可以暂时相信他们是初级副本集,但只有真正的原色可以看到,并承诺到大多数节点。与写入关注写1可以成功地应用到任何一个主服务器,而带写关注的写多数只有在真正的初级上才能成功。但是,这种持久性有性能成本。每一个使用写关系的写多数在客户端接收到来自主节点的响应之前,必须等待大多数节点提交。只有这样,线程才会被释放,以执行其他应用程序工作。在Mo188金宝搏手机客户端安卓下载ngoDB中,您可以选择在操作级别上根据需要支付这些费用。

阅读问题

阅读关注读取指定的隔离级别。阅读关注本地返回本地提交,而读取数据的关注多数这已经体现在大多数的回报数据提交快照,每个节点维护。大多数致力于快照包含一直致力于多数节点和数据绝不会在初选的脸回滚。然而,这些读取可以比读的关注往往返回过期数据本地.大多数快照可能缺少尚未被大多数提交的最近写。这种权衡可能会让应用程序对旧数据进行操作。与写关注一样,可以在操作级别选择适当的读关注。

写和读的担忧的影响。

随着因果一致性的推出,我们从事的Jepsen的团队来帮助我们探索如何因果一致性与交互读取和写入的担忧。虽然我们都满意下的读/写关注功能的行为多数在美国,杰普森团队确实在其他排列下发现了一些异常。虽然不太严格的排列可能更适合某些应用程序,但重要的是要了解适用于任何数据库(分布式或非分布式)的准确权衡。

失败方案示例

考虑其中P1已从大多数节点分配和P2被选为新的主网络分区中的读取和写入的担忧不同组合的行为。由于P1还不知道它不再是主要的,它可以继续接受写入。一旦P1重新连接到大多数节点,所有的写操作,因为发散的时间表被回滚。

图3:网络分区时间表

图3:网络分区时间表

在此期间,客户端发出如下操作的因果序列:

  1. 在时间T1执行写W1
  2. 在T2时刻执行读R1

下面四个场景讨论不同的读和写关注点排列及其权衡。

阅读关注广大写多数关注

图4:读关心广大写多数关注

图4:读关心广大写多数关注

与写入关注写W1多数当应用于大多数节点只能成功。这意味着,W1必须对真正的原色的时间表执行,不能被回滚。

因果读R1与读担忧多数等待T1大多数承诺,然后成功返回。因为从大多数节点分区的P1不能推进它的大多数提交点,所以R1只能在真正的主节点的时间线上成功。R1看到W1的最终结果。

当任何故障发生时所有的因果保证维持。所有写写入关注多数防止写入速度较慢的成本在故障情况下意外的行为。对于他们最重要的数据,如在财务应用的订单和交易,开发者可以交易的耐用性和一致性的表现。

阅读关注广大写入关注1

图5:读关心多数与写关心1

图5:读关心多数与写关心1

写W1使用写入关注1可能在P1或P2时间轴上成功,即使P1上成功的W1最终将回滚。

因果读R1与读担忧多数等待T1大多数承诺,然后成功返回。因为从大多数节点分区的P1不能推进它的大多数提交点,所以R1只能在真正的主节点的时间线上成功。R1看到W1的最终结果。在W1 P1上执行的情况下,W1的最终结果可能是写没有犯。如果R1看到的是W1没有犯,那么W1绝不会犯。如果R1看到成功的W1,W1,然后成功提交的P2,绝不会回退。

这种读和写关系的组合提供了因果顺序,但不保证故障发生时的持久性。

考虑一个大型平台,需要迅速地服务其用户群。在大规模的应用需要从低时延的要求管理高吞吐量的流量和收益。当试图跟上负载,在每次请求更长的响应时间是不是一种选择。Twitter的发帖UI是读写关注这个组合一个很好的比喻:

twitter_fire_and_check

灰色显示的未决推文可以被认为是一个关注写的写1.当我们做一个硬刷新,该工作流程可以利用读取关注多数告诉用户后明确是否依然存在与否。阅读关注多数帮助用户安全地恢复。当我们辛苦刷新和后消失,我们可以再试一次,而双张贴的风险。如果我们看到帖子在读的关注硬刷新后多数我们知道有这个职位永远消失没有任何风险。

读关系局部与写关系多数

图6:读当地的关注与写多数关注

图6:读当地的关注与写多数关注

与写入关注写W1多数当应用于大多数节点只能成功。这意味着,W1必须对真正的原色的时间表执行,不能被回滚。

对于读关注本地,因果读上可能会出现R1无论是P1或P2的时间表。异常发生时,在P1 R1在其中执行的大部分承诺写是没有看到,打破了“读你自己写”保证。单调读保证,如果多次读取整个P1和P2的时间表依次执行还不满意。如果发生故障因果保证不会保留。

考虑与不同的产品或服务的评论一个网站,所有的写操作与写入关注执行多数和所有的读取与读取关注执行本地.评论需要大量用户的投资,并且应用程序可能会希望确认他们是在继续之前耐用。想象一下,写一个深思熟虑的两个段落审查,只有把它消失。随着写入关注多数,如果他们成功确认写入是永不丢失。对于读繁重的工作网站,罕见的更大的延迟多数写入可能不会影响性能。对于读关注本地时,客户端读取目标节点的最新检查。但是,目标节点可能是P1,不能保证包含客户端自己的写入操作,这些操作在真实时间轴上已经成功地持久了。此外,节点的最新评审可能包括尚未确认的评审人员的写,这些写可能会被回滚。

阅读关注当地与写入关注1

图7:用写关注点1读取关注点本地

图7:用写关注点1读取关注点本地

读关心的组合本地和写问题1与前一个场景有相同的问题,但是现在写操作缺乏持久性。使用写关注点1的写W1可能在P1或P2时间轴上成功,即使P1上成功的W1最终将回滚。对于读关注本地,因果读上可能会出现R1无论是P1或P2的时间表。异常发生时,W1上P1 P2和R1执行在其中执行的写入的结果是没有看到,打破了“读你自己写”保证。单调读保证,如果多次读取整个P1和P2的时间表依次执行还不满意。如果发生故障因果保证不会保留。

考虑到不处理事件上报数据时可能出现的故障智能设备的传感器网络。这些应用程序可以有颗粒状的传感器数据的驱动器的高写入吞吐量。传感器事件数据的事项的顺序来跟踪随着时间的推移分析数据的趋势。过的时间的一小周期的微视图不是整体趋势分析关键的,因为分组可以下降。与写入关注写作1可能适合在没有严格持久性要求的情况下保持系统吞吐量。对于高吞吐量的工作负载和喜欢近效性的读者,read关注点的组合本地和写问题1提供初级仅操作的所有节点在与上述折衷的系统相同的行为。

结论

任何系统(分布式或非分布式)中的每个操作都会做出一系列影响应用程序行为的权衡。与Jepsen团队的合作促使我们考虑在结合因果一致性时读写关注点的权衡。188金宝搏手机客户端安卓下载MongoDB现在建议使用两个read concern多数和写问题多数维护因果担保和耐用性在所有的故障情况。然而,其他的组合,尤其是阅读关注多数和写问题1,可能适用于某些应用程序。

为开发人员提供一系列的读和写问题,使他们能够精确地调优工作负载的一致性、持久性和性能。我们与Jepsen的合作帮助我们更好地描述不同故障场景下的系统行为,使开发人员能够对他们可用的保证和权衡做出更明智的选择。