与恶霸算法相比,高级主选举算法有什么好处?

2024-05-05

我读过当前的主选举算法(如 Raft、Paxos 或 Zab)如何在集群上选举主节点,但不明白为什么他们使用复杂的算法而不是简单的恶霸算法。

我正在开发一个集群库并使用 UDP 多播来发送心跳消息。每个节点加入一个多播地址,并定期向该地址发送数据报包。如果节点发现有一个新节点向该多播地址发送数据包,则该节点将被简单地添加到集群中,同样,当集群中的节点没有从某个节点获取任何数据包时,它们会将其从集群中删除。当我需要选择主节点时,我只需迭代集群中的节点并选择最旧的节点即可。

我读过一些文章,这些文章暗示这种方法并不有效,应该使用 Paxos 等更复杂的算法来选举主节点或通过心跳消息检测故障。我不明白为什么 Paxos 比传统的欺凌算法更适合裂脑场景或其他网络故障,因为我可以轻松地找出法定节点何时从集群中离开,而无需使用 Raft。我看到的唯一好处是每个服务器必须处理的数据包数量; Raft 中只有 master 会发送心跳消息,而在这种情况下,每个节点都必须互相发送心跳消息。不过,我认为这不是问题,因为我可以简单地实现类似的心跳算法,而无需更改我的主选举算法。

有人可以详细说明一下吗?


从理论角度来看,Raft、Paxos 和 Zab 都不是领导者选举算法。他们解决了一个不同的问题,称为共识。

在您的具体场景中,差异如下。使用领导者选举算法,您只能保证最终有一个节点成为领导者。这意味着在一段时间内,多个节点可能认为自己是领导者,因此可能表现得像一个节点。相比之下,使用上面的共识算法,你可以保证在一个逻辑时刻最多有一个领导者。

结果是这样的。如果系统的安全取决于单个领导者的存在,那么仅依靠领导者选举可能会遇到麻烦。考虑一个例子。节点从 UDP 多播接收消息,如果发送者是领导者,则执行 A,如果发送者不是领导者,则执行 B。如果两个节点在稍微不同的时间点检查集群中最旧的节点,它们可能会看到不同的领导者。然后,这两个节点可能会接收多播消息并以不同的方式处理它,这可能会违反您想要保留的系统的某些安全属性(例如,所有节点要么执行 A 要么 B,但从来没有一个节点执行 A 而另一个节点执行B)。

使用 Raft、Paxos 和 Zab,您可以克服这个问题,因为这些算法创建了某种逻辑纪元,每个纪元中最多有一个领导者。

这里有两个注释。首先,为同步系统定义了欺凌算法。如果您真的按照 Garcia-Molina 的论文中所述来实现它,我相信您可能会在部分同步系统中遇到问题。其次,Zab 算法依赖于一种异步系统的恶霸算法。通过比较历史长度来选举领导者(这可以最大限度地减少系统的恢复时间)。一旦领导者当选,它就会尝试启动 Zab 协议,从而锁定领导者的纪元。

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

与恶霸算法相比,高级主选举算法有什么好处? 的相关文章

  • 如何将 autoconf/automake 指向非标准包

    我正在尝试在 RedHat Linux 机器上构建 ZooKeeper ZooKeeper 到底是什么可能并不重要 当我按照包装说明进行操作时 我得到 autoreconf if aclocal configure ac 33 warnin
  • 节点集群工作人员内存使用情况

    有谁知道是否有一种独立于平台的方法来获取工作人员的内存使用情况 我希望它会像这样工作 console log App process memoryUsage process memoryUsage cluster on online fun
  • Hadoop:将多个IP地址绑定到集群NameNode

    我在 Softlayer 上有一个四节点 Hadoop 集群 Master NameNode 有一个用于外部访问的公共IP地址和一个用于集群访问的私有IP地址 从节点 数据节点 具有私有IP地址 我试图连接到主节点 而不需要为每个从节点分配
  • 使用 qsub 提交连续且独立的作业的速度有多快?

    这个问题与pbs 作业忙时无输出 https stackoverflow com questions 13804373 pbs job no output when busy 即 当 PBS Torque 处于 忙 状态时 我提交的一些作业
  • JSF 2.0 应用程序的水平扩展

    鉴于 JavaServer Faces 在服务器端本质上是有状态的 建议使用哪些方法来水平扩展 JSF 2 0 应用程序 如果一个应用程序运行多个 JSF 服务器 我可以想象以下场景 Sticky Sessions send all req
  • 用于单元/集成测试的嵌入式动物园管理员

    是否有嵌入式动物园管理员以便我们可以在单元测试中使用它 它可以与测试一起发货并开箱即用 也许我们可以模拟一些服务并注册到嵌入式动物园管理员 The Curator https github com Netflix curator wiki框
  • Raft算法:term什么时候会增加?

    Raft将时间划分为任意长度的术语 如图5所示 术语用连续的整数编号 每个任期以一次选举开始 其中一名或多名候选人试图成为领导者 如第 5 2 节所述 如果候选人赢得选举 那么他将在剩余任期内担任领导者 在某些情况下 选举会导致投票分散 在
  • 选择用于实现分布式消息传递算法的编程语言

    基本上 我想实现以下算法并分析使用这些算法构建的系统在不同条件下的行为 八卦协议 多个paxos 一致的散列 我的兴趣在于这些算法 我基本上是在寻找一种编程语言 可以让我快速编写这些算法并深入理解这些算法 我应该选择哪种语言 Java Sc
  • paxos 与 raft 进行领导者选举

    读完paxos和raft paper后 我有以下困惑 paxos论文仅描述了单个日志条目的共识 相当于raft算法中的领导者选举部分 在raft的leader选举中 paxos的方式相对于简单的随机超时方式有什么优势呢 一个常见的误解是原始
  • 分布式序列号生成?

    我一般都实现了序列号生成过去使用数据库序列 例如使用 Postgres SERIAL 类型http www neilconway org docs sequences http www neilconway org docs sequenc
  • 无法启动动物园管理员

    我正在使用合流平台 zookeeper 处于活动状态查找状态 但是当我尝试用 confluence 启动 kafka 时 它显示 Zookeeper 已关闭 sudo service zookeeper status Redirecting
  • 适用于商品 Linux 存储场的最佳分布式文件系统 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有很多闲置的英特尔 Linux 服务器 数百台 并且希望将它们用于 Web 托管和文件共享环境中的分布式文件系统 这不适用于 HPC 应用程序
  • 如果leader没有死但是无法接收Kafka中的消息会发生什么?单点故障?

    我有 3 个经纪人 3 个分区 每个代理都是一个分区的领导者和所有分区的 ISR 假设我已经在端口上运行了代理19092 29092 39092分别 19092 partition 0 29092 partition 1 39092 par
  • 如果更新值与接受者发送的最高提案编号不同步,paxos 是否会“忽略”更新值的请求?

    这里的标题可能会产生误导 我将尽力通过一个例子来解释我的疑问 我正在从 wiki 和其他来源阅读有关 paxos 算法的内容 1 想象一下客户端请求更新值的情况 X在下面的示例中 已被处理 经过一轮 Paxos 后 得到一个值Vb之所以被选
  • SunGridEngine、Condor、Torque 作为 PVM 的资源管理器

    有人知道哪个资源管理器适合 PVM 吗 或者我不应该使用 PVM 而是依赖 MPI 或其任何版本 例如 MPICH 2 还有其他更好的吗 使用 PVM 的主要原因是因为在我之前开始这个项目的人假设使用 PVM 然而 现在这个项目是我的了 他
  • 尝试以非 root 用户身份从容器内部写入已安装卷时出现问题

    我正在使用一个将运行 ZooKeeper 的容器 但我在安装到容器中的主机卷上遇到了权限问题 这是我的设置 在主机上 Ubuntu 14 04 创建了 zookeeper 系统用户 id 106 和组 id 111 创建目录 var log
  • Zookeeper管理服务器端口

    在Windows上安装了zookeeper 3 5 6 bin 出现错误 无法启动AdminServer 异常退出 org apache zookeeper server admin AdminServer AdminServerExcep
  • Websphere 7集群部署

    我们有一个 J2EE 应用程序作为 EAR 文件 部署在 WAS 7 中 为了使应用程序可用性尽可能高 需要部署在 3 个集群中 我们有一个 Quartz Scheduler 类 其工作是每天凌晨 2 00 将数据从一个数据库上传到另一个数
  • Hive - 线程安全的自动递增序列号生成

    我遇到一种情况 需要将记录插入到特定的 Hive 表中 其中一列需要是自动递增的序列号 即在任何时间点都必须严格遵循 max value 1 规则 记录从许多并行的 Hive 作业插入到这个特定的表中 这些作业每天 每周 每月批量运行 现在
  • 连接外部 Accumulo 实例和 java

    我正在尝试使用 Accumulo 连接到虚拟机 问题是 我无法将其连接到 Java 中 我可以看到 Apache 抛出的网页 但我无法让它与代码一起工作 我认为这是缺乏知识的问题而不是真正的问题 但我找不到这方面的文档 所有示例都使用 lo

随机推荐