paxos - Paxos:如何选择提议者、接受者和学习者?
问题描述
我想从许多相同的流程中选出一个领导者。Paxos 的所有解释都说有些进程是 Proposers,有些是 Voter,有些是 Accepters。当我启动它们时,我是否需要将这些角色分配给我的进程?
如果我所有的提议者都死了怎么办?我可以将现有的学习者/投票者切换为提议者吗?
我的想法是,所有进程都作为选民出现,然后随机超时等待消息。如果他们在超时到期之前没有收到任何消息,他们将扮演提议者的角色。如果他们收到一条消息,他们会再次超时,然后如果他们在超时结束(或他们达成协议)之前没有收到任何消息,他们可以再次成为提议者。
这是一种有效的方法吗?
解决方案
我是几个生产 paxos 系统的维护者。我将详细介绍我在我的和其他实际/生产系统中看到的内容。
Paxos 的所有解释都说有些进程是 Proposers,有些是 Voter,有些是 Accepters。当我启动它们时,我是否需要将这些角色分配给我的进程?
在实际系统中,提议者和接受者是同一组节点。也就是说,提议者和接受者是由同一进程承担的两个角色。
如果我所有的提议者都死了怎么办?
许多 Paxos 系统(例如用作 kv 存储的系统)在一系列paxos 实例(如事务日志)上工作。假设同一组进程将永远存在是不可行的,因此必须有机制来更改仲裁中的节点集。
在我维护的一些系统中,建议/选择的值有两个部分:来自客户的有效负载和 paxos 成员资格。paxos 轮由在先前值中选择的法定人数运行。这样做确实会阻碍您的系统通过管道传输所选值的能力;如果您想一次选择多个值,则必须将它们批处理,或者您可以查看 Raft 选择成员资格的方式。
在 Raft 中,选择仲裁成员是一个两阶段的过程。首先,提出并承诺新的法定人数;两个仲裁都使用了一段时间;然后新的法定人数接管。具体而言,在过渡期间,新旧法定人数中的大多数都需要提交任何事情,包括从新法定人数中接管。
推荐阅读
- angularjs - Access-Control-Allow-Origin 中的多个 ip 不起作用
- python - 如何获得经过训练的 CNN 模型某一层的输出 [Tensorflow]
- java - 如何正确使用多个边界?
- reactjs - 图像作为 Proptype 还是作为字符串从父级传递给子级?
- angular - 如何设置 matButton 活动(聚焦)角度?
- postman - 如何在 Postman 中循环函数
- java - 将 For 循环的迭代索引传递给方法的参数
- python - Python类调用其他方法
- php - Laravel Dusk 在 Canvas 元素上绘制
- sql-server - 基于两列生成自定义唯一键(复合键)