在DynamoDB或Riak中,单客户端写入是否强烈有序?

时间:2013-12-09 00:46:30

标签: amazon-dynamodb riak eventual-consistency

我有一个客户端按顺序执行以下两个操作:

  1. 使用键“ABC123”创建一个新项目。
  2. 更新项目“newestKey”以包含值“ABC123”。
  3. 与此同时,第二个客户正在运行以下程序:

    1. 阅读“newestKey”项目以获取最新项目的密钥K.
    2. 阅读项目K。
    3. 第二个客户端是否可以将“ABC123”作为“newestKey”,但在尝试加载项目“ABC123”时会收到未找到的错误,因为该项尚未通过数据库传播?< / p>

      换句话说,是否保证如果一个客户端对数据库进行两次写操作,那么没有客户端会看到第二次写入,除非它也看到第一次写入?

1 个答案:

答案 0 :(得分:2)

DynamoDB,尽管它的名字,并不是基于激发Riak的Dynamo白皮书,所以我不能谈论这部分问题。

使用Riak,由于可用性优先于一致性,因此保证相对较少。由于网络分区发生,客户端总是有可能读取包含密钥“ABC123”的对象(让我们称之为“INDEX123”),但可能无法访问具有“ABC123”的服务器。键/值对。

撇开网络严重受损或服务器出现故障的情况,如果满足以下条件,那么我无法想到客户端可以从“INDEX123”读取密钥“ABC123”的情况找到键/值对“ABC123”:

  • “ABC123”表示的键/值对是新的(而不是对具有相同键的旧对象的更新)
  • 所有操作(例如W,R和DW)的请求参数的默认值为2(假设N = 3)
  • 您描述的两项操作都是成功的

鉴于这些条件,下面是一个示例,说明服务器故障如何阻止客户端能够找到新的键/值对“ABC123”,但只是暂时的。

  1. 键/值对“ABC123”仅成功写入应该存在的2个主服务器。第3台服务器接收并确认写入,但由于磁盘故障或其他暂时性故障,它不会将值写入永久存储器
  2. 包含密钥/值对的2台服务器中的1台
  3. 客户端请求密钥/值对,并且响应请求的第一个服务器是最初未能写入该对的服务器以及承担在步骤#2中失败的服务器角色的故障转移服务器< / LI>

    此时,客户端将被告知不存在此类数据项 Riak在收到来自具有副本的服务器的密钥/值对后,将其推送到没有的服务器,以及任何未来的客户端请求都会找到它。

    此修复操作称为“读取修复”。 Riak还有一个主动的反熵机制,主动识别丢失/不一致的数据项并进行修复。