ZooKeeper 实例 - Leader 选举

Leader 选举用于保证系统的高可用,例如一个重要服务,为防止其出现故障使服务中断,同时准备好另外2个备用,这就需要从3个服务节点中选出一个对外服务,这个服务出现故障后,从另两个服务节点中再选出一个对外提供服务,这个选主过程就是 Leader 选举

Leader 选举是 ZooKeeper 的一个主要应用场景,ZooKeeper 官网也给出了实现思路

实现思路

例如有3个服务,service_node1、service_node2、service_node3

在 ZooKeeper 的根路径下有一个持久节点 /ELECTION

3个服务启动时,都在 /ELECTION 下创建一个名称相同的临时顺序节点 /ELECTION/n_,因为是顺序型节点,ZooKeeper 会自动添加顺序编号

这样,3个服务就和 Zookeeper 中的节点建立起了对应关系

每个服务创建好节点后,获取 /ELECTION 下的所有子节点,看自己是不是编号最小的

sevice_node1 对应的 n_000000 是编号最小的,sevice_node1 成为 Leader

sevice_node2 与 sevice_node3 的编号不是最小的,便监听自己前面的那个节点

sevice_node2 监听 n_000001,sevice_node3 监听 n_000002

/ELECTION 下的某个节点被删除时,监听这个节点的服务就会得到通知

例如 service_node1 挂掉了,对应的 n_000000 会自动被删除(因为其是临时节点,创建节点的进程停止后,这个节点会被自动删除)

因为 service_node2 在监控 n_000000 ,n_000000 被删除后,service_node2 就会得到通知

service_node2 会再获取一次 /ELECTION 下的所有子节点 [ n_000002, n_000003 ],发现自己是编号最小的,成为 Leader

那么如果不是 service_node1 挂掉了,而是 service_node2 挂掉了,service_node3 便会得到通知

service_node3 获取 /ELECTION 下的所有子节点 [n_000000, n_000003],发现自己不是编号最小的,就监听排在自己前面的 n_000000

思路总结

所有client都在ZK的固定节点下创建临时顺序节点,然后看自己是不是编号最小的

如果是,成为 leader,否则,监听排在自己前面的节点状态变化

当某个节点被删除时,监听此节点的client获得通知,重新获取一遍所有子节点,看自己是不是编号最小的

如果是,成为 leader,否则,监听排在自己前面的节点状态变化

开源示例

github 上有按照官方思路实现的示例,项目地址

https://github.com/SainTechnologySolutions/allprogrammingtutorials/tree/master/apache-zookeeper/leader-election

其中的 dist 目录下存放了编译好的 jar 包,可以直接运行

运行示例

在3个命令终端下分别执行

java -jar leader-election-0.0.1-SNAPSHOT.jar 1 192.168.31.204:2181

192.168.31.204:2181 是 ZooKeeper 的 IP 和端口号

java -jar leader-election-0.0.1-SNAPSHOT.jar 2 192.168.31.204:2181

java -jar leader-election-0.0.1-SNAPSHOT.jar 3 192.168.31.204:2181

关掉终端 1,看终端 2 的反应,2 收到了 1 的删除事件,自己变成了编号最小的,成为新的 Leader

还有另一个实现示例,可以一起参考

https://github.com/perezrathke/zookeeper-leader-election

原文发布于微信公众号 - 性能与架构(yogoup)

原文发表时间:2016-08-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏林德熙的博客

dotnet core 2.1 使用阶梯编译

在 dotnet core 2.1 可以使用阶梯编译的方法,从 dotnet framework 开始,在代码的所有方法在第一次进入的时候就需要使用 JIT 进...

8610
来自专栏我有一个梦想

Python 项目实践三(Web应用程序) 第三篇

接着上节的继续学习,现在要显示所有主题的页面 有了高效的网页创建方法,就能专注于另外两个网页了:显示全部主题的网页以及显示特定主题中条目的网页。所有主题页面显示...

20380
来自专栏hbbliyong

Pyinstaller如何将资源文件一起打包至exe中

基本原理:Pyinstaller 可以将资源文件一起bundle到exe中,当exe在运行时,会生成一个临时文件夹,程序可通过sys._MEIPASS访问临时文...

29810
来自专栏张伟博客

SVN的备份及恢复

11840
来自专栏游戏杂谈

Flash Builder 4安装SVN插件

flash builder与eclipse类似,装插件的方法也差不多。唯一要注意的时候是选择包的问题,如下图所示:

15630
来自专栏bboysoul

fedora安装pyenv实现python的版本管理

curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv...

10420
来自专栏磨磨谈

Cephfs 操作输出到日志查询系统

文件系统当中如果某些文件不见了,有什么办法判断是删除了还是自己不见了,这个就需要去日志里面定位了,通常情况下是去翻日志,而日志是会进行压缩的,并且查找起来非常的...

14830
来自专栏云计算教程系列

如何在Ubuntu 14.04上安装和配置Naxsi

Naxsi是第三方Nginx模块,提供Web应用程序防火墙功能。它为您的Web服务器带来了额外的安全性,并保护您的服务器免受各种Web攻击,如XSS和SQL的注...

21800
来自专栏杨建荣的学习笔记

vi的补充学习(r4笔记第25天)

今天突然发现vi虽然用了些日子了,但是常用的一些命令之外,还是有些命令比较生疏,简单总结了一下,然后自己在vi里面编辑了一把,效果还不错。 对于大家比较熟悉且常...

339100
来自专栏向治洪

ngnix服务器搭建

 1.  到nginx官网上下载相应的安装包,http://nginx.org/en/download.html;下载进行解压,将解压后的文件放到自己心仪的目...

25890

扫码关注云+社区

领取腾讯云代金券