database - 关于复制方案/算法的文章?

标签 database language-agnostic replication scalability fault-tolerance

我正在设计一个分布式系统,其中包含特定的数据流。我想保证在任何给定时间至少有 N 个节点具有几乎最新的数据。 我不需要完全一致性,只需要最终一致性(即任何时刻,当前数据快照最终应该出现在至少 N 个节点上。在这里定义术语“当前”很棘手,但仍然如此)。节点可能随时发生故障并重新启动,并且没有单一的“中央”节点。

溢出者啊!给我一些描述复制方案的好论文。到目前为止,我已经找到了一个:Consistency Management in Optimistic Replication Algorithms以及同一作者最近发表的一篇更广泛的文章:Optimistic Replication .

最佳答案

很多技巧是找到您的确切要求,而您的要求听起来仍然很模糊。您是否只需要支持这样的操作?

  • 将键 K 更新为值 V。
  • 查找键 K 的最近值。

您提到您需要最终一致性。因此,如果您进行一次更新,它最终会复制到所有地方。如果您进行两个几乎同时的更新,您会关心哪一个更新吗?如果一个副本报告更新已成功完成,您是否关心如果该副本不久后暂时崩溃,该值是否会丢失?或者如果该复制品被永久销毁?

something-recent 应该有多精确?如果存在网络 split 或其他情况,查找可能会返回非常陈旧的结果或失败。你关心哪个?

您是否需要支持更高级的操作,例如...

  • 获取键 K 的绝对最新值?
  • 如果当前最新值为 V,则将键 K 的值更新为值 V'?

您是否有严格的可靠性、延迟和/或带宽要求?您的副本相距多远/之间的网络有多好?这会影响您是否可以在每次更新甚至每次查找时进行跨副本通信;甚至如果本地副本似乎已关闭,您可以/应该将操作故障转移到远程副本。

根据您在此处的回答,我使用了几种可能满足您要求的不同方案。它们有几种可能的变体。

  • 最简单的方法就是让应用程序始终与本地副本通信。副本时间戳值(使用 NTP 同步时钟)并且仅相互通信以进行异步复制。最高时间戳在复制中获胜。当然,如果两个不同副本上的应用程序都几乎同时执行读取/修改/写入操作,那么其中一个修改很容易丢失。 (事实上​​ ,如果没有条件更新方案,同一副本上几乎同时发生的更改也是如此。)如果副本永久失败,最近的更新可能会丢失。这或多或少是 Bigtable 的内置复制所做的。在您链接的论文中,它是“Optimistic - Multimaster”分支,但不太关心丢失一些更新使其比他们建议的更简单。
  • 一些数据库使用 Paxos 算法(参见例如“互联网规模单点登录的数据管理”here 使更奇特的事情成为可能。每个副本都可以知道它可能落后多远,所以你可以说“给我一个不超过 1 分钟的值”或“给我绝对最新值”。在副本的法定人数接受它之前,更新不被认为是完整的,所以“给我绝对最新值”肯定总是返回该值,直到发生另一次更新。您可以执行我提到的条件更新操作,以防止同时编写者互相践踏。这似乎不完全符合该作者定义的乐观或悲观类别,因为更新已被复制与法定人数同步,但在最新的 Paxos 回合中未投票的副本可能仍然能够回答一些查询。该方案可能非常复杂,但是...

关于database - 关于复制方案/算法的文章?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2468712/

相关文章:

language-agnostic - 语法高亮设计模式

java - 如何在 AEM 中以编程方式获取复制代理?

sql-server-2005 - 我可以通过 SSH 隧道进行 SQL Server 2005 合并复制吗?

sql - 从非常旧的 unix 机器中提取数据

database - "java.lang.Thread.sleep(long)"不完整或格式错误

language-agnostic - 如何找到类似的代码片段?

c# - 用于构建 OCA 的工具(偶尔连接的应用程序)

mysql - 具有多个最终用户的 SQL 数据库体系结构

ruby - 我需要从查询结果中获取用户 ID

javascript - 如何解析和捕获任何度量单位