分布式系统中有哪些故障转移算法?

2024-01-06

我正在计划使用一个分布式数据库系统无共享架构 http://en.wikipedia.org/wiki/Shared_nothing_architecture and 多版本并发控制 http://en.wikipedia.org/wiki/Multiversion_concurrency_control。冗余将通过以下方式实现异步复制 http://www.webopedia.com/TERM/A/asynchronous_replication.html(如果发生故障,只要系统中的数据保持一致,就允许丢失一些最近的更改)。对于每个数据库条目,一个节点具有主副本(仅该节点对其具有写访问权限),此外,出于可扩展性和冗余目的,一个或多个节点还具有该条目的辅助副本(辅助副本是只读的) 。当条目的主副本更新时,它会被加上时间戳并异步发送到具有辅助副本的节点,以便最终它们将获得该条目的最新版本。拥有主副本的节点可以随时更改 - 如果另一个节点需要写入该条目,它将请求主副本的当前所有者将该条目的主副本的所有权授予该节点,并在收到所有权后该节点可以写入条目(所有事务和写入都是本地的)。

最近我一直在思考当集群中的节点出现故障时该怎么办,即使用什么策略进行故障转移。这里有一些问题。我希望您知道至少其中一些的可用替代方案。

  • 有哪些算法可用于在分布式系统中进行故障转移?
  • 分布式系统中有哪些共识算法?
  • 集群中的节点应该如何判断某个节点宕机了?
  • 节点应如何确定哪些数据库条目在发生故障时在故障节点上拥有其主副本,以便其他节点可以恢复这些条目?
  • 如何确定哪个节点拥有某个条目的最新辅助副本?
  • 如何决定哪个节点的辅助副本应提升为新的主副本?
  • 如果本来应该宕机的节点突然又恢复正常了怎么办?
  • 如何避免脑裂场景,即网络暂时分裂成两半,双方都认为对方已经死亡?

* What algorithms there are for doing failover in a distributed system?

可能不是算法,而是系统。您需要围绕您提出的问题来设计您的架构。

* What algorithms there are for consensus in a distributed system?

您可能想要实现 Paxos。简单的 Paxos 并不难实现。如果您想使其防弹,请阅读 Google 的“Paxos Made Live”论文。如果您希望使其具有高性能,请考虑 Multi-Paxos。

* How should the nodes in the cluster determine that a node is down?

依靠。心跳实际上是一个很好的方法。问题是存在误报,但这是不可避免的,并且在同一 LAN 上具有可管理负载的集群中,它们是准确的。 Paxos 的好处是可以自动处理误报。但是,如果您实际上需要出于其他目的的故障信息,那么您需要确保检测到节点发生故障是可以的,但它实际上只是在负载下并且需要时间来响应心跳。

* How should the nodes determine that what database entries had their master copy on the failed node at the time of failure, so that other nodes may recover those entries?
* How to decide that which node(s) has the latest secondary copy of some entry?
* How to decide that which node's secondary copy should be promoted to be the new master copy?

我认为您可能会从阅读 Google FileSystem 论文中真正受益。在 GFS 中,有一个专用的主节点,用于跟踪哪些节点拥有哪些块。这个方案可能适合你,但关键是要保持对这个主机的访问最少。

如果您不将此信息存储在专用节点上,则必须将其存储在任何地方。尝试使用主持有者的 ID 来标记数据。

* How to handle it, if the node which was though to be down, suddenly comes back as if nothing happened?

参见上文,但基本点是您必须小心,因为不再是主节点的节点可能会认为它是主节点。我认为您没有解决的一件事是:更新如何到达主节点 - 即客户端如何知道将更新发送到哪个节点?

* How to avoid split-brain scenarios, where the network is temporarily split into two, and both sides think that the other side has died?

Paxos 在这里的工作原理是在完美分裂的情况下阻止进展。否则,就像以前一样,你必须非常小心。

一般来说,解决了知道哪个节点作为主节点获取哪个数据项的问题,您将在修复架构方面走得更远。请注意,您不能只让接收更新的节点成为主节点 - 如果两个更新同时发生怎么办?也不要依赖同步的全球时钟——那样就会变得疯狂。如果可以的话,您可能希望避免在每次写入时都运行共识,因此可能需要一个慢速的主故障转移协议和一个快速的写入路径。

如果您想了解更多详情,请随时给我发离线邮件。我的博客http://the-paper-trail.org http://the-paper-trail.org处理很多这样的事情。

cheers,

Henry

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分布式系统中有哪些故障转移算法? 的相关文章

  • 如何将无向图转换为 DAG?

    The 维基页面 http en wikipedia org wiki Directed acyclic graph Relation to other kinds of graphs says 任何无向图都可以通过为其顶点选择总顺序并将每
  • 使用 Spring Boot 的 Flyway Core 给出错误 'delayedFlywayInitializer' 和 'entityManagerFactory' 之间的循环依赖关系

    我想在 SQL Server 数据库上导入一些数据 我使用的是 Spring Boot 2 3 4 我还使用 Hibernate 来生成表 我在pom中添加了flyway核心
  • 多个数据库连接

    我有三张桌子 categories content info and content The categories表包含类别的id及其 IDparent类别 The content info包含两列 entry id帖子的 ID 和cat
  • PHP 数据库显示在具有不同锚标记的相同字段中

    我四处寻找 看看这是否可行 但却空手而归 首先 这是我的代码 div style display none div ul li li li li li li ul
  • 使用DBFlow,如何加密已经存在的数据库?

    我正在使用 DBFlow 来处理项目中的数据库 并且我想对现有数据库进行加密 我知道我可能必须删除现有的未加密数据库并创建另一个加密数据库 我也知道我可以将 SQLCipher 与 DBFlow 一起使用 如上所述文档 https gith
  • 使用python shelve跨平台

    我希望得到关于 Python 中的书架 数据库的一些建议 问题 我在 Mac 上创建了一个数据库 我想在 Windows 7 上使用该数据库 我使用 Python 3 2 MacOS 10 7 和 win 7 当我在 Mac 上打开并保存我
  • 由周期表元素形成的最大单词的算法

    我想为以下问题场景编写一个算法 根据元素周期表元素的名称 找到可以组成的最大单词 符号如Na Ne等应被视为单个元素 这是在一家知名公司的求职面试中被问到的 有人可以帮我解决这个问题吗 我认为更好的方法是检查字典中的每个单词 看看是否可以从
  • 时间复杂度和运行时间有什么区别?

    时间复杂度和运行时间有什么区别 它们是一样的吗 运行时间是指程序运行所需的时间 时间复杂度是对输入大小趋于无穷大时运行时间渐进行为的描述 您可以说运行时间 是 O n 2 或其他什么 因为这是描述复杂性类和大 O 表示法的惯用方式 事实上
  • 如何记录数据库代码以查看数据库对象之间的依赖关系? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想为我的宠物项目编写文档 我的 PostgreSQL 数据库中有 30 个表 近 50 个视图和大约 30 个函数 存储过程 我想看
  • 如何仅使用单个数组在 JavaScript 中模拟调用堆栈

    我正在看维基百科页面 https en wikipedia org wiki Call stack在调用堆栈上 并尝试理解这个图像 据我所知 哈哈 const memory memory 0 3 top of stack pointer m
  • 分而治之策略来确定列表中是否有超过 1/3 的相同元素

    我正在使用分治算法来确定列表中是否有超过 1 3 的元素相同 例如 1 2 3 4 不 所有元素都是唯一的 1 1 2 4 5 是的 其中 2 个是相同的 没有排序 是否有分而治之的策略 我陷入了如何划分的困境 def is valid i
  • URL路径相似度/字符串相似度算法

    我的问题是我需要比较 URL 路径并推断它们是否相似 下面我提供了要处理的示例数据 GROUP 1 robots txt GROUP 2 bot html GROUP 3 phpMyAdmin 2 5 6 rc1 scripts setup
  • 在数据库中存储密码的最佳方法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • C 埃及分数

    古埃及人仅使用以下形式的分数1 n因此任何其他分数都必须表示为这些单位分数的总和 而且 所有单位分数都是不同的 在C或Java中使任何分数成为埃及分数 总和越少越好 的好方法是什么 可以使用什么算法 分支定界 a 例如 3 4 1 2 1
  • 使用 ActiveAndroid 库存储 HashMap

    我有一堂课 Table name Control public class Control extends Model Column private String name Column private Map
  • 7 张牌扑克手牌评估器

    有谁知道评估 7 张牌扑克牌的快速算法吗 这比简单地暴力检查 7 张牌中每 21 个 5 张牌的组合更有效 Cheers Pete 我写了一篇JavaScript 核心评估方法仅使用位操作 因此速度非常快 考虑到这一点 查看 21 种组合还
  • 快速约会算法

    我在一家咨询公司工作 大部分时间都在客户所在地 正因为如此 我很少见到同事 为了更好地了解彼此 我们将安排一个晚宴 会有很多小桌子 方便人们聊天 为了在聚会期间与尽可能多的不同的人交谈 每个人都必须每隔一段时间 比如每小时 换一张桌子 如何
  • 异或交换可以扩展到两个以上的变量吗?

    我一直在尝试将异或交换扩展到两个以上的变量 例如n变量 但我没有得到比这更好的地方3 n 1 对于两个整型变量x1 and x2你可以像这样交换它们 swap x1 x2 x1 x1 x2 x2 x1 x2 x1 x1 x2 所以 假设你有
  • 在常数空间中创建 1..N 的随机排列

    我正在寻找枚举固定空间中数字 1 N 的随机排列 这意味着我无法将所有数字存储在列表中 原因是 N 可能非常大 超过可用内存 我仍然希望能够一次遍历这样一个数字的排列 只访问每个数字一次 我知道对于某些 N 可以这样做 许多随机数生成器随机
  • 使用并集查找(又名不相交集)检测图是否是二分图

    我正在 Spoj 上做一个问题 基本上可以简化为检测图是否是二分图 我正在尝试使用 dfs 为图表着色 但它太慢了 有人评论这个 没有 bfs 没有 dfs 没有二部图 简单的并查集就可以做到 确实速度很快 提示 1 偶数长度的环不会影响两

随机推荐