zookeeper是一个分布式程序的高性能协调服务,提供集中式信息存储服务,数据存储于内存中,类似文件系统的树形结构,高吞吐量和低延时,集群高可靠,基于zookeeper可以实现分布式统一配置中心、分布式锁、服务注册中心。

  zookeeper的同类产品 consul etcd Doozer等

  单机版安装

  下载tar文件,地址 http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.14/

  解压后在conf目录增加zoo.cfg(复制zoo_sample.cfg文件,重命名即可),注意配置data的路径

  启动服务端 进入zookeeper安装目录 bin/zkServer.sh start

  客户端连接 bin/zkCli.sh -server 127.0.0.1:2181

  zookeeper常用命令,参考 https://zookeeper.apache.org/doc/current/zookeeperStarted.html ,输出help即可看到

  
  在安装包下有 zookeeper-3.4.14.jar,它就是官方提供的java 客户端,我们可以使用它来操作zookeeper,但是其api太过底层,所以一般使用第三方的客户端,常用的有zkClient和Curator。

  zookeeper核心概念

  1、session

  一个客户端连接是一个会话,由zk分布一个唯一id 客户端以特定的时间发送心跳保持会话,ticktime,超过会话超时时间未收到心跳则判定客户端挂掉,(默认2倍ticktime),会话中的请求FIFO执行

  2、数据模型

  节点类型

  持久节点  create /asd asd

  临时节点 create -e /asd asd  连接断开后即消失

  顺序节点 create -s /asd asd  真实名称asd0000000268(名字+ 10位十进制数字)

  顺序节点 create -s /asd/ asd  真实名称0000000268(10位十进制数字)

  临时顺序节点 create -s -e /asd asd   

  节点数据构成:存储的协调信息和元数据,数据量上限1M

  节点元数据结构:zxid(事务id)

  3、zookeeper中的时间

  Zxid zookeeper种每一次更改操作都对应一个唯一的事务id,称为zxid,它是全局有序的戳记,如果zxid1>zxid2,则zxid1一定在zxid2之后发生

  version number 每次对节点的修改都会使其版本号增加

  ticktime 在使用多服务器时,服务器通过ticktime来定义事件的时间,ticktime仅通过最小会话时间(ticktime的2倍)公开,如果客户端请求的会话时间小于最小会话时间,则服务器会告诉客户端会话超时实际上为最小超时时间

  real time 仅在znode创建和修改时将时间戳放入stat结构中

  4、watch监听机制

  通过help命令我们可以看到ls get 等命令都支持watch,命令使用如下 get /asd 1(boolean值,默认为0,为1时表示监控变化)。watch机制是一次性触发,即只能监控到第一次的变化,若要持续监控,则需要持续设置watch,watch是有序的,客户端先收到watch通知后看到变化。

  因为watch是一次性的,并且在获取通知和发送新的watch请求存在间隙,所以不能可靠的发现节点的每一次变化

  使用场景

  1、配置中心

  主要使用到zookeeper的两个特性,znode存储数据及watch机制,两种使用方式:一个配置项一个znode和一个配置文件一个znode,具体看配置在集群中的差异性。

  2、命名服务

  分布式开发中A服务不依赖B服务的具体ip端口信息,而是根据一个服务名去获取对应的ip端口信息,这样A服务可以先行部署而后监听B服务对应的服务名的变化,而后B服务开发完工后再部署后,A服务不用做任何修改就可以正常访问,具体如下图

  3、master选举

  两种方式:

  (1)争抢创建主节点,集群中各个服务器在申请创建同一个主节点(临时节点)时带上自己的地址信息,但是只有一个会创建成功,其它的创建失败后则后通过获取主节点的值来知道当前主节点是谁,并且注册对主节点的watch,当master挂掉后,对应的主节点也被删除,此时剩下的服务器则又开始新一轮的争抢创建主节点,创建成功的即为下一个master。

  (2)集群各个服务器都申请创建临时顺序节点,序号最小的即为master,master挂掉后其后一个节点对应的机器则为master。

  同时还可以创建一个server节点,所有集群中的节点都来创建一个一个临时顺序节点,利用这个可以做集群管理

  4、分布式队列

  入队:所有生产者往同一个节点下(queue)创建顺序节点

  出队:获取节点下所有子节点,移除最小序号对应的节点

  针对无界队列,可以利用上面所说直接实现,有界队列则需要用到分布式所来实现获取队列元素数目和放入元素同步

  5、分布式锁

  两种方式

  (1)都去创建同名临时节点,创建成功则执行后续逻辑,没有创建成功则注册这个节点的watch

  (2)创建同名临时顺序节点,获取所有子节点,判断自己是否为最小号,是则获取锁成功执行逻辑后删除对应节点,不是则注册前一个节点的watch等待被通知

  

  




zookerper入门、核心概念和使用场景的更多相关文章

  1. Mycat入门核心概念

      Mycat中的核心概念     Mycat中的核心概念 1.数据库中间件    Mycat 是一个开源的分布式数据库系统,但是由于真正的数据库需要存储引擎,而 Mycat 并没有 存储引擎,所以并 ...

  2. JAVAEE——BOS物流项目13:Quartz入门案例、核心概念、cron 表达式的格式(了解)

    1.quartz入门案例 本入门案例基于spring和quartz整合完成. 第一步:创建maven工程,导入spring和quartz相关依赖 第二步:创建任务类 第三步:在spring配置文件中配 ...

  3. lucene 核心概念及入门

    lucene Lucene介绍及核心概念 什么是Lucene Lucene是一套用于全文检索和搜索的开放源代码程序库,由Apache软件基金会支持和提供.Lucene提供了一个简单却强大的应用程序接口 ...

  4. ElasticSearch入门及核心概念介绍

      Elasticsearch研究有一段时间了,现特将Elasticsearch相关核心知识和原理以初学者的角度记录下来,如有不当,烦请指正! 0. 带着问题上路——ES是如何产生的? (1)思考:大 ...

  5. ZooKeeper入门实战教程(一)-介绍与核心概念

    1.ZooKeeper介绍与核心概念1.1 简介ZooKeeper最为主要的使用场景,是作为分布式系统的分布式协同服务.在学习zookeeper之前,先要对分布式系统的概念有所了解,否则你将完全不知道 ...

  6. Elasticsearch入门教程(二):Elasticsearch核心概念

    原文:Elasticsearch入门教程(二):Elasticsearch核心概念 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:ht ...

  7. JAVA入门(1.JAVA平台应用 2.核心概念:JVM,JDK,JRE 3.搭建JAVA开发环境 4.学习JAVA的原则)

    主要内容: 1.JAVA平台应用 2.核心概念:JVM,JDK,JRE 3.搭建JAVA开发环境 4.学习JAVA的原则 JAVA的平台应用 JAVA的平台应用分为3个部分: 一.JAVA SE,主要 ...

  8. 从零开始入门 K8s| 阿里技术专家详解 K8s 核心概念

    作者| 阿里巴巴资深技术专家.CNCF 9个 TCO 之一 李响 一.什么是 Kubernetes Kubernetes,从官方网站上可以看到,它是一个工业级的容器编排平台.Kubernetes 这个 ...

  9. dubbo入门学习(一)-----分布式基础理论、架构发展以及rpc、dubbo核心概念

    一.分布式基础理论 1.什么是分布式系统? <分布式系统原理与范型>定义: “分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统” 分布式系统(distributed ...

随机推荐

  1. 缺陷的严重程度(Severity)

    该bug对用户造成的影响有多大.(1)Urgent 死机重启等致命bug(2)Veryhigh 非常严重的bug(3)High 严重的bug(4)Medium 中等程度的bug(5)Low 小的bug

  2. PHP strtok() 函数

    我们仅在第一次调用 strtok() 函数时使用了 string 参数.在首次调用后,该函数仅需要 split 参数,这是因为它清楚自己在当前字符串中所在的位置. 如需分割一个新的字符串,请再次调用带 ...

  3. Koa Cookie 的使用

    Cookie 简介 cookie 是存储于访问者的计算机中的变量.可以让我们用同一个浏览器访问同一个域 名的时候共享数据. HTTP 是无状态协议.简单地说,当你浏览了一个页面,然后转到同一个网站的另 ...

  4. 移动端 - adb shell常见问题汇总

    一.如何执行adb命令? 答:如果没有配置SDK的环境变量的话,那就先用cd命令进入adb所在文件目录(即F:\android-sdk-windows\platform-tools)后,再执行adb命 ...

  5. Don't always upset yourself !

  6. QString 中文编码转换

      版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/xxm524/article/det ...

  7. 【转】Fiddler抓包和修改WebSocket数据,支持wss

    记录一下用Fiddler对WebSocket收发的数据进行抓包分析和篡改数据,只找到这么一个方法,能用就行吧.时间:2019-3-29环境: win7 + Fiddler 5.0 Fiddler抓取W ...

  8. Java-JUC(十三):现在有两个线程同时操作一个整数I,做自增操作,如何实现I的线程安全性?

    问题分析:正如i在多线程中如果想实现i的多线程操作,必须i要使用volitle来保证其内存可见性,但是i++自增操作不具备原子性操作,因此需要对i++这段代码确保其原子性操作即可. 方案1: 使用Re ...

  9. curl保留cookie

    curl -c cookie.txt http://localhost:9001/login.json?c=65CE13E16CF394D curl -b @cookie.txt http://loc ...

  10. Nginx location wildcard

    Module ngx_http_core_modulehttps://nginx.org/en/docs/http/ngx_http_core_module.html#location locatio ...