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

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(使用前将#替换为@)

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

  • 如何将两个django模型(表)合并为一个模型(表)

    我想合并两个 django 模型并创建单个模型 我们假设 我有第一个表表 A 其中包含一些列和数据 Table A col1 col2 col3 col4 x1 x2 x3 x4 y1 y2 y3 y4 我还有另一个表 Table B 其中
  • 用于只读 DB 的 java ORM

    我了解 hibernate 但我想知道是否有一个更轻的 ORM 引擎只读数据库 我的意思是 我不需要一些事务查询或更新一些记录 另一方面 我需要处理一些大的记录列表 List
  • 查找文本中所有关键字的有效算法

    我有很多字符串 其中包含许多不同拼写的文本 我通过搜索关键字来标记这些字符串 如果找到关键字 我将使用该关键字的关联文本 假设搜索字符串可以包含文本 schw schwa 和 施瓦茨 我有三个关键字 全部解析为文本 schwarz 现在我正
  • 如何在 JavaScript 中构建树模式匹配算法?

    好吧 这是一个有点复杂的问题 但是 tl dr 基本上是如何使用 模式树 解析 实际树 如何检查特定的树实例是否与特定的模式树匹配 首先 我们有我们的结构模式树 模式树通常可以包含以下类型的节点 sequence节点 匹配一系列项目 零个或
  • 线段树java实现[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 你知道 二进制 的良好实现吗线段树 http en wikipedia org wiki Segmen
  • Postgres - 如何在插入时自动调用 ST_SetSRID(ST_MakePoint(lng, lat), 4326)?

    我正在使用postGIS 并且我对SQL不是很熟悉 我可以成功插入到我的markers表只要我做这样的事情 伪代码 INSERT INTO markers created by title description lat lng geogr
  • DB2连接授权失败原因:Java不支持安全机制

    我正在尝试使用 DB2JDBC Type4 驱动程序配置 DB2 连接 但我收到这个错误 线程 main 中的异常 com ibm db2 jcc am SqlInvalidAuthorizationSpecException jcc t4
  • 通过 JDBC 将“daterange”字段值插入 PostgreSQL 表

    我在 PostgreSQL 9 3 有一个表日期范围 http www postgresql org docs 9 3 static rangetypes html字段类型 我可以像使用 JDBC 的字符串一样选择此字段 但无法将其插入表中
  • 使用 Greasemonkey 时存储数据

    使用 Greasemonkey 时是否有存储大量数据的好方法GM setValue只是没有削减它 那么这里有一些选项 设置服务器来保存数据 对于用户 并使用 xhr 来 创建 编辑 删除数据 谷歌应用程序 发动机 GAE http code
  • 如何为多边形创建内部螺旋?

    对于任何形状 我如何在其内部创建类似形状的螺旋 这与边界 使用 Minkowski 和 类似 尽管它会是相同形状的螺旋 而不是在形状内部创建相同的形状 我找到了这个 http www cis upenn edu cis110 13su le
  • “包含字符串”的快速索引

    在我的应用程序中 我有多达数百万个短字符串 大部分短于 32 个字符 我想实现一个带有附加列表的搜索框 该列表仅包含包含在搜索框中输入的整个字符串的元素 如何预先建立索引来快速找到此类字符串 所有排序的 STL 容器都会检查整个字符串 对于
  • 是否有一种算法可以在线性时间内计算数组反转?

    我知道有多少倒转 en wikipedia org wiki Inversion 28discrete mathematics 29 in an n 元素数组可以在 O n log n 操作使用增强型归并排序 http www geeksf
  • 如何在C中实现带连分数的自然对数?

    这里我有一个小问题 根据这个公式创建一些东西 这就是我所拥有的 但它不起作用 弗兰基 我真的不明白它应该如何工作 我尝试用一 些错误的指令对其进行编码 N 是迭代次数和分数部分 我认为它会以某种方式导致递归 但不知道如何 谢谢你的帮助 do
  • 我应该对算法使用递归还是记忆化?

    如果我可以选择使用递归或记忆来解决问题 我应该使用哪一个 换句话说 如果它们都是可行的解决方案 因为它们提供了正确的输出并且可以在我正在使用的代码中合理地表达 那么我什么时候会使用其中一个而不是另一个 它们并不相互排斥 您可以同时使用它们
  • Mysql 中 UNION 子句的替代方案

    我有两张桌子 表 a 表 b table a ID 1 2 3 4 5 7 table b ID 2 3 4 5 6 我必须得到这样的输出而无需UNION命令 ID 1 2 3 4 5 6 7 注意 我有一个联合解决方案 select fr
  • 如何在列上创建外键,该列的每条记录都可能引用多个表之一中的列?

    我正在创建一个社交网络 它有新闻 照片等多个实体 可以有评论 由于所有评论都具有相同的列并且行为方式相同 唯一的区别是它们的类型 新闻 照片或将来添加的其他内容 我决定为所有评论创建一个表 其中的列名为type 它工作得很好 直到我决定将外
  • 如何光栅化旋转矩形(通过 setpixel 在 2d 中)

    我有四个 2d 顶点 A B C D 的旋转矩形 我需要在像素缓冲区中 有效地 光栅化 绘制它 使用 setpixel x y 颜色 怎么做 我正在尝试使用一些代码 例如 convertilg a b c d do up down left
  • APEX 安装失败,PLS-00201:必须声明标识符“SYS.DBMS_DB_VERSION”

    尝试在 Oracle XE 18c 数据库上安装 Oracle APEX 20 2 如下官方说明 https docs oracle com en database oracle application express 20 1 htmig
  • 贝尔曼福特算法可以有任意的边顺序吗?

    我刚刚开始学习新算法 但当我阅读 极客为极客而写的贝尔曼福特算法 时 我陷入了困境 http www geeksforgeeks org dynamic programming set 23 bellman ford algorithm h
  • 优化计算中使用的 # 个线程的算法

    我正在执行一个操作 我们将其称为CalculateSomeData CalculateSomeData 在连续的 代 中运行 编号为 1 x 整个运行中的代数由CalculateSomeData 的输入参数固定 并且是先验已知的 完成一次生

随机推荐