选主

使用ZooKeeper选主的一个简单方法是,在创建znode时使用Sequence和Ephemeral标志。主要思想是,使用一个znode,比如"/election",每个客户端创建一个子节点"/election/guid-n_",并同时使用Sequence和Ephemeral标志。使用sequence标志后ZooKeeper会自动递增序列号。拥有最小编号的节点就是主节点。

这还不是全部,同时还需要watch主节点的失效,在当前主节点失效后,会产生新的主节点。一般情况是所有节点都监视着最小的那个节点,并在主节点失效时检查自己是否成为新的主节点(由于使用了ephemeral,节点失效就会删除对应znode)。但是这会造成羊群效应,当前主节点失效,所有其他进程都会收到通知,并运行getChildren来获得当前所有存活的节点。如果节点数量很大,就会导致ZooKeeper的工作量激增。为了避免羊群效应,可以只监视比自己小的那个节点。如果一个客户端收到一个watch通知,它就成为新的主节点。这样就避免所有节点监视一个节点导致的羊群效应。

伪代码

假设ELECTION是用于选主的路径。为了竞选主节点:

1.创建znode z路径为"ELECTION/guid-n_"并同时使用SEQUENCE和EPHEMERAL

2.假设C是"ELECTION"的子节点集,i是z的序列号

3.监视"ELECTION/guid-n_j",j是仅次于自己的序列号。j<i且在C中存在n_j节点

在被监视节点删除后收到通知:

1.假设C是ELECTION最新的子节点集

2.如果z是C中最小的节点,则进行主节点的工作

3.不然监视"ELECTION/guid-n_j",j是仅次于自己的序列号。j<i且在C中存在n_j节点

注意

  • 如果一个znode是最小的节点,并不代表它知道自己是主节点,所以可以通过在一个不同的目录创建节点来标识已经完成主节点的操作。
  • guid的使用可以参考可恢复错误和GUID

Curator实现

Leader Latch

public LeaderLatch(CuratorFramework client,
String latchPath)
/**
client 客户端实例
latchPath 选举路径
**/ leaderLatch.start(); //开启选举
leaderLatch.heasLeadership() //返回是否为主节点
leaderLatch.await(); //等待直到成为主节点
leaderLatch.close(); //关闭

Leader Election

public LeaderSelector(CuratorFramework client,
String mutexPath,
LeaderSelectorListener listener)
/**
client 客户端实例
mutexPath 选举路径
listener 被选中后的监听器
**/ leaderSelector.start(); //开启选举
leaderSelector.close(); //关闭选举

[译]ZOOKEEPER RECIPES-Leader Election的更多相关文章

  1. Zookeeper 学习笔记之 Leader Election

    ZooKeeper四种节点类型: Persist Persist_Sequential Ephemeral Ephemeral_Sequential 在节点上可注册的Watch,客户端先得到通知再得到 ...

  2. Kafka学习笔记(4)----Kafka的Leader Election

    1. Zookeeper的基本操作 zookeeper中的节点可以持久化/有序的两个维度分为四种类型: PERSIST:持久化无序(保存在磁盘中) PERSIST_SEQUENTIAL:持久化有序递增 ...

  3. Leader Election

    Leader Election Zookeeper的基本操作 Zookeeper虽然是分布式系统,但它并不是为文件存储而设计的,Zookeeper里存储的一般是配置信息和源信息.实际上,Zookeep ...

  4. ZooKeeper leader election

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

  5. [译]ZooKeeper recipes-引言

    ZooKeeper高级应用 本系列将指导使用ZooKeeper来实现高级功能,所有功能都在客户端完成,不需要ZooKeeper的特殊支持.希望可以得到社区的支持将这些加入到一个标准的客户端类库中(Cu ...

  6. ZooKeeper Recipes and Solutions 翻译

    ZooKeeper 秘诀 与解决方案 A Guide to Creating Higher-level Constructs with ZooKeeper Out of the Box Applica ...

  7. ZooKeeper Recipes and Solutions

    原文地址:http://zookeeper.apache.org/doc/current/recipes.html 参考:https://zookeeper.apache.org/doc/trunk/ ...

  8. Leader Election 选举算法

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

  9. zookeeper应用 - leader选举 锁

    模拟leader选举: 1.zookeeper服务器上有一个/leader节点 2.在/leader节点下创建短暂顺序节点/leader/lock-xxxxxxx 3.获取/leader的所有子节点并 ...

随机推荐

  1. 微信小程序开发心得

    微信小程序也已出来有一段时间了,最近写了几款微信小程序项目,今天来说说感受. 首先开发一款微信小程序,最主要的就是针对于公司来运营的,因为,在申请appid(微信小程序ID号)时候,需要填写相关的公司 ...

  2. 如何一步一步用DDD设计一个电商网站(五)—— 停下脚步,重新出发

    阅读目录 前言 单元测试 纠正错误,重新出发 结语 一.前言 实际编码已经写了2篇了,在这过程中非常感谢有听到观点不同的声音,借着这个契机,今天这篇就把大家提出的建议一个个的过一遍,重新整理,重新出发 ...

  3. Windows server 2012 添加中文语言包(英文转为中文)(离线)

    Windows server 2012 添加中文语言包(英文转为中文)(离线) 相关资料: 公司环境:亚马孙aws虚拟机 英文版Windows2012 中文SQL Server2012安装包,需要安装 ...

  4. Redis/HBase/Tair比较

    KV系统对比表 对比维度 Redis Redis Cluster Medis Hbase Tair 访问模式    支持Value大小 理论上不超过1GB(建议不超过1MB) 理论上可配置(默认配置1 ...

  5. [原]一个针对LVS的压力测试报告

    LVS 测试报告 测试计划 基本功能测试 流量压力测试 响应时间测试 配置正确性测试 灾难恢复测试 测试点 基本功能测试 客户端IP地址正确性 RealServer 访问Internet测试(包括Ip ...

  6. 编写高质量代码:改善Java程序的151个建议(第8章:多线程和并发___建议126~128)

    建议126:适时选择不同的线程池来实现 Java的线程池实现从根本上来说只有两个:ThreadPoolExecutor类和ScheduledThreadPoolExecutor类,这两个类还是父子关系 ...

  7. 深入理解 JavaScript,以及 Linux 下的开发调试工具

    前言 JavaScript 是我接触到的第二门编程语言,第一门是 C 语言.然后才是 C++.Java 还有其它一些什么.所以我对 JavaScript 是非常有感情的,毕竟使用它有十多年了.早就想写 ...

  8. arcgis api for js入门开发系列六地图分屏对比(含源代码)

    上一篇实现了demo的地图标绘模块,本篇新增地图地图分屏对比模块,截图如下(源代码见文章底部): 对效果图的简单介绍一下,在demo只采用了两分屏对比,感兴趣的话,可以在两分屏的基础上拓展,修改css ...

  9. Android 微信第三方登录(个人笔记)

    今天在写微信登录,花了半天时间搞定.然后写下自己的笔记,希望帮助更多的人...欢迎各位指教. 微信授权登录,官方说的不是很清楚.所以导致有一部分的坑. 微信注册应用平台的应用签名,下载 微信签名生成工 ...

  10. ASP.NET Aries 4.0 开源发布:已完成基础功能优化重写

    主要更新: 1:增加AR.Global.GetUser() 方法返回当前登陆者的用户信息. 2:重写AR.Combobox 支持下拉树. 3:调整及扩展Input下拉的配置参数. 4:优化及新增AR. ...