一、zookeeper是什么(概括)?
 Zookeeper是一个分布式协调服务的开源框架,为分布式程序提供协调服务,同时用来解决分布式集群中应用系统的数据一致性问题。
 zookeeper在本质上是一个分布式的小文件存储系统,以目录树方式存储数据,对树中的节点进行管理,从而维护和监控存储数据的节点状态变化,达到基于数据的集群管理目的。
二、zookeeper特点?
 1)Zookeeper:一个领导者(Leader),多个跟随者(Follower)组成的集群
 2)集群中只要有半数以上节点存储,Zookeeper集群就能正常服务
 3)全局数据一致:每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的
 4)可靠性:如果消息被其中一台服务器接收,那么将被所有服务器接收
 5)顺序性:更新请求顺序进行,来自同一个Client的更新请求按其发送顺序依次执行
 6)数据更新原子性:一次数据更新要么成功(半数以上节点成功),要么失败,不存在中间状态 7)实时性:Zookeeper保证客户端在一定事件间隔范围内获取服务器的更新信息,或则服务器失效的信息
三、zookeeper分布式环境如何搭建,步骤?
 1.集群规划
  在hadoop01、hadoop02和hadoop03三个节点上部署Zookeeper
 2.解压安装
  解压Zookeeper安装包到各服务器的/opt/module/目录下
  [jinghang@hadoop01 software]$ tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/
 3.配置服务器编号
  1)在各服务器/opt/module/zookeeper-3.4.10/这个目录下创建zkData
   [jinghang@hadoop01 zookeeper-3.4.10]$ mkdir -p zkData
  2)在hadoop01 上的/opt/module/zookeeper-3.4.10/zkData目录下创建一个myid的文件
   jinghang@hadoop01 zkData]$ touch myid
  3)编辑myid文件
   [jinghang@hadoop01 zkData]$ vi myid
   在文件中添加与server对应的编号:
   2
  4)分发配置好的myid文件到zookeeper的其他机器上(xsync:分发脚本名称)
   [jinghang@hadoop01 zkData]$ xsync myid
   并分别在hadoop02、hadoop03上修改myid文件中内容为3、4
 4.配置各台服务器的zoo.cfg文件(可以在一台服务器上配置好后分发)
  1)在hadoop01上重命名/opt/module/zookeeper-3.4.10/conf这个目录下的zoo_sample.cfg为zoo.cfg
   [jinghang@hadoop01 conf]$ mv zoo_sample.cfg zoo.cfg
  2)在hadoop01上打开zoo.cfg文件
   [jinghang@hadoop01 conf]$ vim zoo.cfg
   修改数据存储路径配置
   dataDir=/opt/module/zookeeper-3.4.10/zkData
   增加如下配置
   #######################cluster##########################
   server.2=hadoop102:2888:3888
   server.3=hadoop103:2888:3888
   server.4=hadoop104:2888:3888
  3)分发hadoop01的zoo.cfg文件
   [jinghang@hadoop01 conf]$ xsync zoo.cfg
  
 5.启动集群,查看状态
  1)分别在各个节点上启动Zookeeper
   bin/zkServer.sh start 
  2)查看状态
   bin/zkServer.sh status

四、zookeeper的常用命令(增、删、改、查、观察者、其他命令)
创建:
 create [-s] [-e] path data acl
  -s 有序节点(序列号递增)
  -e 表示临时节点 (关闭当前会话,即删除) (临时节点下不能添加其他子节点) 
删除:
 delete path [version] 删除节点,并且只能删除空节点(不能存在子节点)
 rmr path 递归删除节点(非空节点)
修改:
 set path data [version]  修改节点数据
 set /school0000000001 zhangxiaozhang 
查询
 ls path [watch] 获取当前节点的子节点
 ls2 path [watch] 获取当前节点的子节点,还会返回当前节点的信息
 get path [watch] 获取当前节点数据,并返回当前节点的信息
 stat path [watch] 返回当前节点的信息 
添加约束
 setquota -n|-b val path  (软限制,只会给警告提示)
  -n:设置某节点下的最大子节点数
  -b:设置某节点下的存储的最大数据量  
 listquota path 查看节点的约束(限制)
  Output quota for /school0000000001 count=-1,bytes=-1  
  (count=-1,bytes=-1);表示没有添加任何限制
 delquota [-n|-b] path 删除节点限制
其他命令
 history 查看历史命令 
 redo 命令编号:该命令可以重新执行指定命令编号的历史命令,命令编号可以通过history查看
观察者:(观察者只生效一次)
 ls path [watch] 获取当前节点的子节点,观察节点变化
  WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/
 ls2 path [watch] 获取当前节点的子节点,还会返回当前节点的信息,观察节点变化
  WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/
 get path [watch] 获取当前节点数据,并返回当前节点的信息 观察节点数据变化
  WatchedEvent state:SyncConnected type:NodeDataChanged path:/school0000000001
 stat path [watch] 返回当前节点的信息 观察节点数据属性变化
  WatchedEvent state:SyncConnected type:NodeDataChanged path:/school0000000001
六、zookeeper节点类型有哪些?
 总体上分为2类,细分为4类
 持久节点:客户端和服务器端断开连接后,创建的节点不删除
 临时节点:客户端和服务器端断开连接后,创建的节点自己删除
 1)持久化目录节点
 2)持久化顺序编号目录节点
 3)临时目录节点
 4)临时顺序编号目录节点

七、Stat 结构体相关参数,须知?
 1)czxid-创建节点的事务zxid
 2)ctime - znode被创建的毫秒数(从1970年开始)
 3)mzxid - znode最后更新的事务zxid (须知)
 4)mtime - znode最后修改的毫秒数(从1970年开始)
 5)pZxid-znode最后更新的子节点zxid
 6)cversion - znode子节点变化号,znode子节点修改次数 (须知)
 7)dataversion - znode数据变化号(修改一次会加一) (须知)
 8)ephemeralOwner- 如果是临时节点,这个是znode拥有者的session id。如果不是临时节点则是0x0。 (须知)
 9)dataLength- znode的数据长度 (须知)
 10)numChildren - 子节点数量 (须知)

八、请简述ZooKeeper的选举机制?
 全新集群选举:
  假设目前有5台服务器,每台服务器均没有数据,它们的编号分别是1,2,3,4,5,按编号依次启动,它们的选举过程如下:
  服务器1启动,给自己投票,然后发投票信息,由于其它机器还没有启动所以它收不到反馈信息,服务器1的状态一直属于Looking。
  服务器2启动,给自己投票,同时与之前启动的服务器1交换结果,由于服务器2的编号大所以服务器2胜出,但此时投票数没有大于半数,所以两个服务器的状态依然是LOOKING。
  服务器3启动,给自己投票,同时与之前启动的服务器1,2交换信息,由于服务器3的编号最大所以服务器3胜出,此时投票数正好大于半数,所以服务器3成为Leader,服务器1,2成为Follower。
  服务器4启动,给自己投票,同时与之前启动的服务器1,2,3交换信息,尽管服务器4的编号大,但之前服务器3已经胜出,所以服务器4只能成为Follower。
  服务器5启动,后面的逻辑同服务器4成为Follower。
 非全新集群选举    
  对于运行正常的zookeeper集群,中途有机器down掉,需要重新选举时,选举过程就需要加入数据ID、服务器ID和逻辑时钟。
  (数据ID、服务器ID和逻辑时钟含义说明)
  数据ID:数据新的version就大,数据每次更新都会更新version。
  服务器ID:就是我们配置的myid中的值,每个机器一个。
  逻辑时钟:这个值从0开始递增,每次选举对应一个值。 如果在同一次选举中,这个值是一致的。
  选举的标准为:
   1.逻辑时钟小的选举结果被忽略,重新投票;
   2.统一逻辑时钟后,数据id大的胜出,当选leader;
   3.数据id相同的情况下,服务器id大的胜出,当选leader;

九、请简述zookeeper监听原理是什么?
 1)首先要有一个main()线程
 2)在main线程中创建Zookeeper客户端,这时就会创建两个线程,一个负责网络连接通信(connet),一个负责监听(listener)
 3)通过connect线程将注册的监听事件发送给Zookeeper
 4)在Zookeeper的注册监听器列表中将注册的监听事件添加到列表中
 5)Zookeeper监听到有数据或路径变化,就会将这个消息发送给listener线程
 6)listener线程内部调用process()方法

十、请简述zookeeper数据的写流程?
 1)Client向ZooKeeper的Server1 写数据,发送一个写请求
 2)如果Server1不是Leader,那么Server1会把接受到的这个事务请求进一步转发给Leader。
 Leader会将写请求广播给各个Server,各个Server写成功后,会向Leader发送成功信息
 3)当Leader收到半数以上(大多数) Server数据写成功的信息,说明该数据写成功了。Leader会告诉server1数据写成功了.
 4)Server1会进一步通知 Client 数据写成功了,就认为整个写操作成功
十一、ZooKeeper的部署方式有哪几种?集群中的角色有哪些?集群最少需要几台机器?
 1)部署方式:单机模式、集群模式
 2)集群的角色:Leader、Follower、Observer
 Leader:Zookeeper集群工作的核心,处理事务请求的唯一调度和处理者,保证集群事务处理的顺序性,并且是集群内各个服务器的总调度者。 事务说明:对于creat,setData,delete等有写操作的请求,则需要统一转发给leader处理。leader需要决定编号、执行操作,这个过程称为一个事务
 Follower:处理客户端非事务(读操作)请求,转发事务请求给Leader,参与集群Leader选举投票
 Observer:对于访问量比较大的集群,可以新增观察者角色,处理客户端非事务(读操作)请求,转发事务请求给Leader,不参与集群Leader选举投票
 
 
 3)集群最少需要机器数:3     (2n+1台)
 
十二、如何在zookeeper集群中使用观察者?
 在zookeeper集群中使用观察者是非常简单的,仅仅需要修改配置文件里的两个配置即可。
    在所有将会配置为zookeeper观察者的节点,添加下面一行:
    peerType=observer
    这行配置告诉zookeeper这台服务器将会成为一个observer。
    其次,在所有的服务器节点,在server定义处需要在末尾增加:observer。
 例如:
    server.服务器id:服务器主机名:2888:3888:observer

hadoopzookeeper的更多相关文章

  1. cloudera hbase集群简单思路

    文章copy link:http://cloudera.iteye.com/blog/889468 链接所有者保留所有权! http://www.csdn.net/article/2013-05-10 ...

  2. Hadoop(HA)分布式集群部署

    Hadoop(HA)分布式集群部署和单节点namenode部署其实一样,只是配置文件的不同罢了. 这篇就讲解hadoop双namenode的部署,实现高可用. 系统环境: OS: CentOS 6.8 ...

随机推荐

  1. [CQOI2006]凸多边形 /【模板】半平面交

    洛谷 题意:逆时针给出\(n(n<=10)\)个凸多边形的顶点坐标,求它们交的面积. 学长博客,计算几何知识全面 半平面交问题详细讲解 其他模板题推荐 [ICPC2020 WF] Domes [ ...

  2. Java 向上转型

    向上转型: 对象的向上转型,其实就是多态写法: 父类名称 对象名 = new 子类名称(); 注意:向上转型一定是安全的,从小范围转向大范围.(从小范围的猫,向上转化为更大范围的动物)

  3. Java 01-Java常用类 System

    System类:系统类,主要用于获取系统的属性和方法,没有构造方法 System的属性都是静态属性,方法都是静态方法 方法: 获取当前系统时间 currentTimeMillis()  返回的是毫秒值 ...

  4. vue 祖孙传值

  5. P8201 [传智杯 #4 决赛] [yLOI2021] 生活在树上(hard version)

    个人思路: 首先,题目可以转化为是否存在 \(a,b\) 路径上一点 \(u\),满足 \(w_u = dis{1,a} \oplus dis{1,b} \oplus w_{lca(a,b)} \op ...

  6. (读书笔记)基于CMMI的软件工程及实训指导(13-16章)

    软件测试 1.定义: 使用人工或自动的手段来运行或测试某个软件系统的过程,其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别. 简单来说,软件测试是为了发现程序中的错误而执行的过程. ...

  7. 面试视频知识点整理1-12(渲染机制,js运行机制,页面性能,错误监控)

    技巧(赞美面试官研究的比较深) 1.渲染机制 什么是DOCTYPE及作用? DTD(文档类型定义)是一系列的语法规则,用于定义文件类型.浏览器会根据它来判断文档类型,决定使用何种协议来解析以及切换浏览 ...

  8. TypeScript Map 对象

    TypeScript Map 对象 Map 对象保存键值对,并且能够记住键的原始插入顺序. 任何值(对象或者原始值) 都可以作为一个键或一个值. Map 是 ES6 中引入的一种新的数据结构,可以参考 ...

  9. mac 查看,终止进程

    找到其他 活动监视器 在这里可以查看和cpu占用 杀死有问题的过程: 1.它占用了大量CPU周期或内存, 2.在"活动监视器"中被突出显示为已崩溃, 先单击该过程,点击x可以终止进 ...

  10. jquery.min.js:2 Uncaught SyntaxError: Unexpected identifier

    错误描述:样式没加载出错,还没发起action请求,action有断点,后端无报错. 错误原因:找了好久,知道是url请求路径错误,搞了几次不对.重新对比url发现是路径拼接错误.注意单引号和双引号. ...