zookeeper集群搭建及常用场景实现
本文完整源码地址
基于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 发现自己下面的子节点满足指定个数,就可以进行下一步按序进行处理了。
关键代码
分布式锁
分布式队列
入队:
出队:
选举
参考文献
- zookeeper集群搭建.https://juejin.im/post/5ba879ce6fb9a05d16588802
- 分布式服务框架 Zookeeper — 管理分布式环境中的数据.https://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/index.html
- ZooKeeper典型应用场景一览.http://jm.taobao.org/2011/10/08/1232/
- Zookeeper源码分析目录.https://www.cnblogs.com/leesf456/p/6518040.html
zookeeper集群搭建及常用场景实现的更多相关文章
- zookeeper集群搭建及Leader选举算法源码解析
第一章.zookeeper概述 一.zookeeper 简介 zookeeper 是一个开源的分布式应用程序协调服务器,是 Hadoop 的重要组件. zooKeeper 是一个分布式的,开放源码的分 ...
- java 学习笔记(三)ZooKeeper集群搭建实例,以及集成dubbo时的配置 (转)
ZooKeeper集群搭建实例,以及集成dubbo时的配置 zookeeper是什么: Zookeeper,一种分布式应用的协作服务,是Google的Chubby一个开源的实现,是Hadoop的分布式 ...
- Zookeeper集群搭建及原理
1 概述 1.1 简介 ZooKeeper 是 Apache 的一个顶级项目,为分布式应用提供高效.高可用的分布式协调服务,提供了诸如数据发布/订阅.负载均衡.命名服务.分布式协调/通知和分布式锁等分 ...
- 分布式架构中一致性解决方案——Zookeeper集群搭建
当我们的项目在不知不觉中做大了之后,各种问题就出来了,真jb头疼,比如性能,业务系统的并行计算的一致性协调问题,比如分布式架构的事务问题, 我们需要多台机器共同commit事务,经典的案例当然是银行转 ...
- kafka学习(二)-zookeeper集群搭建
zookeeper概念 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名 服务等.Zookeeper是h ...
- 分布式协调服务Zookeeper集群搭建
分布式协调服务Zookeeper集群搭建 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装jdk环境 1>.操作环境 [root@node101.yinzhengjie ...
- Zookeeper 集群搭建--单机伪分布式集群
一. zk集群,主从节点,心跳机制(选举模式) 二.Zookeeper集群搭建注意点 1.配置数据文件 myid 1/2/3 对应 server.1/2/3 2.通过./zkCli.sh -serve ...
- Zookeeper集群搭建以及python操作zk
一.Zookeeper原理简介 ZooKeeper是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等. Zookeeper设计目 ...
- Kafka学习之(五)搭建kafka集群之Zookeeper集群搭建
Zookeeper是一种在分布式系统中被广泛用来作为:分布式状态管理.分布式协调管理.分布式配置管理.和分布式锁服务的集群.kafka增加和减少服务器都会在Zookeeper节点上触发相应的事件kaf ...
随机推荐
- 30441数据定义语言DDL
数据定义:指对数据库对象的定义.删除和修改操作. 数据库对象主要包括数据表.视图.索引等. 数据定义功能通过CREATE.ALTER.DROP语句来完成. 按照操作对象分类来介绍数据定义的SQL语法. ...
- String的所有方法以及解释
capitalize() 把字符串的第一个字符改为大写 casefold() 把整个字符串的所有字符改为小写 center(width) 将字符串居中,并使用空格填充至长度 width 的新字符串 c ...
- Spring Framework 组件注册 之 @Import
Spring Framework 组件注册 之 @Import 写在前面 向spring中注册组件或者叫javaBean是使用spring的功能的前提条件.而且spring也提供了很多种方式,让我们可 ...
- Java NIO 学习笔记(二)----聚集和分散,通道到通道
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- 一道关于String的面试题,新鲜出炉,刚被坑过,趁热!!
很多人都会答错的一道关于String的题目,究竟有什么难度? 我们一起来看一道关于String的面试题,准确说是改编的面试题! 准备好啦?在放大招之前先来一个小招式 String s1 = new S ...
- Linux 中文件和文件夹获取 MySQL 权限(SELinux)
今天在 Linux 系统上移动 MySQL 的数据库目录 配置如下: /etc/my.cnf [mysqld]datadir=/home/mysqlsocket=/var/lib/mysql/mysq ...
- spring-boot-plus后台快速开发框架1.0.0.RELEASE发布了
spring-boot-plus spring-boot-plus是一套集成spring boot常用开发组件的后台快速开发框架 官网地址:springboot.plus GITHUB:https:/ ...
- [apue] 测试管道容量的一些疑问
所谓管道的容量,指不消费(读)的情况下,最大能写入的数据量.有两种方式来测试一个管道的容量: 1)使用阻塞写,每次写一个字节,并打印写入的总字节数,最后写入阻塞时,上次打印的就是管道的容量: 2)使用 ...
- 深入学习Spring框架(一)- 入门
1.Spring是什么? Spring是一个JavaEE轻量级的一站式开发框架. JavaEE: 就是用于开发B/S的程序.(企业级) 轻量级:使用最少代码启动框架,然后根据你的需求选择,选择你喜欢的 ...
- NetCore AutoMapper的封装
需要引用AutoMapper的Nuget包 如果需要忽略某个字段就在字段上面打标签如下: [IgnoreMap] public string IgnoreValue { get; set; } ...