[Hadoop云计算实战]分布式系统Zookeeper

三 1st, 2013

Hadoop云计算实战读书笔记:第11章,p367~p378


  1. zookeeper是一个为分布式应用所设计的开源协调服务,为用户提供同步,配置管理,分组和命令等服务。zk使用java实现,但是支持java和c两种编程语言
  2. zk的核心是原子广播,这个机制保证了各个server之间的同步。实现这个机制的协议叫Zab协议。该协议有2种模式,分为恢复模式(选主)和广播模式(同步)。当服务启动或者领导者崩溃,Zab就进入恢复模式。当领导者被选出,且大多数server完成了和leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和server具有相同的系统状态。
  3. 为保证事务的顺序一致性,zk采用递增的事务ID号(zxid)来标示事务。所有的提议(proposal)都在被提出时加上了zxid。zxid是一个64位的数字,高32位是epoch来标识Leader关系是否改变,每次一个leader选举出来,都会有一个新的epoch。低32位用于递增计数。
  4. server工作过程中的2种状态

      LOOKING :  不知道leader是谁,正在搜寻中。
      LEADING :   当前server选举出来的leader。
      FOLLOWING:leader已经选举出来,当前server与之同步。

ZooKeeper的安装于配置

    

     安装配置步骤,参考我之前写得博客: http://www.wangyuxiong.com/archives/51712

       最低配置:

  • tickTime :基本事件单元,以毫秒为单位。这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
  • dataDir :存储内存中数据库快照的位置,顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
  • clientPort :这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。                      高级配置:
  • dataLogDir: 把事务日志写入到该目录,有助于避免日志与快照之间的竞争。
  • maxClientCnxns : 这个参数将限制连接到ZK的客户端数量,限制并发连接的数量,通过IP来区分不同的客户端
  • minSessionTimeout,maxSessionTimeout : 最小会话超时时间和最大会话超时时间,一般情况下,不能讲它们设置的比tickTime小。我们最小时间通常设置为tickTime的2倍,最大的设置为20倍。                     集群配置:
  • initLimit:这个配置项是用来配置 Zookeeper 接受客户端初始化连接时最长能忍受多少个心跳时间间隔数,当已经超过 5 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒。
  • syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4 秒
  • server.A = B:C:D : A表示这个是第几号服务器,B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader

Zookeeper数据模型

类似操作系统中的文件结构,如图:

244694167

  1. 节点称为znode,每个节点都有唯一的路径标识。如/SERVER2 为 /APP3/SERVER2.
  2. znode可以有子znode,znode里可以存数据,但是EPHEMERAL类型的节点不能有子节点。
  3. znode中的数据可以有多个版本,那么查询这个路径下的数据需要带上版本。
  4. znode可以使临时节点,这个节点失去联系,会被自动删除。
  5. znode的目录名可以自动编号,APP1存在,再创建就为APP2
  6. znode可以被监控,包括这个目录节点中存储的数据修改,子节点目录变化等,都会通知设置监控的客户端。(这个特性实现的功能包括集中管理,集群管理,分布式锁等)

 

    ZK的API接口

  • String create(String path, byte[] data, List<ACL> acl, CreateMode createMode)
  • Stat exists(String path, boolean watch)
  • void delete(String path, int version)
  • List<String> getChildren(String path, boolean watch)
  • Stat setData(String path, byte[] data, int version)
  • byte[] getData(String path, boolean watch, Stat stat)
  • void addAuthInfo(String scheme, byte[] auth)
  • Stat setACL(String path, List<ACL> acl, int version)
  • List<ACL> getACL(String path, Stat stat)  

    通过org.apache.zookeeper .ZooKeeper (url,session_timeout,watcher); 实例化一个对象,连接服务器。

          1. 节点创建 :zk.create("/zoo2", "mydata".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
          2. 节点删除 :zk.delete("zoo2", -1);
          3. 获取节点的存储内容 : zk.getData("/zoo2", false, null
          4. 加入子节点   : 在已有的节点中,用create指明路径
          5. 判断节点是否存在   : zk.exists("/zoo2", false)

           一个简单的DEMO:   

    import org.apache.zookeeper.*;
    import org.apache.zookeeper.ZooDefs.Ids;
    import java.io.IOException;
    
    public class Demo {
        private static final int SESSION_TIMEOUT = 30000;
        ZooKeeper zk;
    
        public void createZKInstance() throws IOException
        {
            zk = new ZooKeeper("10.20.151.34:2181",Demo.SESSION_TIMEOUT,new Watcher(){
                public void process(WatchedEvent event){}});
        }
        
        public void ZKClose() throws InterruptedException
        {
            zk.close();
        }
        
        public void ZKOperation() throws IOException, KeeperException, InterruptedException
        {
            System.out.println("\n1. 创建ZK节点");
            zk.create("/zoo2", "mydata".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
            System.out.println("\n2. 查看创建ZK节点是否成功");
            System.out.println(new String(zk.getData("/zoo2", false, null)));
            
            System.out.println("\n3. 修改节点数据");
            zk.setData("zoo2", "test".getBytes(), -1);
            
            System.out.println("\n4. 查看是否修改成功");
            System.out.println(new String(zk.getData("/zoo2", false, null)));
            
            System.out.println("\n5. 删除节点");
            zk.delete("zoo2", -1);
    
            System.out.println("\n6. 查看节点是否被删除");
            System.out.println("节点状态:[" + zk.exists("/zoo2", false) + " ]");
        }
    
        public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
            Demo dm = new Demo();
            dm.createZKInstance();
            dm.ZKOperation();
            dm.ZKClose();    
        }
    }

ZK的Leader流程

工作流程:

  1.  恢复数据

  2.  维持与Leader的心跳,接收Leader请求并判断Leader的请求消息类型

  3.  Leader的消息类型: PING消息,REQUEST,ACK,REVALIDATE

  4.  PING消息: 指Leader的心跳信息

       REQUEST消息: Follower发送的提议信息,包括写请求及同步请求。

       ACK 消息:  Follower对提议的回复,超过半数的Follower通过,则Commit该提议

       REVALIDATE消息 :延长session的有效时间.

45935524

                                               leader的工作流程图

~~EOF~~~





除非注明,本站文章均为原创。本文基于 BY-NC-SA 协议进行授权,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名 metaboy(包含链接).

本文链接地址: http://blog.wangyuxiong.com/archives/51889

订阅本站:http://www.wangyuxiong.com/feed

目前还没有任何评论.

无觅相关文章插件,快速提升流量