本文完整源码地址

基于zookeeper的常用用法、分布式锁、分布式队列及leader选举实现
https://github.com/killianxu/zookeeper_example

zookeeper集群搭建

1.linux下安装jdk
yum list java*
yum install java-1.8.0-openjdk-devel.x86_64
查看jdk是否安装:java -version
2.下载apache-zookeeper-3.5.5-bin.tar.gz,tar -zxvf解压
3.进入conf目录,将zoo_sample.cfg重命名为zoo.cfg,改配置文件如下,其中server.1、server.2、server.3表示zookeeper集群服务器,以server.1为例,1表示服务器server id,用于标识服务器,106.52.210.34表示服务器ip,2881端口Leader和Follower或Observer交换数据使用,3881端口用于选举。clientPort表示客户端连接服务器的端口。

4.dataDir 目录下创建名为 myid 的文件,在文件第一行写上对应的 Server id。
5.执行./zkServer.sh start,开启zookeeper服务器进程。
6../zkServer.sh status查看zookeeper进程状态。

zookeeper基本概念及用法

zookeeper内部数据模型类似目录树,每个节点称为zNode,每个节点可以存储数据且可以有子节点。每个zNode根据路径去标识,比如/app1/p_1表示p_1节点,zNode节点有版本的概念,且zNode节点可以被监控,当节点数据或子节点发生变化,监控程序可以收到通知。zNode节点有四种类型,分别为:持久节点(PERSISTENT)、持久顺序节点(PERSISTENT_SEQUENTIAL)、临时节点(EPHEMERAL)、临时顺序节点(EPHEMERAL_SEQUENTIAL)。PERSISTENT节点创建后,就一直存在,直到有删除操作来主动清除这个节点。PERSISTENT_SEQUENTIAL在持久节点的基础上,在创建节点过程中,ZK会自动为给定节点名加上一个数字后缀,作为新的节点名。EPHEMERAL
客户端会话失效,这个节点就会自动被清除掉。EPHEMERAL_SEQUENTIAL在EPHEMERAL基础上ZK会自动为给定节点名加上一个数字后缀。

zookeeper编程实例:

运行结果如下:

zookeeper应用场景

1.配置中心,发布者将数据发布到ZK节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新。例如全局的配置信息,服务式服务框架的服务地址列表等就非常适合使用。(数据量很小,但是数据更新可能会比较快的场景)
2.负载均衡,指软负载均衡。在分布式环境中,为了保证高可用性,通常同一个应用或同一个服务的提供方都会部署多份,达到对等服务。而消费者就须要在这些对等的服务器中选择一个来执行相关的业务逻辑,其中比较典型的是消息中间件中的生产者,消费者负载均衡。比如生产者根据分区信息轮询发送到不同分区。
3.命名服务(Naming Service),在分布式系统中,通过使用命名服务,客户端应用能够根据指定名字来获取资源或服务的地址,提供者等信息。被命名的实体通常可以是集群中的机器,提供的服务地址,远程对象等等——这些我们都可以统称他们为名字(Name)。其中较为常见的就是一些分布式服务框架中的服务地址列表。通过调用ZK提供的创建节点的API,能够很容易创建一个全局唯一的path,这个path就可以作为一个名称。
4.分布式通知/协调,watcher注册与异步通知机制,能够很好的实现分布式环境下不同系统之间的通知与协调,实现对数据变更的实时处理。
5.集群管理与Master选举。集群机器监控,快速对集群中机器变化作出响应。过去的做法通常是:监控系统通过某种手段(比如ping)定时检测每个机器,或者每个机器自己定时向监控系统汇报“我还活着”。 这种做法可行,但是存在两个比较明显的问题:集群中机器有变动的时候,牵连修改的东西比较多;有一定的延时。利用ZooKeeper有两个特性,就可以实时另一种集群机器存活性监控系统:客户端在节点 x 上注册一个Watcher,那么如果 x的子节点变化了,会通知该客户端;创建EPHEMERAL类型的节点,一旦客户端和服务器的会话结束或过期,那么该节点就会消失。
集群master选举,所有参与选举的机器像zookeeper发起创建EPHEMERAL_SEQUENTIAL类型节点,都允许创建成功,选取创建zNode编号最小的机器为master,每个机器监控比它小的下一个编号节点。比它小一号的节点被删除,则收到通知自己变成master节点。
6.分布式锁,锁服务可以分为两类,一个是保持独占,另一个是控制时序。所谓保持独占,就是所有试图来获取这个锁的客户端,最终只有一个可以成功获得这把锁。通常的做法是把zk上的一个znode看作是一把锁,通过create znode的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。 控制时序,就是所有视图来获取这个锁的客户端,最终都是会被安排执行,只是有个全局时序了。做法和上面基本类似,只是这里 /distribute_lock 已经预先存在,客户端在它下面创建临时有序节点(这个可以通过节点的属性控制:CreateMode.EPHEMERAL_SEQUENTIAL来指定)。Zk的父节点(/distribute_lock)维持一份sequence,保证子节点创建的时序性,从而也形成了每个客户端的全局时序。
7.分布式队列,一种是常规的先进先出队列,另一种是要等到队列成员聚齐之后的才统一按序执行。先进先出队列和分布式锁类似,在 /queue 这个znode下预先建立一个/queue/num 节点,并且赋值为n(或者直接给/queue赋值n),表示队列大小,之后每次有队列成员加入后,就判断下是否已经到达队列大小,决定是否可以开始执行了。这种用法的典型场景是,分布式环境中,一个大任务Task A,需要在很多子任务完成(或条件就绪)情况下才能进行。这个时候,凡是其中一个子任务完成(就绪),那么就去 /taskList 下建立自己的临时时序节点(CreateMode.EPHEMERAL_SEQUENTIAL),当 /taskList 发现自己下面的子节点满足指定个数,就可以进行下一步按序进行处理了。

关键代码

分布式锁

分布式队列

入队:

出队:

选举

参考文献

  1. zookeeper集群搭建.https://juejin.im/post/5ba879ce6fb9a05d16588802
  2. 分布式服务框架 Zookeeper — 管理分布式环境中的数据.https://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/index.html
  3. ZooKeeper典型应用场景一览.http://jm.taobao.org/2011/10/08/1232/
  4. Zookeeper源码分析目录.https://www.cnblogs.com/leesf456/p/6518040.html

zookeeper集群搭建及常用场景实现的更多相关文章

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

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

  2. java 学习笔记(三)ZooKeeper集群搭建实例,以及集成dubbo时的配置 (转)

    ZooKeeper集群搭建实例,以及集成dubbo时的配置 zookeeper是什么: Zookeeper,一种分布式应用的协作服务,是Google的Chubby一个开源的实现,是Hadoop的分布式 ...

  3. Zookeeper集群搭建及原理

    1 概述 1.1 简介 ZooKeeper 是 Apache 的一个顶级项目,为分布式应用提供高效.高可用的分布式协调服务,提供了诸如数据发布/订阅.负载均衡.命名服务.分布式协调/通知和分布式锁等分 ...

  4. 分布式架构中一致性解决方案——Zookeeper集群搭建

    当我们的项目在不知不觉中做大了之后,各种问题就出来了,真jb头疼,比如性能,业务系统的并行计算的一致性协调问题,比如分布式架构的事务问题, 我们需要多台机器共同commit事务,经典的案例当然是银行转 ...

  5. kafka学习(二)-zookeeper集群搭建

    zookeeper概念 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名 服务等.Zookeeper是h ...

  6. 分布式协调服务Zookeeper集群搭建

    分布式协调服务Zookeeper集群搭建 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装jdk环境 1>.操作环境 [root@node101.yinzhengjie ...

  7. Zookeeper 集群搭建--单机伪分布式集群

    一. zk集群,主从节点,心跳机制(选举模式) 二.Zookeeper集群搭建注意点 1.配置数据文件 myid 1/2/3 对应 server.1/2/3 2.通过./zkCli.sh -serve ...

  8. Zookeeper集群搭建以及python操作zk

    一.Zookeeper原理简介 ZooKeeper是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等. Zookeeper设计目 ...

  9. Kafka学习之(五)搭建kafka集群之Zookeeper集群搭建

    Zookeeper是一种在分布式系统中被广泛用来作为:分布式状态管理.分布式协调管理.分布式配置管理.和分布式锁服务的集群.kafka增加和减少服务器都会在Zookeeper节点上触发相应的事件kaf ...

随机推荐

  1. 从零开始的Wordpress个人博客搭建

    0x00前言 在博客园写了有一年的博客了,也想换换新口味,wordpress的众多的主题和个性化设置非常符合我的喜好,所以捣鼓了一天也算是把它搭好了. 直接在服务器上搭建wordpress还需要配置m ...

  2. ThreadLocal使用原理、注意问题、使用场景

    想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理.首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码 ...

  3. springboot 集成完整的swagger2

    springboot 在集成swagger中会不会遇到各种问题: 1.swagger  进行接口鉴权(比如设置header的token,接口进行拦截处理). 2.swagger 进行实体属性解析(po ...

  4. Netty源码分析--Channel注册(中)(六)

    接上一篇,我们继续看 不知道大家第一次看这段代码的时候有没有一脸懵逼,反正我是一脸懵,为什么这个if else 最终都是调用的register0方法,都是一样的. 其实这里就是为什么Netty是线程安 ...

  5. 微信小程序ES6方法Promise封装接口

    为何要封装接口? 有小程序开发的经验者,相信对微信API Request很熟悉了.对接接口时,有大部分的开发者都是直接调用request方法,去请求后台接口并渲染数据.诚然,直接使用api发起请求对接 ...

  6. Spring Boot2(六):使用Spring Boot整合AOP面向切面编程

    一.前言 众所周知,spring最核心的两个功能是aop和ioc,即面向切面和控制反转.本文会讲一讲SpringBoot如何使用AOP实现面向切面的过程原理. 二.何为aop ​ aop全称Aspec ...

  7. 44 | 测试先行:测试驱动开发(TDD)

  8. Python开发【第五篇】: 内置模块

    内容概要 二分查找.冒泡 random time os sys pickle json shelve re 1.二分查找和冒泡排序 01. 二分查找 二分查找也称折半查找(Binary Search) ...

  9. 测试调试-利用fiddler修改response返回结果

    测试前端过程中,经常需要验证各种功能状态.不同数据层级等返回后的展示效果.一般会通过以下三种方式进行测试: 1.构造满足条件的测试数据:(耗时费力) 2.修改数据库:(前提需要了解数据库数据存储.沟通 ...

  10. C# 创建Windows服务demo

    一.准备工作 1.操作系统:Windows 10 X64 2.开发环境:VS2017 3.编程语言:C# 4. .NET版本:.NET Framework 4.5 二.创建Windows Servic ...