zoukankan      html  css  js  c++  java
  • zookeeper介绍

      Zookeeper 是 Google 的 Chubby一个开源的实现,是 Hadoop 的分布式协调服务

      它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等

          下面简单谈一谈zookeeper:

          zookeeper本身自己就是一个集群,它提供少量数据的存储和管理。客户端在zookeeper集群存储的数据,zookeeper集群内部会在所有服务器上进行同步,保证数据的一致性。

    1、Zookeeper的数据存储及Watcher

      简单的讲,zookeeper是一个文件系统,类似于linux的文件,有根路径“/“,在根路径下会有一级一级的子目录。在zookeeper中这些目录被称为节点,这些节点是可以存放数据的。Zookeeper对每个节点存放数据的大小有限制,默认是1M。

      在zookeeper中,有一个很重要的特性,就是Watcher。Watcher 可以监控目录节点的数据变化以及子目录的变化,一旦这些状态发生变化,服务器就会通知所有设置在这个目录节点上的 Watcher,从而每个客户端都很快知道它所关注的目录节点的状态发生变化,而做出相应的反应。

    2、Zookeeper的节点

      Znode有两种类型,短暂的(ephemeral)和持久的(persistent)

      Znode的类型在创建时确定并且之后不能再修改

      短暂znode的客户端会话结束时,zookeeper会将该短暂znode删除,短暂znode不可以有子节点

      持久znode不依赖于客户端会话,只有当客户端明确要删除该持久znode时才会被删除

      Znode有四种形式的目录节点,PERSISTENT、PERSISTENT_SEQUENTIAL、EPHEMERAL、EPHEMERAL_SEQUENTIAL

    3、Zookeeper的角色

      领导者(leader),负责进行投票的发起和决议,更新系统状态

      学习者(learner),包括跟随者(follower)和观察者(observer),follower用于接受客户端请求并想客户端返回结果,在选主过程中参与投票

      Observer可以接受客户端连接,将写请求转发给leader,但observer不参加投票过程,只同步leader的状态,observer的目的是为了扩展系统,提高读取速度

    4、Zookeeper的应用场景

      a、统一命名服务

        分布式应用中,通常需要有一套完整的命名规则,既能够产生唯一的名称又便于人识别和记住,通常情况下用树形的名称结构是一个理想的选择,树形的名称结构是一个有层次的目录结构,既对人友好又不会重复。

      b、统一配置管理

        配置的管理在分布式应用环境中很常见,例如同一个应用系统需要多台 PC Server 运行,但是它们运行的应用系统的某些配置项是相同的,如果要修改这些相同的配置项,那么就必须同时修改每台运行这个应用系统的 PC Server,这样非常麻烦而且容易出错。

        将配置信息保存在 Zookeeper 的某个目录节点中,然后将所有需要修改的应用机器监控配置信息的状态,一旦配置信息发生变化,每台应用机器就会收到 Zookeeper 的通知,然后从 Zookeeper 获取新的配置信息应用到系统中

      c、集群管理

        Zookeeper 能够很容易的实现集群管理的功能,如有多台 Server 组成一个服务集群,那么必须要一个“总管”知道当前集群中每台机器的服务状态,一旦有机器不能提供服务,集群中其它集群必须知道,从而做出调整重新分配服务策略。同样当增加集群的服务能力时,就会增加一台或多台 Server,同样也必须让“总管”知道。

      d、共享锁

        共享锁在同一个进程中很容易实现,但是在跨进程或者在不同 Server 之间就不好实现了。Zookeeper 却很容易实现这个功能,实现方式也是需要获得锁的 Server 创建一个 EPHEMERAL_SEQUENTIAL 目录节点,然后调用 getChildren方法获取当前的目录节点列表中最小的目录节点是不是就是自己创建的目录节点,如果正是自己创建的,那么它就获得了这个锁,如果不是那么它就调用 exists(String path, boolean watch) 方法并监控 Zookeeper 上目录节点列表的变化,一直到自己创建的节点是列表中最小编号的目录节点,从而获得锁,释放锁很简单,只要删除前面它自己所创建的目录节点就行了。

    转载请注明出处
  • 相关阅读:
    最全最详尽的ajax教程1
    Mysql笔记(一)
    JAVA基础知识整理(五)
    JAVA基础知识点整理(四)
    JAVA基础知识点整理(三)
    JAVA基础知识点整理(二)
    JAVA基础知识点整理(一)
    JAVA Web知识点整理(六)
    JAVA Web知识点整理(五)
    JAVA Web知识点整理(四)
  • 原文地址:https://www.cnblogs.com/skyfeng/p/6713314.html
Copyright © 2011-2022 走看看