首页 > 技术文章 > Zookeeper简介

xiaolong1032 2015-11-26 01:11 原文

Hadoop中只适用于Hbase分布式部署,hadoop的HA自动切换.

概述:

    zookeeper是应用于分布式应用的,是一个分布式协调服务.实现分布式应用,同步,配置管理,分组还有命名服务的.实现分布式应用中的协调服务.侧重于高性能,高可靠,还有顺序访问,HDFS只做存储,出发点不一样,都算一个文件系统.

    可靠性可以让它避免成为单点.严格的顺序访问,意味着实现了复杂的同步原子操作.事务性的唯一性.

ZooKeeper简介

    zookeeper节点可以很多,也可以宕掉几个节点.只要大部分还活着都可以.

    很多的客户端连接到一个zookeeper服务节点中的任意一个.客户端会通过tcp和server进行联系.在联系的过程中,发送请求信息,获取应答信息. 还会获得一些watch events.发送心跳,目的是向服务器获取一些状态信息,数据更新.如果连接到的这台服务器宕了,客户端就会重新去连接.
    zookeeper在使用的时候是以集群的方式实现的.客户端连接的时候.去连接zookeeper中的某一个服务器,client会通过心跳的方式和服务器进行通信.
    zookeeper还是一个有顺序的东西,zookeeper会记录每一次更新的号,更新的号来自于zookeeper事务的顺序,我们的每一次的操作,在zookpeer这都会留下痕迹.
    client是去连接zookeeper server中的某一台,取一个去连接,别的客户端可能会去读取,zookeeper可以保证我们的数据在集群间事务的,如果在操作过程中,某一个客户端失败,整个任务就会是失败的.

zookeepe认识:

    zookeeper是一个分布式的管理协调工具,它是用来在多个服务器之间进行事务性同步的.zookeeper是一个集群,有很多的节点,这些节点完成一个事务性同步的工作.
    在zookeeper中存在一个目录结构,类似于文件系统,简单的文件系统叫做znode,znode上面存放很多东西.
    数据是在各个服务器之间进行同步的,客户端是连接某一个服务器,然后从上读取数据.
    有顺序,速度快,读的要远远比写的多.
    zookeeper提供的命名空间非常像一个标准的文件系统,名字是一个用斜线分隔的路径元素,组成的一个名字.zookeeper每一个node是使用路径进行分隔的.node在保存数据的时候,还保存数据的版本,acl变化,时间戳,
    临时节点:是创建这个会话产生的时候就存在,一旦这个会话关闭了,这个节点也就没了.

独立模式下配置:

    没有副本,处理失败,服务器就会宕机.

    conf/zoo,cfg
    tickTime=2000
    dataDir=/var/lib/zookeeper
    clientPort=2181

    tickTime:基本的时间单位.毫秒,用于心跳,最小的会话超时.
    dataDir:数据镜像,更新事务性的数据存储的目录.
    clientPort:客户端口,用来监听客户端连接的.
    启动: bin/zkServer.sh start 
    连接到zookeeper:bin/zkClii.sh -server 127.0.0.1:2181(客户端和服务器不一定在一起,如果在一起,不写后面的地址也可以.)
    help:查看帮助.
    ls /:查看根目录下的.
    create /zk_test my_data
    ls /
    get /zk_test
    set /zk_test junk 当zkk_test值变化的时候,是有版本的.

生产模式下配置:

    运行在zookeeper replication模式下.

    replicated模式包含一组servers.一组服务器我们叫它为quorum,在replication的模式下,所有的quorum都有相同的配置文件.

    tickTime=2000    心跳的时间.
    dataDir=/var/lib/zookeeper    存放日志以及事务性文件的.
    clientPort=2181    客户端连接的端口.
    initLimit=5    限制zookeeper服务器quorum连接到leader花的时间.以tickTime为单元.
    syncLimit=2    同步时间,数据同leader获取的时候拿到的时间.
    server.1=zoo1.2888:3888    
    server.2=zoo2.2888:3888
    server.3=zoo3.2888:3888
    services:列出了zookeeperservers所有的服务器.当服务器启动的时候,要知道要找的myid是谁,文件在data目录下.myid包含服务器数据编号
    2888:zookeeper服务器之间相互连接使用2888.
    3888:follower与leader通信用的.

    客户端用到的主要的main class就是zookeeper这个类(入口类).

    当一个zookeeper对象被创建,那么两个线程就被创建了,一个是IO线程,一个是事件线程,所有的IO发生在IO线程中,用的是Java的NIO,所有事件的回调,发生在事件线程中,也就是说我们创建了一个zookeeper对象之后,产生两个线程,一个是进行数据读写的,一个是进行事件回调的,session维护对服务器的一个重连,包括维护的心跳,在IO线程中,IO线程用于发送心跳,并且连接服务器,服务器那边同步方法的应答也是在IO线程中完成的.
异步方法的观察和应答事件都是在event线程中完成的.
    ephemeral nodes:临时节点,只要创建他们的会话存在,它就活着,会话结束的时候,ephemeral nodes节点就会被删除.
    watch是监控,是在客户端注册的,当我们服务端数据或者状态有变化的时候watch就会获得对应的event,如果连接断开,watch也会获得这个event,但是这个event来自于local.
所以说epheral nodes这种节点,创建或者删除的时候,客户端都会收到消息.
    当我们创建一个znode的时候,我们可以请求zookeeper追加一个计数器.这个计数器对于父节点parent是唯一的一个.

推荐阅读