zookeeper简绍
先一句话概括下zookeeper:zookeeper可谓是目前使用最广泛的分布式组件了。其功能和职责单一,但却非常重要。
zookeeper到底是什么?(技术文)
1)zookeeper实际上是yahoo开发的,用于分布式中一致性处理的框架。
2)背景介绍:最初其作为研发Hadoop时的副产品。由于分布式系统中一致性处理较为困难,其他的分布式系统没有必要 费劲重复造轮子,故随后的分布式系统中大量应用了zookeeper。故随后的大部分分布式系统中大量应用了zookeeper,以至于zookeeper成为了各种分布式系统的基础组件,其地位之重要,可想而知。(类比下之前学习过的netty,netty是对 socket 网络编程的优秀包装,是一个通讯组件框架。不了解netty的可以先收藏本文,再花五分钟学习下这么说吧,Netty很简单,其实就是个Jar包,是作为通讯组件用的)
3 ) 具体应用场景:著名的hadoop、kafka、dubbo 都是基于zookeeper而构建。
4)好处:保证在分布式环境下数据的最终一致性,这个就是zookeeper能解决的问题。
5)上面提到了很多次一致性,那么究竟什么是一致性,给大家补充下这个概念:
所谓的一致性,实际上就是围绕着“看见”来的。谁能看见?能否看见?什么时候看见?举个例子:淘宝后台卖家,在后台上架一件大促的商品,通过服务器A提交到主数据库,假设刚提交后立马就有用户去通过应用服务器B去从数据库查询该商品,就会出现一个现象,卖家已经更新成功了,然而买家却看不到;而经过一段时间后,主数据库的数据同步到了从数据库,买家才能查到。(真技术文)
假设卖家更新成功之后买家立马就能看到卖家的更新,则称为强一致性;
如果卖家更新成功后买家不能看到卖家更新的内容,则称为弱一致性;
而卖家更新成功后,买家经过一段时间最终能看到卖家的更新,则称为最终一致性。
6)再补充一些常见的解决一致性问题的方式:
查询重试补偿。对于分布式应用中不确定的情况,先使用查询接口查询到当前状态,如果当前状态不一致则采用补偿接口对状态进行重试推进,或者回滚接口对业务做回滚。典型的场景如银行跟支付宝之间的交互。支付宝发送一个转账请求到银行,如一直未收到响应,则可以通过银行的查询接口查询该笔交易的状态,如该笔交易对方未收到,则采取补偿的模式进行推送。
定时任务推送。对于上面的情况,有可能一次推送搞不定,于是需要2次,3次推送。不要怀疑,支付宝内最初掉单率很高,全靠后续不断的定时任务推送增加成功率。
TCC。try-confirm-cancel。实际上是两阶段协议,第二阶段的可以实现提交操作或是逆操作。
7)zookeeper到底能做什么?前面提到hadoop、kafka、dubbo 都是基于zookeeper而构建,这里,我就以dubbo来具体阐述zookeeper。(真真技术文)
作为业界知名的分布式SOA框架,dubbo的主要的服务注册发现功能便是由zookeeper来提供的。
对于一个服务框架,注册中心是其核心中的核心,虽然暂时挂掉并不会导致整个服务出问题,但是一旦挂掉,整体风险就很高。考虑一般情况,注册中心就是单台机器的时候,其实现很容易,所有机器起来都去注册服务给它,并且所有调用方都跟它保持长连接,一旦服务有变,即通过长连接来通知到调用方。但是当服务集群规模扩大时,这事情就不简单了,单机保持连接数有限,而且容易故障。
作为一个稳定的服务化框架,dubbo可以选择并推荐zookeeper作为注册中心。其底层将zookeeper常用的客户端zkclient和curator封装成为ZookeeperClient。
当服务提供者服务启动时,向zookeeper注册一个节点;
服务消费者则订阅其父节点的变化,诸如启动停止都能够通过节点创建删除得知,异常情况比如被调用方掉线也可以通过临时节点session 断开自动删除得知;
服务消费方同时也会将自己订阅的服务以节点创建的方式放到zookeeper;
于是可以得到映射关系,诸如谁提供了服务,谁订阅了谁提供的服务,基于这层关系再做监控,就能轻易得知整个系统情况。
zookeeper的基本数据模型(技术好文):
一句话,类似Linux文件系统的节点模型
其节点有如下有趣而又重要的特性:
同一时刻多台机器创建同一个节点,只有一个会争抢成功。利用这个特性可以做分布式锁。
临时节点的生命周期与会话一致,会话关闭则临时节点删除。这个特性经常用来做心跳,动态监控,负载等动作。
顺序节点保证节点名全局唯一。这个特性可以用来生成分布式环境下的全局自增长id。
通过zookeeper提供的原语服务,可以对zookeeper能做的事情有个精确和直观的认识。
zookeeper提供的原语服务:
创建节点
删除节点
更新节点
获取节点信息
权限控制
事件监听
实际上,就是对节点的增删查改加上权限控制与事件监听,但是通过对这些原语的组合以及不同场景的使用,可以实现很多用法。
数据发布订阅。即注册中心,见上面dubbo用法。主要通过对节点管理做到发布以及事件监听做到订阅。
负载均衡。见上面kafka用法。
命名服务。zookeeper的节点结构天然支持命名服务,即把信息集中存储,并以树状管理,方便统一查阅。
分布式协调通知。协调通知实际上与发布订阅类似,由于引入的第三方的zookeeper,实际上对很多种协调通知做了解耦。
集群管理与master选举。通过上面的第二点特性,可以轻易得知集群机器存活状况,从而轻松管理集群;通过上面第一点特性,可以做出master争抢。
分布式锁。实际上就是第一点特性的应用。
分布式队列。实际上就是第三点特性的应用。
分布式的并发等待。类似于多线程的join问题,主任务的执行依赖于其他子任务全部执行完毕,在单机多线程里可以用join,但是分布式环境下如何实现呢。利用zookeeper,可以创建一个主任务节点,旗下子任务一旦执行完毕,则在主任务节点下挂一个子任务节点,等节点数量足够,则认为主任务可以开始执行。
可以发现,所有的原语就是zookeeper的基础,而其他的用法总结无非是将原语放到不同场景下的归类罢了。
zookeeper简绍的更多相关文章
- SpringCloud(1)生态与简绍
一:微服务架构简绍学习目标 1.技术架构的演变,怎么一步步到微服务的:2.什么是微服务,优点与缺点 :3.SOA(面向服务)与MicroServices(微服务)的区别 :4.Dubbo 与Spri ...
- Python学习(基础简绍)
今天终于开始了python的学习,至于python的历史我就不说了,百度百科中太详细了,我这里说就是关公面前耍大刀,太自不量力了,所以,废话不多说,直接讲讲我惊天学习Python的收获吧. 1.Pyt ...
- 前端03 /css简绍/css选择器
前端03 /css简绍/css选择器 目录 前端03 /css简绍/css选择器 昨日内容回顾 html标签 常用标签 table标签:表格标签 input标签 select下拉框 textarea多 ...
- 前端01 /HTML简单简绍
前端01 /HTML简单简绍 目录 前端01 /HTML简单简绍 1.web服务本质 2.浏览器的工作流程 3.HTML是什么 4.web服务本质 5.HTML文档结构 6.HTML注释 6.标签语法 ...
- Itext简绍及操作PDF文件
iText简介 iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf的文档,而且可以将XML.Html文件转 ...
- MySQL优化一 简绍
优化方面: 存储层:数据表”存储引擎”选取.字段类型选取.逆范式(3范式) 设计层:索引.分区/分表 架构层:分布式部署(主从模式/共享) sql语句层:结果一样的情况下,要选择效率高.速度快.节省资 ...
- Android——Activity的简绍
Activity Activity的运行机制其实和JavaEE中的servlet很像,而我们的Android系统也就相当与其servlet容器,Activity在其中进行创建实例.初始化.运行.销毁等 ...
- javascript中闭包最简单的简绍
javascript中闭包是什么 JavaScript 变量可以是局部变量或全局变量.私有变量可以用到闭包.闭包就是将函数内部和函数外部连接起来的一座桥梁. 函数的闭包使用场景:比如我们想要一个函数来 ...
- django ORM 简单示例简绍
简单 models 操作 class Host(models.Model): nid = models.AutoField(primary_key=True) #Nid为主键 hostname = m ...
随机推荐
- javascript中的回调函数
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Python3 元组Tuple(十二)
元组:tuple.tuple和list非常类似,但是tuple一旦初始化就不能修改 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 如下实例: tup1 ...
- asp.net中的时间日期选择控件
asp.net中的时间日期选择控件 Posted on 2008-07-17 17:37 飛雪飄寒 阅读(22922) 评论(6) 编辑 收藏 在系统中经常需要进行时间日期选择(比如查询时间范 ...
- 利用Sonar定制自定义JS扫描规则(二)——自定义JS扫描规则
在上一篇blog中,我们将sonar几个需要的环境都搭建好了,包括sonar的服务器,sonar runner,sonar的javascript插件.现在我们就来讲如何自定义JS扫描规则. 实际上有3 ...
- Virtualbox安装Windows 8.1遇到0x000000C4错误解决办法 - 转
想要尝试一下 Windows 8.1 系统,又不愿意在电脑上直接安装,虚拟机提供了很好的平台.因为平时工作需要,其实电脑上装的虚拟机还是不少的,每天都要开着几个虚拟机一起用.多一个不多,于是尝试在自己 ...
- 征信接口调用,解析(xml)
数据传输格式报文格式:xml public CisReportRoot queryCisReport(PyQueryBean pyQueryBean) throws Exception { CisRe ...
- Python数据类型-02.字符串
本文主要记录字符串的相关知识,包括字符串的定义特点,常用方法和 请知悉: 计算机中,一切皆为对象世界万物,皆为对象,一切对象皆可分类 1.什么是字符串? 类似"hello world&quo ...
- swift3.0 代码创建经典界面的九宫图--优化篇
在上一篇只是简单实现了九宫图效果,本章需要形成APP界面九宫图效果 override func viewDidLoad() { super.viewDidLoad() createnine() } / ...
- POI加dom4j将数据库的数据按一定格式生成word文档
一:需求:将从数据库查处来的数据,生成word文档,并有固定的格式.(dom4j的jar包+poi的jar包) 二:解决:(1)先建立固定格式的word文档(2007版本以上),另存成为xml文件,作 ...
- 零基础学Cocos2d-X 3.0 - 04
忙完两个项目后.最终有时间继续学习Cocos2d-X 了. 常听人说.Cocos2d-X 有四个类是最经常使用的,包含: Director 类----> 导演 Scene 类 -----> ...