From 488e08777dcc9604a3ca4f120acea863ef62a22c Mon Sep 17 00:00:00 2001 From: songzhibin97 <49082129+songzhibin97@users.noreply.github.com> Date: Sat, 23 Apr 2022 11:37:01 +0800 Subject: [PATCH 1/4] Update ch5.md --- ch5.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch5.md b/ch5.md index 532d82b..6b19a09 100644 --- a/ch5.md +++ b/ch5.md @@ -618,7 +618,7 @@ Dynamo 风格的数据库允许多个客户端同时写入相同的 Key,这意 实现最终融合的一种方法是声明每个副本只需要存储最 **“最近”** 的值,并允许 **“更旧”** 的值被覆盖和抛弃。然后,只要我们有一种明确的方式来确定哪个写是 “最近的”,并且每个写入最终都被复制到每个副本,那么复制最终会收敛到相同的值。 -正如 **“最近”** 的引号所表明的,这个想法其实颇具误导性。在 [图 5-12](img/fig5-12.png) 的例子中,当客户端向数据库节点发送写入请求时,客户端都不知道另一个客户端,因此不清楚哪一个先发生了。事实上,说 “发生” 是没有意义的:我们说写入是 **并发(concurrent)** 的,所以它们的顺序是不确定的。 +正如 **“最近”** 的引号所表明的,这个想法其实颇具误导性。在 [图 5-12](img/fig5-12.png) 的例子中,当客户端向数据库节点发送写入请求时,两个客户端都不知道另一个客户端,因此不清楚哪一个先发生了。事实上,说这两种情况都是先发生是没有意义的:我们说写入是 **并发(concurrent)** 的,所以它们的顺序是不确定的。 即使写入没有自然的排序,我们也可以强制任意排序。例如,可以为每个写入附加一个时间戳,挑选最 **“最近”** 的最大时间戳,并丢弃具有较早时间戳的任何写入。这种冲突解决算法被称为 **最后写入胜利(LWW, last write wins)**,是 Cassandra 【53】唯一支持的冲突解决方法,也是 Riak 【35】中的一个可选特征。 From 65e5c21e908950013d4424b17b8fdf9b1b6a7c2d Mon Sep 17 00:00:00 2001 From: songzhibin97 <49082129+songzhibin97@users.noreply.github.com> Date: Sat, 23 Apr 2022 11:38:13 +0800 Subject: [PATCH 2/4] Update ch5.md --- ch5.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch5.md b/ch5.md index 532d82b..e197623 100644 --- a/ch5.md +++ b/ch5.md @@ -620,7 +620,7 @@ Dynamo 风格的数据库允许多个客户端同时写入相同的 Key,这意 正如 **“最近”** 的引号所表明的,这个想法其实颇具误导性。在 [图 5-12](img/fig5-12.png) 的例子中,当客户端向数据库节点发送写入请求时,客户端都不知道另一个客户端,因此不清楚哪一个先发生了。事实上,说 “发生” 是没有意义的:我们说写入是 **并发(concurrent)** 的,所以它们的顺序是不确定的。 -即使写入没有自然的排序,我们也可以强制任意排序。例如,可以为每个写入附加一个时间戳,挑选最 **“最近”** 的最大时间戳,并丢弃具有较早时间戳的任何写入。这种冲突解决算法被称为 **最后写入胜利(LWW, last write wins)**,是 Cassandra 【53】唯一支持的冲突解决方法,也是 Riak 【35】中的一个可选特征。 +即使写入没有自然的排序,我们也可以强制任意排序。例如,可以为每个写入附加一个时间戳,挑选 **“最近”** 的最大时间戳,并丢弃具有较早时间戳的任何写入。这种冲突解决算法被称为 **最后写入胜利(LWW, last write wins)**,是 Cassandra 【53】唯一支持的冲突解决方法,也是 Riak 【35】中的一个可选特征。 LWW 实现了最终收敛的目标,但以 **持久性** 为代价:如果同一个 Key 有多个并发写入,即使它们报告给客户端的都是成功(因为它们被写入 w 个副本),也只有一个写入将存活,而其他写入将被静默丢弃。此外,LWW 甚至可能会删除不是并发的写入,我们将在的 “[有序事件的时间戳](ch8.md#有序事件的时间戳)” 中讨论。 From 0f0d23c02b903a70c23d60b9f1c4b3add8df5224 Mon Sep 17 00:00:00 2001 From: songzhibin97 <49082129+songzhibin97@users.noreply.github.com> Date: Mon, 25 Apr 2022 12:10:08 +0800 Subject: [PATCH 3/4] Update ch5.md --- ch5.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch5.md b/ch5.md index 6b19a09..18ad72b 100644 --- a/ch5.md +++ b/ch5.md @@ -618,7 +618,7 @@ Dynamo 风格的数据库允许多个客户端同时写入相同的 Key,这意 实现最终融合的一种方法是声明每个副本只需要存储最 **“最近”** 的值,并允许 **“更旧”** 的值被覆盖和抛弃。然后,只要我们有一种明确的方式来确定哪个写是 “最近的”,并且每个写入最终都被复制到每个副本,那么复制最终会收敛到相同的值。 -正如 **“最近”** 的引号所表明的,这个想法其实颇具误导性。在 [图 5-12](img/fig5-12.png) 的例子中,当客户端向数据库节点发送写入请求时,两个客户端都不知道另一个客户端,因此不清楚哪一个先发生了。事实上,说这两种情况都是先发生是没有意义的:我们说写入是 **并发(concurrent)** 的,所以它们的顺序是不确定的。 +正如 **“最近”** 的引号所表明的,这个想法其实颇具误导性。在 [图 5-12](img/fig5-12.png) 的例子中,当客户端向数据库节点发送写入请求时,两个客户端都不知道另一个客户端,因此不清楚哪一个先发送请求。事实上,说这两种情况谁先发送请求是没有意义的:我们说写入是 **并发(concurrent)** 的,所以它们的顺序是不确定的。 即使写入没有自然的排序,我们也可以强制任意排序。例如,可以为每个写入附加一个时间戳,挑选最 **“最近”** 的最大时间戳,并丢弃具有较早时间戳的任何写入。这种冲突解决算法被称为 **最后写入胜利(LWW, last write wins)**,是 Cassandra 【53】唯一支持的冲突解决方法,也是 Riak 【35】中的一个可选特征。 From 7368aaafe83f2fcf2a2fdd49724b2d08375f9dee Mon Sep 17 00:00:00 2001 From: songzhibin97 <49082129+songzhibin97@users.noreply.github.com> Date: Mon, 25 Apr 2022 12:13:44 +0800 Subject: [PATCH 4/4] Update ch5.md --- ch5.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch5.md b/ch5.md index e197623..838440c 100644 --- a/ch5.md +++ b/ch5.md @@ -620,7 +620,7 @@ Dynamo 风格的数据库允许多个客户端同时写入相同的 Key,这意 正如 **“最近”** 的引号所表明的,这个想法其实颇具误导性。在 [图 5-12](img/fig5-12.png) 的例子中,当客户端向数据库节点发送写入请求时,客户端都不知道另一个客户端,因此不清楚哪一个先发生了。事实上,说 “发生” 是没有意义的:我们说写入是 **并发(concurrent)** 的,所以它们的顺序是不确定的。 -即使写入没有自然的排序,我们也可以强制任意排序。例如,可以为每个写入附加一个时间戳,挑选 **“最近”** 的最大时间戳,并丢弃具有较早时间戳的任何写入。这种冲突解决算法被称为 **最后写入胜利(LWW, last write wins)**,是 Cassandra 【53】唯一支持的冲突解决方法,也是 Riak 【35】中的一个可选特征。 +即使写入没有自然的排序,我们也可以强制任意排序。例如,可以为每个写入附加一个时间戳,挑选的最大时间戳作为**“最近的”**,并丢弃具有较早时间戳的任何写入。这种冲突解决算法被称为 **最后写入胜利(LWW, last write wins)**,是 Cassandra 【53】唯一支持的冲突解决方法,也是 Riak 【35】中的一个可选特征。 LWW 实现了最终收敛的目标,但以 **持久性** 为代价:如果同一个 Key 有多个并发写入,即使它们报告给客户端的都是成功(因为它们被写入 w 个副本),也只有一个写入将存活,而其他写入将被静默丢弃。此外,LWW 甚至可能会删除不是并发的写入,我们将在的 “[有序事件的时间戳](ch8.md#有序事件的时间戳)” 中讨论。