1

Dynamo paperのセクション 5には、次の内容があります。

特に、各書き込みは通常、読み取り操作の後に続くため、書き込みのコーディネーターは、要求のコンテキスト情報に格納されている前の読み取り操作に最も速く応答したノードになるように選択されます。この最適化により、前の読み取り操作によって読み取られたデータを持つノードを選択できるため、「読み取り後書き込み」の一貫性が得られる可能性が高くなります。

「read-your-writes」の一貫性を得る可能性はどのように増加しますか?

「read-your-writes」とは、書き込みに続く読み取りが、書き込みによって設定された値を取得することを意味します。このコンテキストでは、読み取りと書き込みが 2 つの異なるクライアントによって実行されます。その理由は、書き込みコーディネーターの選択が、同じクライアントによる「read-your-writes」を取得する可能性に影響を与えないためです。

しかし、上記のテキストは、読み取りに続く書き込みについて語っています。これが私の推測です。可能であれば、読み取りコーディネーターは構文の調整を試みます。バージョンが異なるために構文の調整が不可能な場合、クライアントは書き込みを行う前に意味の調整を行う必要があります。どちらの方法でも、読み取り操作に関係するすべてのノードのバージョンは、調整されたバージョンの祖先です。したがって、次の書き込みをそれらのいずれかに送信して適用できます。書き込みが読み取りによって認識される最も早い時期は、次の手順が完了した後です。

  • クライアントは書き込みコーディネーターに連絡します。
  • 書き込みコーディネーターは、新しいバージョンのバージョン クロックを生成します。
  • 書き込みコーディネーターは、新しいバージョンをローカルに書き込みます。

上記の手順を実行する時間が短いほど、次の別の読み取りで新しいバージョンが表示される可能性が高くなります。以前の読み取りに最も速く応答したノードが、次の手順をより短い時間で実行できる可能性が非常に高いためです。このようなノードは、書き込みコーディネーターとして選択されます。

4

2 に答える 2

1

Dynamo の論文を読み直しました。「read-your-write」の一貫性について新たに理解しました。「read-your-writes」には、1 つのクライアントのみが含まれます。同じキーで 1 つのクライアントによって実行される次の要求をイメージします。

  1. 読み取り-1
  2. 書き込み-1
  3. 読み取り-2

「read-your-writes」は、read-2 が write-1 を見ることを意味します。書き込みコーディネーターは、write-1 を持つ可能性が最も高くなります。「read-your-writes」を保証するために、書き込みコーディネーターが read-2 に最速で応答することが望まれます。ノードが read-1 に最速で応答し、read-2 にも最速で応答する可能性が高いです。そのため、書き込みコーディネーターとして read-1 に最も速く応答するノードを選択します。

とは何the node that replied fastest to the previous read operationですか?このようなノードは、クライアント主導の調整が使用されている場合にのみ意味があります。サーバー側の調整では、コーディネーター ノードがクライアントに応答し、他の関連ノードがコーディネーター ノードに応答します。replied fastestこの場合は無意味です。

于 2014-08-12T08:06:39.400 に答える
1
  1. セクション 2.3 では、書き込み時ではなく読み取り時に調整を実行することについて説明しています。
  2. データのバージョン管理 - 「ベクトル クロックを調べることで、オブジェクトの 2 つのバージョンが並列ブランチ上にあるか、因果関係があるかを判断できます。」
  3. セクション 4 からのこの段落。[強調鉱山]

Dynamo では、クライアントがオブジェクトを更新する場合、更新するバージョンを指定する必要があります。これは、以前の読み取り操作から取得したコンテキスト (ベクトル クロック情報を含む) を渡すことによって行われます。読み取りリクエストの処理時に、Dynamo が構文的に調整できない複数のブランチにアクセスできる場合、Dynamo はリーフにあるすべてのオブジェクトを、コンテキスト内の対応するバージョン情報と共に返します。このコンテキストを使用した更新は、異なるバージョンを調整したと見なされ、ブランチは単一の新しいバージョンに折りたたまれます

したがって、最初に読み取りを実行することで、書き込みのにすべての異なるバージョンを効果的に調整できます。同じノードに書き込むことにより、更新したバージョンは最新バージョンのコンテキストとベクトル クロックでマークされ、すべての分岐ブランチを折りたたむことができます。これは、上位 N ノード (前述のとおり) にできるだけ早く送信されます。しかし、分岐を削除することで、複数の値が返される可能性を減らすことができます。1つだけ必要です調整された書き込みを取得するために、次の読み取りで読み取られた N ノードの。つまり、R 読み取りの定足数の一部としてのノードは、「私は調整されたバージョンであり、他のすべての人は私に頭を下げる必要があります」と言います。(そして、それが別の "R" ノードに既に配布されている場合は、クォーラムで調整されたバージョンを取得する可能性がさらに高くなります)

しかし、別のノードに書き込みを行った場合、それを読み取ったことはありません。更新されているベクトル クロックは、必ずしもオブジェクトの調整済みバージョンであるとは限りません。したがって、分岐したブランチを持つことができます。次の読み取りはそれを調整しようとしますが、複数の異なるデータがあり、調整がない可能性が高くなります。

ここまで来たら、最も興味深い部分は、セクション 6 に従って、クライアント アプリケーションが N、R、および W の値を指定できることです。つまり、プールを構成するノードの数と、成功するために読み取りまたは書き込みに同意する必要があるノードの数。

もう頭が痛い。

于 2013-08-07T03:30:59.863 に答える