限制会话id服务端不共享_不懂 Zookeeper?看完不懂你打我

be6147b411553a56d49903b825509911.png

高并发分布式开发技术体系已然非常的庞大,从国内互联网企业使用情况,可发现RPC、Dubbo、ZK是最基础的技能要求。关于Zookeeper你是不是还停留在Dubbo注册中心的印象中呢?还有它的工作原理呢?经典应用场景呢?对前面三个问题,如若回答时没有自己的思路或者说并未了解,那么我觉得我可以帮助到你去入门,并深化这些知识,让你在面试中更好地去回答。

话不多说进入正题

1. 并发环境下面临的挑战

回忆我们学多线程的时候,网上有个图也是十分的有意思

e777e312ee577211189d6c4f1264b173.png

其实我们把线程换成进程,相当于每台服务上跑了一个程序,相同的应用程序运行于多个服务器集群上,是为了解决单台服务面对高并发处理不来的情况。而尝试去处理这些情况,我们就会面临很多诸如此类的问题

比如说我们现在是3台服务器的一个集群, 怎么保证所有机器共享的配置信息保持一致?

有一台机器挂掉了,其他机器如何感知到这一变化并接管任务?

用户量突然的爆增,需要增加机器来缓解压力,如何做到不重启集群而完成机器的添加?

分布式系统,怎么高效协同多台服务对同一网络文件进行写操作(网络并不是即时的,它并不可靠,存在延时)?

此时我们就需要一个类似于线程协同机制的能让进程进行协同的工具

2. Zookeeper的介绍

① Zookeeper的名字由来

在apache上的许多开源项目都是以动物形象作为icon,比如tomcat就是一只猫,hive是只黄蜂等,zookeeper的工作就是把这些动物的行动进行协调

② Zookeeper的简介

zookeeper就是一种用于分布式应用程序的高性能协调服务,它的特点就是数据是存于内存中的,持久化实现在日志中。它的内存类似于树形结构,且高吞吐低延迟,可以帮助我们实现分布式统一配置中心,服务注册,分布式锁等 组成ZooKeeper服务的服务器必须彼此了解。它们维护内存中的状态图像,以及持久性存储中的事务日志和快照。只要大多数服务器可用,ZooKeeper服务就可用。客户端连接到单个ZooKeeper服务器。客户端维护TCP连接,通过该连接发送请求,获取响应,获取监视事件以及发送tick。如果与服务器的TCP连接中断,则客户端将连接到其他服务器。

③ Zookeeper的安装(linux下)

1.JDK版本需要在1.6以上
2.下载:https://archive.apache.org/dist/zookeeper/zookeeper-3.5.2/zookeeper-3.5.2.tar.gz
3.解压后的conf目录,增加配置文件zoo.cfg
4.启动服务端 bin/zkServer.sh start
5.测试,客户端连接:bin/zkCli.sh -server 127.0.0.1:2181
zoo.cfg的关键配置有3个:tickTime=2000:一次心跳的基本时间,dataDir:数据与日志的存放处clientPort:端口号

④ Zookeeper的特点

1.数据结构简单

类似于Unix文件系统树形结构,每个目录成为Znode节点,但它不同于文件系统,它既可以视为文件夹,也可以视为文件来存放数据,但是我们平时还是得叫它节点,别叫文件夹这么掉价。

需要注意:同一个节点下的子节点名称不能相同,且命名是有规范的,它的路径是没有相对路径的概念的,都是绝对路径,任何开始都以"/"开始,最后就是,它存放数据的大小是有限制的

2.数据模型特点

层次命名空间:就是上面已经提到的,类似于unix的文件系统,以"/"为根,节点可以包含关联数据和子节点,绝对路径 Znode:名称唯一,命名有规范,类型分4种:持久,顺序,临时,临时顺序,节点的数据构成之后再提

3.命名规范

节点名称除下列限制外,可以使用任何unicode字符:

1. null字符(u0000)不能作为路径名的一部分;
2. 以下字符不能使用,因为它们不能很好地显示,或者以令人困惑的方式呈现:u0001 - u0019和u007F - u009F。
3. 不允许使用以下字符:ud800 - uf8fff, uFFF0 - uFFFF。
4. “.”字符可以用作另一个名称的一部分,但是“.”和“..”不能单独用于指示路径上的节点,因为ZooKeeper不使用相对路径。
下列内容无效:“/a/b/. / c”或“c / a / b / . . /”。
5. “zookeeper”是保留节点名。

4.一些命令

因为我的电脑是window系统的,所以我找了一个window版本的zookeeper来进行演示

先大致解释一下各个目录的内容

bin ---> 包括了linux和window的运行程序的运行目录
conf ---> zookeeper的配置zoo.cfg
contrib ---> 其他一些组件和发行版本
dist-maven ---> maven发布下的一些jar包
docs ---> 文档
lib ---> 库
recipe ---> 一些应用实例
src ---> zookeeper的源码,因为zookeeper是java写出来的

启动bin目录下的zkServer.cmd,再启动zkClient.cmd即可,在我根本不知道该如何进行学习的时候,一般来说输入help,-help,-h这些指令就可以获取到帮助,下图我就是在客户端输入了-help指令

39152662fb7811a529c4c143ab885432.png

因为命令都相对简单所以也不进行演示了,唯一需要注意的是要注意路径"/"的问题,比如 ls / 就是根目录,create /zk 123,还有各个命令的依托条件,比如create必须要提供父节点,delete节点时次节点不能有子节点等···

5.Zookeeper的重要特点---有序

提供多种方式跟踪时间,ZooKeeper给每个更新贴上一个数字,这个数字反映了所有ZooKeeper事务的顺序,严格的顺序意味着可以在客户机上实现复杂的同步原语 解释czxid、version、zoo.cfg中ticks配置

Zxid :Zookeeper中每次写请求都对应一个唯一的事务id,称为 Zxid,它是全局的且有序的,如果 Zxid1 小于 Zxid2,那 Zxid1 就一定是发生在 Zxid2 前
version numbers :版本号,对节点的写请求都会导致该节点的3种版本号增加(其实套路和乐观锁差不多),dataVersion(对znode数据的更改次数),cversion(对znode子节点的更改次数),aclVersion(对znode ACL的更改次数
ticks :当使用多服务器Zookeeper时,服务器使用一个“滴答”来定义事件的时间,如状态上传,会话超时等,它通过最小会话超时(默认是滴答时间x2)间接公开,如果客户端请求超过这个时间,那客户端就不再能连接上服务器端
real time:Zookeeper并不使用真实时间

你可以使用stat path或者ls2来查看这些信息

dd00500c1ae9c5bbe961e0447442050e.png
cZxid:创建该节点的zxid
ctime:该节点的创建时间
mZxid:该节点的最后修改zxid
mtime:该节点的最后修改时间
pZxid:该节点的最后子节点修改zxid
cversion:该节点的子节点变更次数
dataVersion:该节点数据被修改的次数
aclVersion:该节点的ACL变更次数
aphemeraOwner:临时节点所有者会话id,非临时的为0
dataLength:该节点数据长度
numChildren:子节点数

这些数据都在从侧面告诉我们,zookeeper是一个协调者

6.zookeeper的第二个特点---可复制

数据可复制,可备份。zookeeper可以快速地搭建一个集群,内部自带了这样的一些工具与机制,我们只需要设置一些配置即可,保证服务可靠,不会成为单点故障

eb7d0172499ff666003b428f246d2fc8.png

7.zookeeper的第三个特点---迅速

zookeeper的一些特点可以应用于大型分布式系统

58c2c5c6ef9cb428dd79d857c55a3f58.png

3.zookeeper的理论

① zookeeper的会话机制

56d627cc79fede46760e214f722ea6b6.png

Session会话

1.一个客户端连接一个会话,由zookeeper分配唯一会话id
2.客户端以特定的时间间隔发送心跳以保持会话有效,
3.超过会话超时时间未收到客户端的心跳,则判断客户端无效(默认2倍tickTime)
4.会话中额请求是FIFO(先进先出原则)的顺序执行

② znode的数据构成

节点数据:存储的基本信息(状态,配置,位置等)
节点元数据:stat命令下的一些数据
数据大小:限制1M

③ znode的节点类型

1.持久节点:直接通过create path value所创建
2.临时节点:create -e path value
3.顺序节点:create -s path value
注意
1.session会话失效时,临时节点就会被删除
2.顺序节点的创建,后为10位十进制序号,每个父节点拥有一个计数器,这个计数器也是有限制的,到2147483647之后将溢出
3.顺序节点在会话结束仍然存在

④ Watch监听机制

客户端能在znodes上设置watch,监听znode的变化,包括增删改查,通过stat path ,ls2 path get path皆可查看

触发watch事件的条件有4种,create,delete,change,child(子节点事件)

watch的重要特性

1.仅一次性:watch触发后会立即删除,要持续监听变化的话就要持续提供设置watch,这也是watch的注意事项
2.有序性:客户端先得到watch通知才可查看变化结果

watch的注意事项

1.刚刚提及到的它的仅一次性
2.获取事件和发送watch,获取watch,这些请求有可能存在延时,所以不能绝对可靠得到每个节点发生的每个更改
3.一个watch对象只会被通知一次,如果一个watch同时注册了多个接口(exists,getData),如果此时删除节点,虽然这个事件对exists和getData都有效,但是watch只会被调用一次

阻塞线程唤醒机制—客户端可以被动接受其他客户端进程状态通知

⑤ zookeeper的特性

1.顺序一致性(Sequential Consistency),保证客户端操作是按顺序生效的;
2.原子性(Atomicity),更新成功或失败。没有部分结果。
3.单个系统映像,无论连接到哪个服务器,客户端都将看到相同的内容
4.可靠性,数据的变更不会丢失,除非被客户端覆盖修改。
5.及时性,保证系统的客户端当时读取到的数据是最新的。

finally

通过上面的阐述应该我们对于zookeeper有了一个初步的认识,之后会陆续说说分布式锁,集群还有一些场景的应用

原文作者 | 说出你的愿望吧
原文链接 | http://juejin.im/post/5d0bd358e51d45105e0212db

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438956.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

防抖与节流方案_前端ajax优化解决方案

伴随着前端ajax的应用场景越来越多,那就免不了一个整合的ajax优化解决方案了,自己优化太麻烦?没事,有它帮你解决:hajax 与当下比较热门的请求库 axios 和原生的 fetch相比,hajax有什么一些什么内容和特点呢…

ABP入门系列(6)——定义导航菜单

ABP入门系列目录——学习Abp框架之实操演练源码路径:Github-LearningMpaAbp 完成了增删改查以及页面展示,这一节我们来为任务清单添加【导航菜单】。 在以往的项目中,大家可能会手动在layout页面中添加一个a标签来新增导航菜单,这…

ABP入门系列(7)——分页实现

ABP入门系列目录——学习Abp框架之实操演练源码路径:Github-LearningMpaAbp 完成了任务清单的增删改查,咱们来讲一讲必不可少的的分页功能。 首先很庆幸ABP已经帮我们封装了分页实现,实在是贴心啊。 来来来,这一节咱们就来捋一捋如…

下载matlab安装包太慢_Matlab2017a软件安装包以及安装教程

安装步骤:1.如图所示,完整的安装包应该有13个压缩包,必须要全部下载完成才能解压。鼠标右击“thMWoMaR17a.part01.rar”压缩包,选择“解压到thMWoMaR17a”,然后等待解压完成2.打开“thMWoMaR17a”文件夹,解…

【转】ORM系列之Entity FrameWork详解

一. 谈情怀 从第一次接触开发到现在(2018年),大约有六年时间了,最初阶段连接数据库,使用的是【SQL语句ADO.NET】,那时候,什么存储过程、什么事务 统统不理解,生硬的将SQL语句传入SQL…

springcloud 微服务鉴权_Java微服务框架spring cloud

Spring Cloud是什么Spring Boot 让我们从繁琐的配置文件中解脱了出来,而 Spring Cloud,它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,…

ABP入门系列(9)——权限管理

1.引言 完成了简单的增删改查和分页功能,是不是觉得少了点什么? 是的,少了权限管理。既然涉及到了权限,那我们就细化下任务清单的功能点: 登录的用户才能查看任务清单用户可以无限创建任务并分配给自己,但…

c#quartz触发_SpringBoot集成Quartz实现定时任务

1 需求在我的前后端分离的实验室管理项目中,有一个功能是学生状态统计。我的设计是按天统计每种状态的比例。为了便于计算,在每天0点,系统需要将学生的状态重置,并插入一条数据作为一天的开始状态。另外,考虑到学生的请…

ABP入门系列(10)——扩展AbpSession

一、AbpSession是Session吗? 1、首先来看看它们分别对应的类型是什么? 查看源码发现Session是定义在Controller中的类型为HttpSessionStateBase的属性。 public HttpSessionStateBase Session { get; set; } 再来看看AbpSession是何须类也&#xff0c…

太吾绘卷第一世攻略_耽美推文-BL-仿佛在攻略一只河豚

目录:《全能攻略游戏》by公子如兰《无限升级游戏》by暗夜公主《无限游戏》BY SISIMO《请听游戏的话》by木兮娘《游戏,在线直播》by雨田君《最强游戏制作人》by木兰竹《在逃生游戏里撩宿敌》by临钥《游戏加载中》by龙柒《狩猎游戏》by砯涯《当异性参加逃生…

ABP入门系列(11)——编写单元测试

1. 前言 In computer programming, unit testing is a software testing method by which individual units of source code, sets of one or more computer program modules together with associated control data, usage procedures, and operating procedures, are tested …

etl构建数据仓库五步法_带你了解数据仓库的基本架构

数据仓库的目的是构建面向分析的集成化数据环境,为企业提供决策支持(Decision Support)。其实数据仓库本身并不“生产”任何数据,同时自身也不需要“消费”任何的数据,数据来源于外部,并且开放给外部应用&a…

ABP入门系列(12)——如何升级Abp并调试源码

1. 升级Abp 本系列教程是基于Abp V1.0版本,现在Abp版本已经升级至V1.4.2,其中新增了New Feature,并对Abp做了相应的Enhancements,以及Bug fixs。现在我们就把它升级至最新版本,那如何升级呢? 下面就请按我…

聚类分析在用户行为中的实例_看完这篇,你还敢说不懂聚类分析?

点击上方蓝色字关注我们~大数据分析中的应用,最常用的经典算法之一就是聚类法,这是数据挖掘采用的起步技术,也是数据挖掘入门的一项关键技术。什么是聚类分析?聚类分析有什么用?聚类算法有哪些?聚类分析的应…

ABP入门系列(13)——Redis缓存用起来

1. 引言 创建任务时我们需要指定分配给谁,Demo中我们使用一个下拉列表用来显示当前系统的所有用户,以供用户选择。我们每创建一个任务时都要去数据库取一次用户列表,然后绑定到用户下拉列表显示。如果就单单对一个demo来说,这样实…

ABP入门系列(14)——应用BootstrapTable表格插件

1. 引言 之前的文章ABP入门系列(7)——分页实现讲解了如何进行分页展示,但其分页展示仅适用于前台web分页,在后台管理系统中并不适用。后台管理系统中的数据展示一般都是使用一些表格插件来完成的。这一节我们就使用BootstrapTab…

musictools怎么用不了_夏天少不了一只草编包,怎么搭配才不像“买菜用”?

要说有什么包包能跟夏天的气息一拍即合,那绝对非“草编包”莫属!由藤条、柳条等编制而成的田园风“小篮子”,已经成了夏日街头小姐姐们的包包首选。各大品牌都争相推出草编包系列,在原有的浪漫度假风之外,添加了更多时…

ABP入门系列(15)——创建微信公众号模块

1. 引言 现在的互联网已不在仅仅局限于网页应用,IOS、Android、平板、智能家居等平台正如火如荼的迅速发展,移动应用的需求也空前旺盛。所有的互联网公司都不想错过这一次移动浪潮,布局移动市场分一份移动红利。 的确,智能手机作…

spark 算子例子_Spark性能调优方法

公众号后台回复关键词:pyspark,获取本项目github地址。Spark程序可以快如闪电⚡️,也可以慢如蜗牛?。它的性能取决于用户使用它的方式。一般来说,如果有可能,用户应当尽可能多地使用SparkSQL以取得更好的性能。主要原…

ABP入门系列(16)——通过webapi与系统进行交互

1. 引言 上一节我们讲解了如何创建微信公众号模块,这一节我们就继续跟进,来讲一讲公众号模块如何与系统进行交互。 微信公众号模块作为一个独立的web模块部署,要想与现有的【任务清单】进行交互,我们要想明白以下几个问题&#x…