选主

使用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. Android SwipeRefreshLayout 下拉刷新——Hi_博客 Android App 开发笔记

    以前写下拉刷新 感觉好费劲,要判断ListView是否滚到顶部,还要加载头布局,还要控制 头布局的状态,等等一大堆.感觉麻烦死了.今天学习了SwipeRefreshLayout 的用法,来分享一下,有 ...

  2. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  3. Scrapy框架爬虫初探——中关村在线手机参数数据爬取

    关于Scrapy如何安装部署的文章已经相当多了,但是网上实战的例子还不是很多,近来正好在学习该爬虫框架,就简单写了个Spider Demo来实践.作为硬件数码控,我选择了经常光顾的中关村在线的手机页面 ...

  4. .NET Core系列 : 2 、project.json 这葫芦里卖的什么药

    .NET Core系列 : 1..NET Core 环境搭建和命令行CLI入门 介绍了.NET Core环境,本文介绍.NET Core中最重要的一个配置文件project.json的相关内容.我们可 ...

  5. Android带加减的edittext

    看了网上这样自带加减的edittext写得好复杂,还有各种监听事件,我觉得没有必有.于是我自己写了一个. 我这个edittext仅仅限制整数,每次加减1. public class TestEditT ...

  6. java单向加密算法小结(1)--Base64算法

    从这一篇起整理一下常见的加密算法以及在java中使用的demo,首先从最简单的开始. 简单了解 Base64严格来说并不是一种加密算法,而是一种编码/解码的实现方式. 我们都知道,数据在计算机网络之间 ...

  7. python10作业思路及源码:类Fabric主机管理程序开发(仅供参考)

    类Fabric主机管理程序开发 一,作业要求 1, 运行程序列出主机组或者主机列表(已完成) 2,选择指定主机或主机组(已完成) 3,选择主机或主机组传送文件(上传/下载)(已完成) 4,充分使用多线 ...

  8. Centos6.5 配置Nginx开机自启动

    1.在/etc/init.d/目录下创建 nginx 文件,内容如下: #!/bin/sh # # nginx - this script starts and stops the nginx dae ...

  9. Linux实战教学笔记03:操作系统发展历程及系统版本选择

    标签(空格分隔): Linux实战教学笔记-陈思齐 第1章 Linux简介 1.1 什么是操作系统? 简单讲:操作系统就是一个人与计算机硬件的中介. 操作系统,英文名称Operating System ...

  10. Windows cmd 长时间不输出新内容 直到按下ctrl + c 取消或者回车的解决办法

    换了一台新电脑, 在使用 ant 拷贝大量文件的时候 cmd 窗口过了很久没有继续输出新的内容,远远超过平时的耗时, 以为已经卡死 按下 ctrl + c 取消, 这时并没有取消, 而是输出了新内容, ...