希望了解更多有关Fivetran的信息?加入我们的现场周刊演示。保存您的位置 -我们emea.

跳过主要内容

数据库解密第八章-分布式数据库第三部分

下面这篇博文是由迈克尔Kaminsky在数据库中。你可以阅读第七章如果您错过了关于分布式数据库的第二课,或者观看完整系列

共识是对真理的广泛一致。在分布式数据库环境下,即使通信通道出现故障,也需要每个节点之间达成一致才能达成一致。我们必须确保节点同意事实,这样它们就不会向查询提供不一致的结果。

这很棘手,因为分布式数据库出错的方式有很多种。从缓慢的网络连接到个别节点退出服务,我们的分布式数据库需要一种方法让整个系统同意正确的值。

这两个将军问题

在我们更详细地讨论共识之前,考虑一下我在计算机科学中最喜欢的思想实验之一:两个将军问题。它说明了当沟通渠道有问题时,协调双方达成协议是多么困难。

假设我们在一支努力击败对立一般的团队上有两个将军。罗马的Scipio和Marcus正在努力击败迦太基的哈尼尔。汉尼拔的军队足够大,可以分别击败Scipio或Marcus,但他们都不会在一起。

为了获胜,Marcus和Scipio必须同时攻击。如果要么单独攻击,他们将失败。战斗地图布局的方式,Scipio和Marcus都在山谷的对面,汉尼拔有他的营地。

皱纹是Scipio和Marcus沟通的唯一方法是通过寄射信使通过栖息地涌入的山谷。我们知道一些使者不会成功。Hannibal正在寻找信使的观念,可能会抓住一些。

马库斯和西庇阿必须就何时进攻达成一致。如果他们同时进攻成功,他们就会胜利返回罗马。如果他们不能在不同时间协调进攻,就会被汉尼拔的大象踩死。

我们可以设计一种算法,使得Marcus和Scipio保证同时攻击吗?本能解决了许多人提出的是让将军在他们收到消息时发送“确认消息”:

  1. 马库斯派出了一个拟议的攻击时间

  2. Scipio回复了,“收到的消息,让我们今晚攻击”

但是,如果确认消息截获,此过程会失败。Scipio会攻击,但马库斯不会。Scipio同意攻击时机,但由于马库斯从未收到确认,他不会攻击。罗马人输了。

如果我们有另一个确认层怎么办?

  1. 马库斯派出了一个拟议的攻击时间

  2. Scipio回复了,“收到的消息,让我们今晚攻击”

  3. 马库斯回复,“收到了你的确认”

我们可以继续添加图层广告信息,但我们仍然存在同样的问题。发送消息的最后一般,如果他的确认消息实际上没有知道,则不知道。

事实上,没有解决方案对此问题。马库斯和Scipio没有办法安排时间攻击他们肯定会在同一时间同意的地方。这两个将军问题教导我们有情况,如果通信渠道出现故障,则无法达到完美的共识。

分布式数据库中的共识

如果我们重新审视我们的分布式数据库上下文,我们可以将两个将军比较在我们的数据库中尝试达成共识的两个节点。通过汉尼拔阵营的信使是沿着不可靠的网络旅行的节点之间的消息。由于网络中断或由于拥挤的网络流量而无限期地延迟,它们可以被丢弃。这两个节点无法确定他们达到了协议,因为它们不能正为另一个节点实际接收到已发送的最后一条消息。

当我们遇到以下情况时,共识通常是一个问题:

  1. 多个节点同时运行

  2. 节点间网络连接不可靠

一般来说,我们在高可用性框架的背景下讨论共识,其中我们在不同节点上有多个相同数据的多个副本,我们需要所有节点以同意真实值应遵循一系列操作。

为什么不选择最近的价值?

为什么不使用时间戳来跨节点识别最近的值,并使用最近的值呢?

这不起作用的最大原因是我们实际上无法信任不同节点上的时间戳。时钟不会在不同节点上同步完全相同,因此我们不能相信在不同节点上的时间戳匹配。即使时钟只有几微秒,可能会破坏我们只是使用时间戳的策略。

此外,节点之间的网络速度可能会有所不同,因此我们不一定确定以一个序列发送的事件,然后b,将以相同的顺序到达所有节点。某些节点实际上可能会收到b然后a。

我们争取对应用于数据库的操作的顺序,而不是时钟时间(例如,5下午36分钟和29.74秒)。如果我们的节点可以同意所应用的操作的正确顺序,则应与所有相同值同步。

实现这一点的一个关键策略是让单个节点“选出”一个领导节点,负责协调操作日志,并向所有其他节点传达“真相”。所以leader节点将决定日志,然后告诉所有不同的follower节点正确的顺序应该是什么。

但接下来的问题是:节点如何就哪个是领导者达成共识?这些节点如何计算出哪个是leader并负责这一个真对数呢?请记住,节点,甚至是leader节点,在任何时候都可能发生故障或失去联系,所以这是一个随时可能发生的问题!

筏子和Paxos

在实践中,目前有两种广泛使用的主要共识算法:Raft和Paxos。这些算法是出了名的复杂和具有挑战性的正确实现-我们不打算讨论这些算法的细节(尽管如果你感兴趣,我绝对鼓励你在网上查找它们是如何工作的)。最重要的是,它们都涉及到多轮投票,以使节点在一个商定的真理上对齐。

您可能有一个节点提出价值,其他节点同意或不同意,并且通过多轮投票集群作为整体可以达成协议应该是什么。此投票程序具有我们希望在我们的分布式数据库中的真正优点。

简明的共识

从本课中带走的重要事项是:

  1. 共识是分布式数据库中的节点对真相一致的过程。

  2. “两将军问题”说明了在有缺陷的通信系统下,不可能实现完美的协调。

  3. RAFT和PAXOS是在分布式数据库中达成共识的两个非常重要的算法。

分布式数据库功能强大,但也带来了与协调相关的严峻挑战。随着基于云的服务和计算的持续发展,您可能只会越来越多地听到分布式数据库。希望这篇入门文章已经让你对这个主题有了一个像样的工作知识!

本系列继续到第九章这里