Amazon dynamodb 分布式最终一致性键值存储

Amazon dynamodb 分布式最终一致性键值存储,amazon-dynamodb,distributed-system,key-value-store,eventual-consistency,Amazon Dynamodb,Distributed System,Key Value Store,Eventual Consistency,我发现很难说服自己使用像DynamoDB这样的复杂设计比简单的复制策略更具优势 假设我们想在5台服务器上构建一个分布式密钥/值数据存储。(每个服务器都有完全相同的duplica) 最终一致性系统,如DynamoDB,通常使用复杂的冲突协调、向量时间戳等来实现最终一致性 但是,为什么我们不能简单地做到以下几点: 对于write,客户端将向所有服务器发出write命令。因此,所有服务器都将以相同的顺序执行客户端的write命令。它将在服务器提交写操作之前回复客户端 对于读取,客户端只需执行循环,一次

我发现很难说服自己使用像DynamoDB这样的复杂设计比简单的复制策略更具优势

假设我们想在5台服务器上构建一个分布式密钥/值数据存储。(每个服务器都有完全相同的duplica)

最终一致性系统,如DynamoDB,通常使用复杂的冲突协调、向量时间戳等来实现最终一致性

但是,为什么我们不能简单地做到以下几点:

  • 对于write,客户端将向所有服务器发出write命令。因此,所有服务器都将以相同的顺序执行客户端的write命令。它将在服务器提交写操作之前回复客户端
  • 对于读取,客户端只需执行循环,一次只有一台服务器负责读取命令。(其他服务器将看不到read命令) 是的,客户端可能会遇到暂时的过时数据,但最终所有副本都将具有相同的数据集,这与DynamoDB的语义相同

  • 与复杂的DynamoDB相比,这种简单设计的缺点是什么?

    您的策略有一些缺点,但它们的确切性质取决于您未涉及的细节

    一个明显的例子是处理网络分割。也就是说,当网络的一部分与另一部分断开连接时

    在这种情况下,当您尝试向服务器写入一些数据时,您有两种选择,即如何作出反应,但都失败了。你可能只是假设它起作用了,然后继续,好像一切都很好。如果您这样做,服务器稍后会重新联机,则读取可能会返回过时的数据

    为了防止这种情况,您可以将失败的写入视为真正的失败,并拒绝接受写入,直到/除非所有服务器都确认写入。不幸的是,这使得系统作为一个整体非常脆弱——事实上,与根本不进行复制相比(因为如果任何服务器离线,您就不能再写了),系统更脆弱(至少在写方面)。它还有一个问题:它将写吞吐量限制在最慢服务器的(当前)速度,因此即使它们都在工作,除非它们完全平衡(不太可能发生),否则就是在浪费容量

    为了防止这些问题,许多系统(包括Paxos,如果内存可用的话)使用某种基于“投票”的系统。也就是说,您尝试写入所有服务器。当大多数服务器确认它们已经收到写入时,您就可以考虑写完整性。同样,在读取过程中,您尝试从所有服务器读取,并且考虑到只有当大多数服务器一致同意值时,才考虑正确读取值。

    通过这种方式,在任何给定时间,最多不到一半的服务器可以脱机,并且您仍然可以读取和写入数据。同样,如果您有一些服务器的响应速度比其他服务器稍慢,则不会降低总体操作速度


    当然,要创建一个工作系统,您需要填写很多细节——但事实上,基本概念非常简单,如上所述。

    嘿,谢谢您的回复!是的,这种简单的设计不像paxos/raft那样提供序列化。它为用户提供了最终的一致性。是,用户可以临时读取过时数据。但最终所有副本都将具有相同的数据集。我想我需要我需要重新措辞我的问题。我应该将其与DynamoDB这样的系统进行比较,后者最终也是一致性键/值存储。但是DynamoDB涉及非常复杂的冲突、向量时间戳等。与我的简单设计相比,它有什么优势?