大数据学习(22)—— ZooKeeper能做些什么
官网上已经给出了zk的几种典型应用场景,原话是这么说的:
It exposes a simple set of primitives that distributed applications can build upon to implement higher level services for synchronization, configuration maintenance, and groups and naming.
它提供了一组简单的原语,让分布式应用可以实现更高层次的服务,比如同步、配置维护、命名服务等等。除了官方提到的这些用途之外,它还可以实现分布式锁、分布式协调通知、集群选主等功能。这里把几个重要的功能列出来,一起学习一下。
分布式锁
当多个进程需要同时访问一个共享资源的时候,为保证一致性或者是减少资源使用压力,可以只允许获取锁的进程访问。锁分为共享锁和排它锁两类。
排它锁
同一个时间只允许一个进程访问共享资源,锁释放后,其他等待进程能够得到通知。
1.调用zk的create方法,创建一个临时节点/lock,多个进程只会有一个创建成功。创建成功的进程获取锁,执行后续逻辑。
2.未创建成功的进程对该锁创建监听,获取锁的进程宕机或者正常结束后,一旦锁释放,马上进入抢锁动作。
当然,有些场景只需要一个进程抢到锁就行,比如redis里某个缓存值失效了,只应该有一个进程去查询数据写入缓存,避免发生击穿,这个时候就需要排它锁。
共享锁
对一个共享资源做读写操作,读写必须按照获取锁的顺序进行,避免写覆盖和读取脏数据。通过zk的临时序列节点实现。
/
├── /host1-R-000000001
├── /host2-R-000000002
├── /host3-W-000000003
├── /host4-R-000000004
├── /host5-R-000000005
├── /host6-R-000000006
└── /host7-W-000000007
多个事务读写时,按照上面的方式创建共享锁,R表示读,W表示写。
读请求在比自己序号小的最后一个写节点上注册监听,锁释放后可以读。
写请求在比自己序号小的最后一个节点上注册监听,锁释放后可以写。
命名服务
把服务名称、地址等信息放在zk节点中,需要的时候去取。比如,微服务的注册中心可以用zk实现,但是zk是cp模型,可能会短暂地停止服务,注册中心使用euraka这样的ap模型更好。
配置中心
依然是基于watcher来实现。发布者把数据发布到 ZooKeeper 的一个或一系列的节点上,供订阅者进行数据订阅,达到动态获取数据的目的。
前面说过,zk存储数据是kb级的数量级。那么配置中心中存储的数据具备这么几个特征:每条配置信息数据量小、配置会动态更新、多个服务共享同一配置信息。
实现步骤如下:
1.使用set命令把配置信息写入持久化znode中
2.应用启动时,读取znode里的配置信息,并增加watcher
3.使用set命令更新配置时,应用回调函数读取新的配置信息并更新参数
集群选主
大数据里很多技术在实现高可用的时候,都是通过zk来实现节点主备的。
实现步骤如下:
1.多个节点在zk创建同一个临时znode,谁创建成功了,谁就是主节点(active)
2.没创建成功的是备节点(standby),在znode上注册watcher
3.主节点宕机时,临时znode消失,zk通过watcher事件通知备节点抢主
其他
除了上述最核心的用法外,zk还可以通过简单的代码实现很多功能,等待着聪明的你去发现。
大数据学习(22)—— ZooKeeper能做些什么的更多相关文章
- 大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 图文详解
引言 在之前的大数据学习系列中,搭建了Hadoop+Spark+HBase+Hive 环境以及一些测试.其实要说的话,我开始学习大数据的时候,搭建的就是集群,并不是单机模式和伪分布式.至于为什么先写单 ...
- 大数据学习系列之五 ----- Hive整合HBase图文详解
引言 在上一篇 大数据学习系列之四 ----- Hadoop+Hive环境搭建图文详解(单机) 和之前的大数据学习系列之二 ----- HBase环境搭建(单机) 中成功搭建了Hive和HBase的环 ...
- 大数据学习系列之六 ----- Hadoop+Spark环境搭建
引言 在上一篇中 大数据学习系列之五 ----- Hive整合HBase图文详解 : http://www.panchengming.com/2017/12/18/pancm62/ 中使用Hive整合 ...
- 大数据学习:storm流式计算
Storm是一个分布式的.高容错的实时计算系统.Storm适用的场景: 1.Storm可以用来用来处理源源不断的消息,并将处理之后的结果保存到持久化介质中. 2.由于Storm的处理组件都是分布式的, ...
- 大数据学习之Hadoop快速入门
1.Hadoop生态概况 Hadoop是一个由Apache基金会所开发的分布式系统集成架构,用户可以在不了解分布式底层细节情况下,开发分布式程序,充分利用集群的威力来进行高速运算与存储,具有可靠.高效 ...
- 大数据学习(一) | 初识 Hadoop
作者: seriouszyx 首发地址:https://seriouszyx.top/ 代码均可在 Github 上找到(求Star) 最近想要了解一些前沿技术,不能一门心思眼中只有 web,因为我目 ...
- 大数据学习笔记——Java篇之集合框架(ArrayList)
Java集合框架学习笔记 1. Java集合框架中各接口或子类的继承以及实现关系图: 2. 数组和集合类的区别整理: 数组: 1. 长度是固定的 2. 既可以存放基本数据类型又可以存放引用数据类型 3 ...
- 大数据学习路线,来qun里分享干货,
一.Linux lucene: 全文检索引擎的架构 solr: 基于lucene的全文搜索服务器,实现了可配置.可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面. 推荐一个大数据学习群 ...
- 大数据篇:Zookeeper
Zookeeper 1 Zookeeper概念 Zookeeper是什么 是一个基于观察者设计模式的分布式服务管理框架,它负责和管理需要关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Z ...
- 大数据学习(16)—— HBase环境搭建和基本操作
部署规划 HBase全称叫Hadoop Database,它的数据存储在HDFS上.我们的实验环境依然基于上个主题Hive的配置,参考大数据学习(11)-- Hive元数据服务模式搭建. 在此基础上, ...
随机推荐
- 08-ADMM算法
08-ADMM算法 目录 一.ADMM 算法动机 二.对偶问题 三.对偶上升法 四.对偶分割 五.乘子法(增广拉格朗日函数) 5.1 步长为 $\rho$ 的好处 六.ADMM算法 6.1 ADMM ...
- golang 写文件--详细解释
1,不覆盖指定的文件 先看代码怎么写,下面再具体解释. func writeToFile(msg string) { f, err := os.OpenFile("/home/mingbai ...
- 【Azure API 管理】APIM集成内网虚拟网络后,启用自定义路由管理外出流量经过防火墙(Firewall),遇见APIs加载不出来问题
问题描述 使用 Azure 虚拟网络,Azure APIM 可以管理无法通过 Internet 访问的 API,达到以保护企业内部的后端API的目的.在虚拟网络中,启用网络安全组(NSG:Networ ...
- 单片机项目中使用新IC芯片的调试方法
前两天,一位小伙伴咨询我一款新IC芯片怎么使用,借此机会我顺便把我日常工作中经常用到的一种调试方法介绍给小伙伴们,希望对对大家有所帮助.准备仓促,文中难免有技术性错误,欢迎大家给予指正,并给出好的建议 ...
- 解决List遍历删除元素提示ConcurrentModificationException
JDK1.8提供新的API ===> removeIf public static void main(String[] args) { List<String> list = ...
- 浅读tomcat架构设计之tomcat容器Container(3)
浅读tomcat架构设计和tomcat启动过程(1) https://www.cnblogs.com/piaomiaohongchen/p/14977272.html 浅读tomcat架构设计之tom ...
- 资源:VMware秘钥许可证
一. 激活密钥 YG5H2-ANZ0H-M8ERY-TXZZZ-YKRV8 UG5J2-0ME12-M89WY-NPWXX-WQH88 UA5DR-2ZD4H-089FY-6YQ5T-YPRX6 GA ...
- Java:Java的堆区、栈区和方法区详解
Java内存空间理解 堆:堆主要存放Java在运行过程中new出来的对象,凡是通过new生成的对象都存放在堆中,对于堆中的对象生命周期的管理由Java虚拟机的垃圾回收机制GC进行回收和统一管理.类的非 ...
- hadoop学习(三)HDFS常用命令以及java操作HDFS
一.HDFS的常用命令 1.查看根目录下的信息:./hadoop dfs -ls 2.查看根目录下的in目录中的内容:./hadoop dfs -ls in或者./hadoop dfs -ls ./i ...
- IntelliJ idea -- 在WEB-INF下创建两个文件夹:classes 和 lib
1.首先在WEB-INF下面创建两个文件夹 classes 和 lib 2.文件 --> 项目结构 3.选择路径 4.选择依赖项 5.选择刚创建好的lib文件夹,然后确定 6.选择 Jar D ...