5

我正在设计一个分布式系统,其中包含一定数据流。我想保证在任何给定时间至少有N个节点具有近乎当前的数据。 我不需要完整的一致性,只有最终的一致性(在任何时刻t.i.,数据的当前快照最终应该出现在至少N个节点上,这里很难定义术语“当前”,但仍然)。节点可能会失败并随时恢复,并且没有单个“中央”节点。有关复制方案/算法的文章?

O溢出!将我指向一些描述复制方案的优秀论文。到目前为止,我发现了一个:Consistency Management in Optimistic Replication Algorithms和同一作者的更广泛和最近的文章:Optimistic Replication

回答

1

很多把戏这是找到您的具体要求,以及你的声音仍然很模糊。你只需要支持这样的操作?

  • 更新密钥K值V.
  • 查一查你提到你需要最终一致性的关键K.

有点-最新值。所以如果你进行一次更新,它最终会在任何地方复制。如果你几乎同时进行两次更新,你是否关心哪一个获胜?如果一个副本报告更新已成功完成,那么您是否在意如果该副本稍后会暂时崩溃,那么该值是否会丢失?或者如果这个复制品被永久销毁?

近期应该有多精确?如果存在网格划分或其他问题,查找可能会返回一个非常陈旧的结果或者只是失败。你关心哪个?

你是否需要支持像票友操作...

  • 获取密钥K的绝对是最新的价值?
  • 如果最近的值是V,那么将K的值更新为V'值?

您是否有严格的可靠性,延迟和/或带宽要求?你的副本有多远/网络有多好?这会影响您是否可以在每次更新甚至每次查找时进行跨副本通信;或者即使您可以/应该将操作故障切换到远程复制副本,如果本地副本出现故障。

根据你在这里的答案,我已经与一些可能符合你的要求的不同方案合作。他们有几种可能的变化。

  • 最简单的事情就是让应用程序始终与本地副本进行通话。副本时间戳记值(使用NTP同步时钟),并且只能彼此交谈以进行异步复制。复制中获得最高时间戳。当然,如果两个不同副本上的应用程序每个都同时进行读取/修改/写入,则其中一个修改很容易丢失。 (事实上​​,如果没有条件更新方案,对于同一个副本上几乎同时发生的更改也是如此)。如果副本永久失败,则可能会丢失近期更新。这或多或少是Bigtable的内置复制所做的。在你关联的论文中,这将是“乐观 - 多头”分支,但不关心丢失一些更新使得它比他们的建议更简单。
  • 有些数据库使用的Paxos算法(参见例如,“数据管理互联网规模的单点登录” here使票友的事情成为可能。每个副本可以知道你怎么能远远落后于它可能是这么说的“给我这是不超过1分钟的老”或‘给我的绝对是最新的价值。’更新不被认为是完整的,直到副本的法定人数已经接受了它,所以‘值给我绝对的最新值’一定会始终返回值,直到另一次更新发生的。你可以做我提到的防止同时从作家流浪对方条件更新操作。这似乎并不完全适合无论是乐观还是悲观的类别由作者定义,因为更新同步复制到这并没有在最新一轮的Paxos投票的法定人数,但副本可能仍然能够回答一些疑问,该方案可以很复杂的,但...