hadoop框架之zookeeper

  1. zookeeper介绍
    zookeeper是一个分布式协调服务系统,为用户的分布式应用程序提供协调服务,所提供的服务有多个,比如主从协调,服务器节点动态上下线,同步服务等。从设计模式来讲,这其实是一个基于监听者模式的设计。
    zookeeper=文件系统+通知机制(配置数据存储在系统中,当该数据发生变化时,触发监听机制)
    zookeeper的主要作用是:减轻为分布式应用开发协调服务的负担
    zookeeper的底层其实只实现了两个功能:
    1)管理用户程序提交的状态信息
    2)为用户程序提供数据节点监听服务
    对外来说,没有主从之分,对外提供高可靠的、稳定的同步服务
    对于zookeeper内部来说,是由主从之分的,主是leader,其他都是follower,leader负责具体的操作,follower只负责接收从外界传来的数据。leader处理完成后,把结果返回给follower,follower再返回给客户端。至于leader是如何产生的,下面我们会详细讲解。

  2. zookeeper的特点
    是由一个leader和多个follower组成的集群
    在zookeeper启动时或者leader挂掉时,会重新投票产生leader
    集群中只要有半数以上的节点存活,集群就能正常服务,这只是针对集群刚开启时,如果集群开启,只要leader不挂,就算follower只剩一个,集群仍然是可以正常服务的。
    全局数据一致性,每个server都保存一份相同的数据副本,因此,无论client连接到那个server,数据都是一致的
    更新请求顺序执行,来自同一个client的更新请求按照其发送的顺序依次执行
    实时性,因为数据量小,加上存储在内存中,所以同步是非常快的,一定时间范围内,client能读到更新的数据

  3. 数据结构
    类似于unix,整体可以看做一棵树,每一个节点称之为Znode,但不同的是,unix中的目录是不可以存放数据的,但zookeeper中的节点(目录)是可以存放数据少量数据的,每个Znode默认存储1M数据,每个Znode可以通过路径唯一标识。这里举个例子:在zookeeper的client中创建一个节点(目录)是这样:create /test “测试”,如果不进行赋值,则会创建失败。

  4. 本地模式部署
    这里我们只做本地的zookeeper部署,之后在搭建高可用集群时,会演示集群上的zookeeper部署。
    安装jdk
    将zookeeper安装包拷贝到指定目录下(目录自定义)
    解压到指定目录
    在zookeeper的解压目录下的conf目录下,将zoo_sample.cfg修改为zoo.cfg
    编辑zoo.cfg文件,将dataDir修改为自定义目录
    启动zookeeper,如果配置了环境变量,在哪里启动都可以,如果没有配置,只能在bin下启动,命令是zkServer.sh start
    jps查看进程是否启动,进程名字是QuorumPeerMain
    启动客户端的命令是:zkCli.sh
    退出客户端是:quit
    停止服务是:zkServer.sh stop

  5. zookeeper的内部原理
    leader的选举机制:
    半数机制:集群中半数以上的机器存活,机器就是可用的,所以zookeeper适合装在奇数台机器上
    投票选举机制:我们以5台机器为例,他们的id分别是1-5(是自定义的),启动的顺序,默认从1-5,那么投票的具体过程如下:
    1)id为1的server1启动,这时他给自己投一票
    2)id为2的server2启动,这时他也给自己一票,但server2的id大于server1,所以server1把自己的票给server2(是默认给id大的)
    3)因为是半数以上机制,所以需要3票才可以,这时id为3的server3启动,按上述规则,票都给到server3,这时server3已经有3票了,符合了半数机制,leader产生就是id为的server3
    4)因为leader已经产生,所以后面的server4和server5,只能作为follower,他们的票作废。
    注:以上都是按照顺序启动的,如果不按照顺序,leader也是不确定的,但确定的是leader是尽量给到id比较大的,比如,如果id为5的先启动,那么leader肯定就是server5了

  6. 节点类型
    Znode有两种类型:
    1)短暂的:客户端与服务器端断开连接后,创建的节点自己删除
    2)持久的:客户端与服务器端断开连接后,创建的节点自己不删除
    Znode有四种形式的目录节点(编写程序会用到):
    1)PERSISTENT(持久化目录节点)
    2)PERSISTENT_SEQUENTIAL(持久化顺序编号目录节点)
    3)EPHEMERAL(临时目录节点)
    4) EPHEMERAL-SEQUENTIAL(临时顺序目录节点)

  7. 监听器原理
    1)在main线程中创建zookeeper客户端,这时会创建两个线程(很重要),一个负责网络连接通信,一个负责监听。
    2)通过connect线程将注册的监听事件发送给zookeeper
    3)在zookeeper的注册监听器列表中将注册的监听事件添加到列表中
    4)zookeeper监听到有数据或者路径变化,就会将这个消息发送给listener线程
    5)线程内部调用了process方法
    hadoop框架之zookeeper
    代码操作:进行监听是通过watch,比如:ls / watch,这就是监听/目录下的路径,一旦路径有所改变,则就会触发监听事件

  8. 写数据流程(important)
    1)client向zookeeper的server1上写数据,发送一个写的请求
    2)如果server1不是leader,那么server1会把请求转发给leader。leader会把写的请求广播给每个server,各个server写成功后会通知leader
    3)当leader收到大多数server数据写成功后,就说明数据写成功了。
    4)server会进一步通知client数据写成功,这时就认为整个写数据流程成功。

  9. 客户端命令行的操作
    help 显示所有操作命令
    ls path [watch]查看当前znode中包含的内容(watch代表是否监听)
    ls2 path [watch] 查看当前节点数据,可以看到更新次数等数据
    create path “值” 普通创建(-s创建有序列的节点;-e创建临时节点),没有值是创建不成功的
    get path [watch] 获得节点的值(watch表示监听,一旦值被改变,会触发监听器)
    set path “值” 设置节点具体的值
    delete path 只能删除空节点,如果节点下还有节点不能删除
    rmr path 可以删除非空节点
    stat path 查看节点状态

  10. 简单说明
    关于zookeeper的介绍,我们先就介绍这么多,之后我们会就一些具体的实例,来给大家做更细致的讲解,欢迎大家指出错误或提出建议,刚开始结束这个csdn,对一些格式、使用还是不够熟悉,谢谢大家的耐心查看。