NuoDB
by NuoDB

MVCC.第4部分:分布式MVCC

问候哦 - 所以持久的芸尼人!您忠实的一致性书呆子在这里继续讨论MVCC。背景技术请检查 part 1 (其中我们的英雄被引入MVCC), part 2 (其中我们的英雄目击者例子)或 part 3 (我们的英雄暴露在香草MVCC的微妙之处)。故事本章将向您介绍MVCC,特别是Nuodb味道。

问题分布式MVCC正在解决

Nuodb是分布式酸数据库。我们认识到,应用程序更容易编写事务,而不是所有事务都是相等的。与任何好的数据库一样,我们允许用户告诉我们他们想要的一致一致性,我们需要相应行动。 Nuodb使用MVCC处理并发读取和写入共享数据,并且之前的帖子已经过广泛的行程所需的内容。但是,在分布式系统中,我们可以在各个单独的澳门比分网址每个都希望同时更新相同的记录的情况。

“经典”数据库被设计为单服务器解决方案,其中并发呈现出本地线程的形式。几十年来完成了很多工作来构建可以解决线程之间更新冲突的系统。一般而言,涉及“经理”的方法是我将用于任何集中同步对象的术语,这些对象是必须一致的请求的主要结算所。对于熟悉磨机线程编程的读者,经理通常通常是一些基于锁的基于锁的对象,它将向记录版本传递给请求线程的“授予”。这意味着如果多个线程尝试同时添加新的记录版本',则管理器将确定谁获取谁(如果有人需要失败)。这对于单澳门比分网址系统来说非常精细,并且优化本地内存并发数据结构是一种任务,可以保持工程师占用的工程师的任务。

分布式系统在高级别的抽象中,只是大规模的并发系统。代替函数调用和原子锁,分布式系统使用消息和消息处理。当您想要快速制作事物时,相似性开始分解。该网络是比本地存储器慢的数量级,并且即使在Retooled用于分布式操作时,也可以在本地存储器中运行Jim-Dandy的设计在从并发程序员转换到分布式程序员时,我学到的第一课之一是集中式管理器型系统是分布式系统中的一个坏主意。原因很简单,集中控制可能需要阻塞,这可以基本上停止所有澳门比分网址一次。还有可靠性问题,即:如果作为“经理”死亡的澳门比分网址运行,你会怎么做?因此,集中的控制点可能导致在第一位置失败使用分布式系统的原因(例如性能和可靠性)。 “好吧,拍摄”你们中的一些人可能会说,“如果我们不能只是分发基于旧的经理的方法,我们将如何摆动分布式MVCC数据库?”

分布式工程师的工具包中有一些工具可供我们使用。第一个技巧是我们从原子中建立一切(细粒度分区)。桌子本身实际上是一个原子的星系。每个原子是一个小型独立的分布式对象。随着桌子的增长,它通过添加更多原子而不是无限期地膨胀原子。因为原子是独立的,我们可以利用另一个技巧(异步消息传递)来重叠和管道处理,其中消息传递以隐藏尽可能多的消息处理延迟。这些是有用的技巧,有助于保持原子处理瘦和快速。然而,真正的加速在于更普遍地应用Asynchrony。

系统工程中的历史悠久的拖车是“快速制作常见案例”。通常,任何边缘精心设计的应用程序都不会在同一记录上敲击每个澳门比分网址上的每个线程。因此,大多数数据库假设记录更新的常见情况是禁止冲突或低冲突。 NOODB进行了类似的假设。因此,我们不愿意等待来自“经理澳门比分网址”的消息以便处理更新。因此,每个澳门比分网址都假定它有权使用它假设的是最新版本的新版本,然后向前推进。当然,冲突确实发生,我们需要能够检测到它们并与他们处理。

主席和纪录元数据 

考虑一个具有3个澳门比分网址的数据库(1,2和3)。所有这些都同意行42的最新版本为5.澳门比分网址2和3具有连接到尝试更新行42的客户端的客户端。最简单的方法是具有澳门比分网址2确认允许之前更新行42继续。但是如果澳门比分网址2必须在允许更新之前与所有对等体聊天,那么随着每行都需要各种电路聊天,更新将令人难以置信的速度。在假设的常见情况下,这种放缓在普通差别中是倍增的,其中大多数更新根本不会冲突。因此,显然在更新之前对每一行进行分布式协调。 Nuodb并不慢,因此诺福德并不是这样。 Nuodb所做的是澳门比分网址2和澳门比分网址3都认为它们可以在本地安装新版本,如果它实际上没有正常,则某些情况会将其调用它。

在上面的示例中,澳门比分网址2和3都将独立批准它们各自的客户端更新,暂时给予它们版本6然后提前3月。当然,现在我们有一个未被发现和未解决的冲突。澳门比分网址2认为第42行,版本6是A,澳门比分网址3认为它是B。这项工作怎么样?如何检测冲突,然后处理?系统由于MVCC的魔力而工作。因为更新是未提交的交易的一部分,所以它们对其他人不可见。因此,MVCC限制了一个行的冲突检测和分辨率的范围,以确切地完成正在更新该行的活动事务集。

问题不是澳门比分网址2的更新是“坏”,或者澳门比分网址3的更新是“坏”。问题是,两种变化都不能同时在飞行中。因此,我们需要一些检测这种冲突的方法。在NOODB中,没有额外的特殊澳门比分网址,负责数据库领导。没有领导者/ Mongo澳门比分网址。但是,当我们有这样的情况时,我们需要某种仲裁。幸运的是,Nuodb有一个分布式的轻量级Psiedo-Indership,我们可以捎带。在诺博德,每个atom都有一个“董事长”。可以处理这些仲裁情况的澳门比分网址。每个同行都知道主席是谁,即使在澳门比分网址故障的波浪中也是如此。许多聪明的逻辑已经致力于使主席和主席更改无线消息,因此没有选举过程或类似的按需共识聚集担心。在该示例中,这意味着澳门比分网址1,2或3中的一个是包含行42的记录元数据的原子的主席。因为主席可能无法在突出事务集合中执行事务,所以我们需要确保主席仍然发现录制更新。当然,我们必须这样做,以保持每个人都一致。因此,我们只需要确保在提交之前播放更新更改,以便主席拥有它需要打破任何关系的一切。此广播介绍的进程具有额外的好处,该额外的好处是在常见的情况下,没有冲突,所有更改都将在甚至调用提交之前在数据库周围复制(这导致更快的复制和提交)。

主席以简单的方式打破了关系。当两个澳门比分网址同时尝试更新同一行时,主席将授予更新通知首先到达主席的澳门比分网址的更新。在该示例中,假设澳门比分网址1是主席。澳门比分网址2和澳门比分网址3都广播其更新更改。假设澳门比分网址3的消息首先到达。因此,澳门比分网址1将安装澳门比分网址3的记录版本,现在规范记录元数据原子将注意到第42行,版本6是'b',并且由澳门比分网址3上的事务所属.Node 2的消息显示时,检测到冲突,并且将故障响应发送到澳门比分网址2.如下所示。在下面的示例中,我们假设澳门比分网址2和澳门比分网址3的事务都是更新多行,因此即使尚未被主席官员官方求解的一些更新尚未正式认可,则会进行本地行更新。

多边形冲突

该系统现在使我们能够懒洋洋地和异步地进行分布式冲突检测。唯一的时间澳门比分网址2或澳门比分网址3必须阻止等待响应是如果达到了提交点并且系统必须确定更新操作的最终状态(例如,事务正在提交)。因为SQL的更新是固有的批量更新,所以这意味着多个更新的延迟都可以重叠并有效地消除(或大大减少)。牢记的另一件事是Nuodb澳门比分网址是持续的垃圾收集废弃原子,因此即使数据库本身可以由100个澳门比分网址组成,只有针对有问题的行执行的澳门比分网址的精确子集必须参与任何冲突检测决定。

我们现在是分布式MVCC的3个步骤中的2个步骤中的2个步骤。我们知道,使用普通的MVCC语义意味着我们不必在待变更方面进行任何花哨的协调。我们还知道如何利用主席概念,在不同澳门比分网址的冲突更新之间进行一些绑定。我们现在留下了最后一个问题:'一旦检测到,我们如何解决冲突?“这更复杂,不是因为这个问题的答案取决于客户端正在寻找的语义。例如,SQL允许客户端设置“隔离级别”。这基本上是一个旋钮,用于交易绩效的一致性。每个隔离级别可能具有完全不同的语义来支持。因此,我们实际上需要一个元解决问题。我们需要一个系统,该系统将允许我们根据客户端请求的语义来处理不同的更新冲突。从宇宙中有一个明显的3套:

  1. 立即失败(例如,冲突,中止交易)
  2. 块直到已知冲突的交易的最终状态,然后反对该状态
  3.  Something special

在1和2之间的选择类似于所需的选择,需要对非分布式MVCC进行,并且当前基于Nuodb中的隔离级别选择。选择第3号是一个警告的一点,但它基本上是指将允许系统检测到可以“遍布”的冲突,然后在其工作中的冲突。 Nuodb为几种情况进行了解决,其中冲突可以固定在事实上。例如,如果澳门比分网址3将竞争更新到第6版本6,则有些情况可以改变澳门比分网址2更新以更新到版本7的情况。在这些情况下,Nuodb确定了事务语义将允许我们有效地执行澳门比分网址3在澳门比分网址2的事务之前发生澳门比分网址3的事务。正确,有效地需要一些花哨的簿记。例如,现在澳门比分网址2的交易发生在澳门比分网址3之后,如果澳门比分网址3中的事务中止并回滚,则会发生什么?当然,这取决于澳门比分网址2的交易的隔离级别以及澳门比分网址2的交易使用/读取现在正在回滚的任何状态。通过更加乐观的更新,Nuodb避免了否则可以干净地提交的事务。

看一眼 Part 1Part 2, 和 Part 3 在这个MVCC系列中,以及我们的两部分系列 MVCC.中的隔离级别:第1部分 & Part 2.