一、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. nacos原理

    配置中心原理 1.Nacos 客户端使用长轮询请求客户端变更数据,并且设置30s超时,当配置发生变化响应会立即返回,否则一直等到29.5s之后再返回响应. 2.客户端的请求到达服务端后,服务端将该请求 ...

  2. 打卡node day05 mongodb

    1.安装 [官网]https://www.mongodb.com/download-center/community?jmp=nav 配置环境变量 配置完环境变量坚持是否成功 在所在位置新建文件夹 启 ...

  3. go读取excel的内容

    import "github.com/360EntSecGroup-Skylar/excelize" func SimulationDataHandler(){ f, err := ...

  4. 暑假学习6 hdfs shell命令

    命令行操作:cli Hadoop的命令shell : Hadoop fs -ls file:                   操作 本地的文件系统 hadoop fs -ls hdfs://nod ...

  5. react native android9 axios network error

    react native 发布成apk后网络请求会报 network error 是因为android9以后http协议不能用,要用htts协议.需要改成配置能兼容http协议,修改信息如下: and ...

  6. List进行分隔,分批插入数据库

    背景,当数据集合超过一定数据量时,则会插入失败,需要将集合进行分隔,分批插入 /** * 分批插入-公共方法 * @param objects:数据集合 * @param subSize:单次插入的条 ...

  7. 请求接口类型blob,下载文件

    axiosGet () { var This = this var url = '/group1/M00/00/21/MejEvGOX_zOAL2kiAAAAUhB5Iqg138.txt?token= ...

  8. grpc start with python

    pip install grpcio grpcio-tools syntax = "proto3"; service FutureData { rpc GetTick(ReqTic ...

  9. 问题:PHP扩展功能,去掉分号';'没有用,是怎么回事?(已解决)

    1. 环境:win10的操作系统,IIS的服务器. 2. 问题描述:PHP要开启访问MYSQL的模块mysqli,我打开配置文件,去掉相关扩展模块前面的分号';',然后重启服务器,但是无效 ~~ 3. ...

  10. 策略模式demo

    /** StrategyContext. */ public class StrategyContext { private Strategy strategy; // 传入的是Strategy的实现 ...