今天讲一讲分布式系统中必不可少的选举算法。
leader 就是一堆服务器中的协调者,某一个时刻只能有一个leader且所有服务器都承认这个leader. leader election就是在一组进程中,选举一个leader且让该组的进程都同意这个leader.

假设有N个process, 每个process都有个可以比较的ID,可以提出选举。
leader election算法要满足两点:

  • safety: 每一个进程要么不知道结果,要么知道正确的结果(不会选错leader)。
  • liveness: 选举算法总会结束,每一个进程都知道了结果。

Ring leader election 环算法

processes组成了一个环,第i个 process p_i 可以和 p_(i+1)modN通信。

如果进程i发现原来的leader挂了,它就会发起选举,发送一个包含自己ID a_i “Election”的信息。然后当某个进程j收到了这个信息的时候,会将这个a_i与自己的ID a_j比,如果a_i>a_j, 继续转发这条消息,如果a_i<a_j且它之前没有转发过消息,就把a_i取代掉然后把消息发送出去。如果发现收到的标识符和自己的一样,代表自己成为leader,然后把自己当选的信息发送出去。

最坏情况分析:一个进程发起选举,如果它的上一个进程具有最大标识符,则选举消息到达上一个进程需要(N—1)次传递,然后消息又要N次才能宣布它当选,最后需要N个消息告诉大家它当选了,所以需要(3N-1)个消息。最好情况就是发起选举的进程就是leader,只需要(2N)个消息。如果有多个进程同时发起选举,那么只有具有最大ID的进程会完成选举。

但是环算法实用价值很少,因为在选举过程中如果有进程崩溃,选举就无法完成,不符合liveness的要求。

实际生产中的Leader Election

用Paxos-like (Paxos是解决一致性问题的一种方法) 来选举。

Google Chubby

A system for locking

每个process最多选举一次,得到最多选票且大于某一数值的process当选。

Apache Zookeeper

Centralized service for maintaining configuration information

Paxos的变种Zab(Zookeeper Atomic Broadcast)。必须始终保持有leader。

每个进程都向ZK文件系统中写入自己的ID,只要保证写入是原子性的,就把最大ID的进程选为leader.

每个进程都监视着正好比自己ID高的进程,如果那个进程是leader然后挂掉了,那么它就成为新的leader.

Bully Algorithm 霸道算法

假设系统是同步的,所有进程都可以互相通信。当某一进程发现leader挂掉,如果自己ID最大,就宣布自己是leader,否则向ID比自己高的进程发起选举。发起选举如果没有收到回应,就宣布自己是leader,收到了回应就等待比自己ID大的进程宣布结果。
当一个进程收到从ID比自己低的进程发来的选举消息时,就向更高的进程发起选举。

最坏时间复杂度分析:只需5个消息传递时间

  1. 最小ID进程发起选举
  2. 第二大ID进程回应
  3. 第二大ID进程向最大ID进程发起选举
  4. 最大ID进程无回应,timtout
  5. 第二大ID进程宣布当选

Leader Election 选举算法的更多相关文章

  1. zookeeper leader选举算法源码

    服务器状态 在QuorumPeer中有定义,这个类是一个线程. LOOKING:寻找Leader状态.处于该状态时,它会认为当前集群中没有Leader,进入选举流程. FOLLOWING: LEADI ...

  2. zookeeper系列之五—Leader选举算法

    leader选举算法 zookeeper server内部原理 zookeeper client

  3. zookeeper集群搭建及Leader选举算法源码解析

    第一章.zookeeper概述 一.zookeeper 简介 zookeeper 是一个开源的分布式应用程序协调服务器,是 Hadoop 的重要组件. zooKeeper 是一个分布式的,开放源码的分 ...

  4. ZooKeeper leader election

    Paxos是分布式应用中解决同步问题的核心.作为应用研发工程师,我们总是倾向于使用一种相对简洁的方式实现复杂的算法.ZooKeeper leader election实现就是一个非常好的参考. 其实现 ...

  5. 【原创】大数据基础之Zookeeper(3)选举算法

    提到zookeeper选举算法,就不得不提Paxos算法,因为zookeeper选举算法是Paxos算法的一个变种: Paxos要解决的问题是:在一个分布式网络环境中有众多的参与者,但是每个参与者都不 ...

  6. Zookeeper的选举算法和脑裂问题

    ZK介绍 ZK = zookeeper ZK是微服务解决方案中拥有服务注册发现最为核心的环境,是微服务的基石.作为服务注册发现模块,并不是只有ZK一种产品,目前得到行业认可的还有:Eureka.Con ...

  7. 从源码分析 MGR 的新主选举算法

    MGR 的新主选举算法,在节点版本一致的情况下,其实也挺简单的. 首先比较权重,权重越高,选为新主的优先级越高. 如果权重一致,则会进一步比较节点的 server_uuid.server_uuid 越 ...

  8. Zookeeper实现分布式选举算法

    分布式系统中经常采用Master/Slave架构.(截止到目前为止我还没有碰到过其他架构...)这种架构中如果Master发生故障就会导致整个集群停止服务,为了提高系统的高可用性通常采用选举算法来选出 ...

  9. 图解zookeeper FastLeader选举算法

    zookeeper当配置为群集模式,在启动或异常情况将被选举为的例子Leader.默认选择算法FastLeaderElection. 不知道zookeeper够考虑这样一个问题:某个服务能够配置为多个 ...

随机推荐

  1. web中的中文乱码处理

    1.页面设置pageEncoding="UTF-8" <%@ page contentType="text/html;charset=UTF-8" lan ...

  2. Zabbix 监控端口状态并邮件报警

    Zabbix监控端口 前提 zabbix安装 zabbix邮件报警 添加监控项 添加触发器 添加动作 设置完成后,在配置过报警媒介后也就是 邮件报警  后就完成了.

  3. 【英宝通Unity4.0公开课学习 】(三)脚本使用

    清明出去放松了一天. 看了下大姑爷,然后去大姑家吃了个午饭,下午三点左右出去找煤球耍,在他们学校和良乡镇逛了一下.当时感觉离北京好远好远啊... 其实不得不说现在的交通确实很方便,到哪都要不了几天,如 ...

  4. [leetcode]173. Binary Search Tree Iterator 二叉搜索树迭代器

    Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the ro ...

  5. VC小笔记

    1.strcpy不需要指定的长度,遇到被复制字符的串结束符’\0’才结束,容易溢出 2.memcpy(k, s, strlen(s)*sizeof(char)+1); // strlen(s) 后 + ...

  6. 运行代码后出现Process finished with exit code 0是为什么?

    Process finished with exit code 0 意味着你的程序正常执行完毕并退出. 可以科普一下exit code,在大部分编程语言中都适用: exit code 0 表示程序执行 ...

  7. src/lxml/includes/etree_defs.h:14:31: 致命错误:libxml/xmlversion.h:没有那个文件或目录

    fedora21平台下解决办法:yum install libxml-devel ubuntu下可以使用 apt-get intalll xxxx 如果仍然出现,可以尝试安装这两个包libxslt-d ...

  8. 【Sikuli】Sikuli 文档

    http://sikulix-2014.readthedocs.io/en/latest/index.html

  9. 关闭文件流--fclose,

    头文件:#include<stdio.h> 函数原型:int fclose(FILE *fp) 参数说明:fp将被关闭的文件指针 返回值:成功返回0,失败返回EOF宏.

  10. fastjson解析List对象

    List<String[]> body = JSON.parseObject(msg.getBody().toString(), new TypeToken<List<Stri ...