选主

使用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. 【.net 深呼吸】细说CodeDom(8):分支与循环

    有人会问,为啥 CodeDom 不会生成 switch 语句,为啥没生成 while 语句之类.要注意,CodeDom只关心代码逻辑,而不是语法,语法是给写代码的人用的.如果用.net的“反编译”工具 ...

  2. App开发:模拟服务器数据接口 - MockApi

    为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...

  3. boosting、adaboost

    1.boosting Boosting方法是一种用来提高弱分类算法准确度的方法,这种方法通过构造一个预测函数系列,然后以一定的方式将他们组合成一个预测函数.他是一种框架算法,主要是通过对样本集的操作获 ...

  4. 从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点)

    从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...

  5. 用html5的canvas和JavaScript创建一个绘图程序

    本文将引导你使用canvas和JavaScript创建一个简单的绘图程序. 创建canvas元素 首先准备容器Canvas元素,接下来所有的事情都会在JavaScript里面. <canvas ...

  6. iOS架构一个中型普通App的一些经验总结

    这一版比较完善的的App终于提交审核了.有时间写写自己的一些经验的总结了.自己主导的从0到比较成型的app到目前来说也只有两个,但是其中的很多东西都是大同小异.基本上是想到了什么就写什么,感觉写的不到 ...

  7. Performance Monitor4:监控SQL Server的IO性能

    SQL Server的IO性能受到物理Disk的IO延迟和SQL Server内部执行的IO操作的影响.在监控Disk性能时,最主要的度量值(metric)是IO延迟,IO延迟是指从Applicati ...

  8. web 前端(轮番插件)

    <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8& ...

  9. iOS 自定义方法 - 不完整边框

    示例代码 ///////////////////////////OC.h////////////////////////// ////  UIView+FreeBorder.h//  BHBFreeB ...

  10. git基本操作

    一.在Windows平台上安装Git,可以下载一个msysGit的安装包,点击exe即可安装运行.安装包下载地址:https://git-for-windows.github.io/备注:git命令行 ...