第五篇:协调和协定之选举算法
Posted flying_1314
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第五篇:协调和协定之选举算法相关的知识,希望对你有一定的参考价值。
目录
选举
选择独特的流程来扮演领导者的角色,承担特殊的任务
例如
- 基于服务器的互斥算法需要选举一个服务器进程
- 伯克利算法
基础
任何进程都可以要求选举
一个进程一次最多可以进行一次选举
- 选举的结果不取决于哪个进程发起的
当选的进程是唯一的
允许多个进程同时调用一次选举
- 所有这些进程在一起只能产生一个领导者
进程具有唯一标识符
在任何时间点,一个进程是
- 参与者,意味着它参与了选举算法的某些运行
- 非参与者,意味着它目前没有参与任何选举
领导者
具有最大标识符的进程被选中
标识符可以是任何东西
- 通用标识符:进程ID
- 其他:IP 地址、磁盘空间或文件数量等。
例子
- 选举计算负载最低的进程
- 使用<1/load,i>作为其标识符,其中load>0和进程索引i用于对具有相同负载的标识符进行排序
要求
每个进程 pi 都有一个变量 electedi
- 包含被选举进程的标识符
- 当进程首次成为选举的参与者时,设置为特殊值⊥(尚未定义)
E1(安全)
- 一个参与者进程 pi 已经有electied i = ⊥ 或elected i =P 对于一些未崩溃的进程P ,该进程将在运行结束时以最大标识符被选择
E2(活力)
所有未崩溃的进程 pi 都参与并最终设置 electedi ≠⊥
表现
带宽利用率
- 与发送的消息总数成正比
回转
- 单次运行开始和终止之间的序列化消息传输次数
基于环的选举
N 个进程被组织在一个逻辑环中
- 所有进程都有一个唯一的整数ID
- 所有消息都围绕环顺时针发送
- 每个进程 pi 都有一个到环中下一个进程的通信通道,p(i+1) mod N
算法
初始
- 最初将所有进程标记为非参与者
- 任何进程都可以开始选举(发起者)
- 选举开始:一个进程将自己标记为参与者,将其ID放入选举消息中,并顺时针发送到下一个进程
如果消息被转发即向前传递,在任何转发时,将自己的状态标记为参与者
进程收到选举消息时,将消息中的ID与自己的ID进行比较
- 如果ID更大,则将其转发到下一个进程
- 如果ID较小,则
- 如果进程是非参与者(即之前没有转发选举消息),则在选举消息中替换自己的ID并在环上转发
- 否则,不要转发消息(作为“参与者”)
- 如果 ID 与自己的 ID 相同,则
- 这个进程的ID必须最大,成为leader
- 将自己的状态标记为“非参与者”
- 用自己的ID向邻居发送选举消息,宣布选举结果
当一个进程收到一个选举消息时
- 将自己标记为非参与者
- 将它的变量 electedi 设置为消息中的 ID,除非它是新的协调器,否则将消息转发给它的邻居
要求
E1:安全
- 满足因为所有标识符被考虑
- 即使选举同时开始,较小的标识符不能通过较大的标识符
E2:活力
- 由于可靠的通信而满足
表现
带宽利用率
- 最坏情况行为:
- 3N – 1 条消息,按顺序依次发送
- 最多 2N – 1 条用于选举左手邻居的消息
- 另外N条选举后通知的消息
回转
- 3N – 1 条消息传输次数
故障或者失败
不能容忍
故障检测器可用于管理崩溃故障,例如:
- 修理环
- 停止转发选举消息
- 开始新的选举
但故障检测器并不完美
- 如果最大 ID 的进程崩溃了,但 FD 认为这是“意外”怎么办?
- 如果 ID 最大的进程还活着但 FD 认为它“可疑”怎么办?
霸凌算法
同步系统
可靠的沟通渠道
进程可能会崩溃!
其他假设
- 每个进程都知道所有其他进程的标识符
- 每个进程都可以与其他进程通信
消息类型
- 选举:宣布选举
- 答案:回复选举信息
- 协调者:宣布选举的进程的身份
故障检测
基于可靠的故障检测器
- Ttrans = 最大消息传输延迟
- Tprocess = 处理消息的最大延迟
超时
- T = 2Ttrans + Tprocess
- 发送消息和接收响应之间可以经过的最长时间
失败:T 内没有响应请求
算法
初始化
- 进程检测到协调者故障
具有最高 ID 的进程检测到故障
- 进程知道它拥有最高的 ID(它可以将它的 ID 与所有其他 ID 进行比较)
- 通过向所有其他具有较低 ID 的节点发送协调者消息来宣布其角色
任何其他进程检测到失败
- 低ID进程向所有高ID进程发送选举消息
- 如果在T内没有收到回复:考虑本身作为协调者,将协调者消息发送给具有较低ID的所有进程
- 否则:等待另一个 T 时间单位让协调器消息从新协调器到达
- 如果没有协调器消息到达,则开始另一个选举过程
接收协调员消息
- 进程将变量electioni设置为在coordinator消息中接收到的coordinator的ID
收到选举讯息
- 进程发回应答消息并开始另一次选举——除非进程已经发起了选举
新进程替换崩溃进程
- 发起选举
- 如果它有最高的ID,它会立即发送协调员消息并“欺负”当前协调员辞职
上图是例子,p1-p4有四个进程。
阶段1:进程p1检测到协调者p4出现故障,并宣布进行选举.
阶段2:p2,p3 发送应答消息给p1,并开始他们自己的选举;p3发送应答消息给p2,但是p3没有从出现故障的进程p4收到应答消息。
阶段3:因此,p3决定自己是协调者。但在它发出协调者消息前,它也出现故障。
阶段4:当p1的超时周期T‘过去后(这里我们假设发生在p2超时周期之前),它得出没有协调者消息的结论,并开始另一次选举。最终p2被选为协调者。
要求
E1:安全
- 如果没有进程被替换并且超时T估计准确则满足
- 如果崩溃的进程被替换而另一个进程宣布它是新的协调者,则不满意
E2:活力
- 满足,对于同步系统和可靠传输
表现
最好的情况
- 具有第二高标识符的进程检测到协调器故障并选举自己的协调器并发送 N-2 条协调者消息
最糟糕的情况
- 当最低 ID 检测到故障时需要 O(N2) 条消息⇒ N-1 个具有较高 ID 的进程开始选举
终于,选举部分也结束了,辛苦大家观看,内容也是非常的多,还是老规矩,有问题随时评论交流!
以上是关于第五篇:协调和协定之选举算法的主要内容,如果未能解决你的问题,请参考以下文章