プロジェクトの1つにDynamodbを使用する試みでは、dynamodbの強力な一貫性モデルに関して疑問があります。よくある質問から
強力な一貫性のある読み取り—最終的な一貫性に加えて、Amazon DynamoDBは、アプリケーションまたはアプリケーションの要素が必要とする場合に、強力な一貫性のある読み取りを要求する柔軟性と制御も提供します。強い整合性のある読み取りは、読み取りの前に成功した応答を受信したすべての書き込みを反映した結果を返します。
上記の定義から、強い一貫性のある読み取りは最新の書き込み値を返すということです。
例:Client1がキーK1に書き込みコマンドを発行して、値をV0からV1に更新するとします。数ミリ秒後、Client2はキーK1の読み取りコマンドを発行し、一貫性が強い場合は常にV1が返されますが、最終的な一貫性がある場合はV1またはV0が返されます。私の理解は正しいですか?
ある場合、書き込み操作が成功を返したが、データがすべてのレプリカに更新されず、強い整合性のある読み取りを発行した場合、この場合に最新の書き込み値を返す方法は?
次のリンク AWS DynamoDBは書き込み後の一貫性を読み取ります-理論的にはどのように動作しますか? この背後にあるアーキテクチャを説明しようとしますが、これが実際に動作するかどうかわかりませんか?このリンクを通過した後に私の頭に浮かぶ次の質問は、DynamoDbはシングルマスター、マルチスレーブアーキテクチャに基づいていますか?.
簡単な答え:強い一貫性のあるモードで正常に書き込むには、レコードを含むことができる大多数のサーバーで書き込みが成功する必要があります。したがって、一貫性のある読み取りでは、目的のレコードが含まれています。強い整合性のある読み取りを実行しない場合、システムはランダムサーバーにレコードを要求し、データが最新ではない可能性があります。
3台のサーバーを想像してください。サーバー1、サーバー2、およびサーバー3。強い整合性のあるレコードを書き込むには、少なくとも2つのサーバーを選択し、データを書き込みます。 1と2を選択しましょう。
ここで、データを一貫して読み取る必要があります。大部分のサーバーを選択します。 2と3を選んだとしましょう。
サーバー2には新しいデータがあり、これがシステムから返されます。
最終的に一貫した読み取りは、サーバー1、2、または3から行われる可能性があります。つまり、サーバー3がランダムに選択された場合、複製が発生するまで新しい書き込みは表示されません。
1台のサーバーで障害が発生してもデータは安全ですが、3台のうち2台のサーバーで障害が発生すると、オフラインサーバーが復元されるまで新しい書き込みが失われる可能性があります。
詳細説明:DynamoDB(AmazonがリリースしたDynamoの論文に記載されているデータベースに類似していると仮定)は、データが多数に拡散するリングトポロジを使用しますサーバー。関連するすべてのサーバーを直接照会し、それらから現在のデータを取得するため、強力な一貫性が保証されます。リングにはマスターがなく、リングにはスレーブがありません。特定のレコードは、リング内の多数の同一ホストにマップされ、それらのすべてのサーバーにはそのレコードが含まれます。遅れる可能性のあるスレーブは存在せず、失敗する可能性のあるマスターは存在しません。
このトピックに関する多くの論文を自由に読んでください。 Apache Cassandraと呼ばれる同様のデータベースは、リング複製も使用します。
http://www.read.seas.harvard.edu/~kohler/class/cs239-w08/decandia07dynamo.pdf
あなたの質問に対する答えはここにあります: http://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/APISummary.html
強い整合性のある読み取りリクエストを発行すると、Amazon DynamoDBは、最新のデータを含む応答を返します。これには、Amazon DynamoDBが成功した応答を返した関連するすべての書き込み操作による更新が反映されます。
あなたの例では、updateItem
がv0
からv1
が成功した場合、後続の強い整合性のある読み取り要求はv1
。
お役に立てれば。
免責事項:以下は、DynamoDBの公開ドキュメントに基づいて検証することはできませんが、おそらく真実に非常に近いものです
理論から始めて、DynamoDBは quorums を使用します。Vはレプリカノードの総数、Vr
は読み取り操作が要求するレプリカノードの数、Vwは各書き込みが実行されるレプリカノード。読み取りクォーラム(Vr
)は、クライアントが最新の値を取得していることを確認するために活用でき、書き込みクォーラム(Vw
)は、書き込みが競合を引き起こさないことを確認するために活用できます。
DynamoDBには書き込みの競合がないという事実に基づき(これらはクライアントから調整する必要があるため、APIで公開されるため)、DynamoDBは2番目の法則を尊重するVwを使用していると結論付けます(Vw > V/2
)、おそらくただV/2+1
書き込みレイテンシを削減します。
読み取りクォーラムに関して、DynamoDBは2種類の読み取りを提供します。強い整合性のある読み取りでは、最初の法則(Vr + Vw > V
)、おそらくただV/2
仮定する場合V/2+1
前と同じように書き込みます。ただし、最終的に一貫した読み取りで使用できるランダムレプリカは1つだけですVr = 1
。したがって、はるかに高速ですが、一貫性に関する保証はゼロです。
注:使用される書き込みクォーラムが第2の法則を無視する可能性があります(Vw > V/2
)、ただし、DynamoDBは、クライアントからの調整なしで、このような競合を自動的に解決することを意味します(現地時間に基づいて最新の競合を選択するなど)。しかし、DynamoDBのドキュメントにはそのような参照がないため、これが本当であるとは考えにくいと思います。その場合でも、残りの推論は同じままです。