Martin
by Martin Kysel

为什么是领导者AIN't主副本

作为分布式,符合酸的数据库,我们会对Nuodb如何工作以及与更知名的架构进行比较有很多问题。特别是,人们希望了解Nuodb如何与主要的:主要架构以及(相关)我们如何处理锁管理。这篇文章将讨论两者。我们还将在共享 - 无线架构时讨论,并且当需要协调冲突的决策时。

在这个博客文章中,我们将讨论领导力的概念,诺德布对分布式协调的答案。我们将证明领导力既是一贯的,也是有弹性的。但在我们进入细节之前,让我们探索Nuodb架构的基础知识。

魔鬼在原子里

要了解董事长在诺福德的作用,我们必须首先潜入数据库的构建块。在引擎盖下,NOODB将数据库分成名为“原子”的小块。每个原子代表整个数据的相对较小的部分(64K)。这可能是表中的一系列行,一个唯一的序列或唯一索引的一部分。

原子是自我复制的,可以在数据库的多个节点中同时存在。为了保持一致性,需要某种形式的锁管理和控制。

NOODB还允许 数据分区 (或分片)每个节点访问所有原子的单独子集。众所周知,分析数据右是自己的艺术形式。当多个节点需要访问相同的数据时会发生什么 跨越多个存储组?我们如何处理一些这些访问写的情况?

并非所有操作都需要协调

由于所有节点都可以主动为读写的客户端请求提供服务,因为系统更类似于主:主要复制,而不是主:副本。主要:小学 复制无需协调 是最终一致的系统的域,并且具有许多不适用于酸数据库的策略(例如上写入胜利,推动冲突用户),并因此不适用于Nuodb。

领导力与MVCC的逻辑紧密相连。在阅读之前,我会敦促读者熟悉这个概念。看看这个系列 解释MVCC..

使用MVCC,每个节点可以读取数据而不需要跨节点或锁定协调。根据MVCC的定义,交易 快照隔离 无法看到交易开始后引入的修改。因此,在事务开始后对另一个节点进行的更改不会影响当前节点上该数据的读取。对于非冲突写入,相同的是,例如插入到一个没有唯一索引的表中。到目前为止这么好,无需与任何地方的领导地位协调。

分布式协调是在领导者上完成的

如果需要分布式协调,则会发生真正的挑战。在这篇文章中,我们专注于插入桌子中 unique index但是,还有许多需要协调的其他决定。每次事务都尝试将数据插入唯一索引时,首先插入占位符。占位符尚未读取,但阻止插入重复条目。对这种阻塞动作的请求转到相应数据片段的领导者(主要)。如果没有冲突,请求交易现在已成功插入占位符。所有想要插入相同数据的其他事务都需要从同一领导者进行确认继续。由于占位符已经存在,因此不会批准这样的确认。一旦事务承诺,占位符将变为一行,并对其他事务变为可见。

在任何特定的时刻,每个原子只有一个跨系统的领导者,或者系统正在积极选择新的领导者。我们要策划,讨论领导者如何在未来当选后,却广泛地说,它涉及到对于Atom的所有节点的数据访问模式。领导者将居住在一个服务原子的交易引擎之一。

详细领导的用例

让我们深入挖掘领导者如何做出决策以及决策如何生存失败。在此示例中,客户端连接到事务引擎1(TE1)并执行以下SQL语句:

SQL> insert into table_A values (5);

该表定义为:

SQL> create table table_A(i int unique);


[图1:在系统上加载的原子]

图1,有三个事务引擎(标记为TE1-3),每个事务有不同的原子子。为简单起见,假设每个Atom表示唯一索引中的100个元素的范围。 Atom 1的领导者标有金色圆圈。为了避免在该图中困惑,我们没有显示哪个原子是其他原子的领导者。您可能会注意到没有Atom 2.如果最近尚未访问Atom 2中的数据,则最终会收集垃圾。

让我们检查一个场景,其中在不同的引擎上运行的两个事务尝试插入同一行(图2)。在事务引擎1(TE1)上运行的事务正在尝试插入值5.由于值5位于原子1的0-100范围内,因此插入件将瞄准原子。 Atom 1的领导者是TE2。 TE1和TE3也有atom 1在内存中加载,但它们不是领导者。它们可以在本地解决许多决策,但插入唯一的索引不是其中之一。要使插入全球协调,TE1必须联系TE2。在一个简单的例子中,插入件不与任何先前的插入(可见或不可见)和TE2授予请求的冲突。该决定是向服务原子服务的所有引擎播放。

同时,TE3正试图插入相同的记录,但请求到达TE2迟到,它失去了唯一性比赛。领导者TE2拒绝请求并让TE3知道。

[图2:插入突出的情况下,消息流]

一旦TE1到达TE3,它就不再需要联系领导者。它知道占位符在飞行中,它可以解决当地的未来冲突。这个例子 图2 结论正在致力于交易。

在失败的情况下,领导力决定是一致的

一位精明的技术读者可能会问自己“那是好的,但如果TE2失败会发生什么?”让我们探索领导失败的工作原理。

[图3:主席失败的消息流]

在确认请求之前,领导者不需要达成共识或从其他节点获得批准。该决定可以纯粹基于发动机的本地状态。由于一次只能有一个领导者,在领导者不了解的飞行中,在飞行中没有相互矛盾的决定。

一旦领导者在本地决定是否接受或拒绝请求,它将向服务原子提供的每个节点播放决定。可靠的广播协议保证,在领导者失败的情况下,该消息使其成为每个其他节点,因此到下一个领导者。保证是每个消息都不知道没有人或每个人。请求TE1和领导者TE2同时死亡,并且消息永远不会由任何其他节点接收。由于没有人知道这个决定,就好像它永远不会发生。一旦rebborcoadcast完成,所有节点都会了解所有以前的决定和新的领导者。使用Nuodb可靠的广播协议是更复杂的共识协议。您可以看到序列图 图3..

领导力允许细粒度的负荷分布

作为领导者不是稳定的状态。主席不与原子无关。

请记住,原子相对较小,并且我们假设并非所有交易引擎都具有在内存中加载的所有原子。一旦原子不使用一段时间,或者如果事务引擎靠近其定义的内存限制,则它将是从内存收集的垃圾。如果没有atom,没有领导者。 NOODB领导运算最佳,如果TES的ATOM访问模式是可变的,因此,共享重叠尽可能小。由于所有原子都有他们的领导者,这些独立决策者的数量相对较大。重要的是要强调,并非所有主席都驻留在同一个发动机上,而是在整个系统中传播。这导致系统中的重要性能权衡,其中包含给定原子的领导者的引擎将对Atom的Lock Manager提供本地访问,使其更快地访问锁定决策。其他同行将进入锁定决策较慢。

虽然Rebroadcast和Leader选举正在运行,但无法做出决定。其他原子的决定仍然可以被驻留在其他引擎主席进行,但凌动1对一段时间内花费要选出新的领导者没有意义的权威。所有交易试图将数据插入片段,将阻塞,直到一个新的领导人当选。

结论

NOODB以两种方式在整个系统中分配唯一性管理:

  1. 管理唯一性信息和协调插入请求的责任分布在系统中的多个节点之间。这避免了在所有管理发生的系统中放置一个热点。
  2. 分布式唯一性管理是故障宽容,提高系统可用性。具有集中管理的概念的系统也可以通过复制管理器来实现这一目标,但Nuodb不需要复制特殊专用系统资源,简化系统管理。

---

马丁凯尔斯Martin自2015年以来一直是Nuodb的一部分,Scrum Master和Tech Lead。他对平台和SQL之间的交叉路口的工作使他不仅可以了解Nuodb的战略差异化,而且还为已建立的球员的共同性了解。马丁对技术充满热情,通过谈判,文章和聚会分享他的知识。他10多年的经验涵盖了从DB /网络管理到高性能分布式软件工程的各种角色。