1 Zookeeper安装与入门

1 介绍

官网地址 https://zookeeper.apache.org/

         ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

     Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应,从而实现集群中类似Master/Slave管理模式。

Zookeeper=文件系统+通知机制。

2 特点

1)Zookeeper:一个领导者(leader),多个跟随者(follower)组成的集群。

2)Leader负责进行投票的发起和决议,更新系统状态

3)Follower用于接收客户请求并向客户端返回结果,在选举Leader过程中参与投票

4)集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。

5)全局数据一致:每个server保存一份相同的数据副本,client无论连接到哪个server,数据都是一致的。

6)更新请求顺序进行,来自同一个client的更新请求按其发送顺序依次执行。

7)数据更新原子性,一次数据更新要么成功,要么失败。

8)实时性,在一定时间范围内,client能读到最新数据。

3 数据结构

ZooKeeper数据模型的结构与Unix文件系统很类似唯一的不同在于znode是可以存储数据的,整体上可以看作是一棵树,每个节点称做一个ZNode。每一个ZNode默认能够存储1MB的数据,每个ZNode都可以通过其路径唯一标识

有四种类型的znode:
    PERSISTENT-持久化目录节点
    客户端与zookeeper断开连接后,该节点依旧存在
    PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点
    客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
    EPHEMERAL-临时目录节点
    客户端与zookeeper断开连接后,该节点被删除
    EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点
    客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号

节点Znode可以包含数据和子节点,但是EPHEMERAL类型的节点不能有子节点。

4 应用场景

提供的服务包括:统一命名服务、统一配置管理、统一集群管理、软负载均衡、分布式锁等。

统一命名服务

在分布式环境下,主要的应用场景在于rpc服务,比如dubbo等框架,可以将相应的服务注册在zk上,这样服务调用就可以根据其所命名的服务来提供对外服务等。经常需要对应用/服务进行统一命名,便于识别不同服务。

1)类似于域名与ip之间对应关系,ip不容易记住,而域名容易记住。

2)通过名称来获取资源或服务的地址,提供者等信息。

统一配置管理

1)分布式环境下,配置文件管理和同步是一个常见问题。

1)一个集群中,所有节点的配置信息是一致的,比如 Hadoop 集群。

2)对配置文件修改后,希望能够快速同步到各个节点上。

2)配置管理可交由ZooKeeper实现。

1)可将配置信息写入ZooKeeper上的一个Znode

2)各个节点监听这个Znode

3)一旦Znode中的数据被修改,ZooKeeper将通知各个节点。

统一集群管理

1)分布式环境中,实时掌握每个节点的状态是必要的。

1)可根据节点实时状态做出一些调整。

2)可交由ZooKeeper实现。

1)可将节点信息写入ZooKeeper上的一个Znode

2)监听这个Znode可获取它的实时状态变化。

3)典型应用

1HBaseMaster状态监控与选举。

 

软负载均衡

       可以基于ZK来实现DDNS动态域名解析服务,从而达到域名的动态添加、修改、删除等。能够基于域名服务,进行应用的负载,从而达到请求负载到各个应用中。可以参考《从Paxos到Zookeeper》这本书对于用zk实现动态DNS的方案P167。
      zk实现负载均衡就是通过watcher机制和临时节点判断哪些节点宕机来获得可用的节点实现的:
ZooKeeper会维护一个树形的数据结构,类似于Windows资源管理器目录,其中EPHEMERAL类型的节点会随着创建它的客户端断开而被删除,利用这个特性很容易实现软负载均衡。
      基本原理是,每个应用的Server启动时创建一个EPHEMERAL节点,应用客户端通过读取节点列表获得可用服务器列表,并订阅节点事件,有Server宕机断开时触发事件,客户端监测到后把该Server从可用列表中删除。
      消息中间件中发布者和订阅者的负载均衡,linkedin开源的KafkaMQ和阿里开源的MetaQ都是通过zookeeper来做到生产者、消费者的负载均衡。

 

分布式锁

在我们日常的开发中,如果是单个进程中对共享资源的访问,我们只需要用synchronized或者lock就能实现互斥操作。但是对于跨进程、跨主机、跨网络的共享资源似乎就无能为力了。有了 zookeeper 的一致性文件系统,锁的问题变得容易。锁服务可以分为两类,一个是保持独占,另一个是控制时序。 对于第一类,我们将 zookeeper 上的一个 znode 看作是一把锁,通过 create znode 的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。用完删除掉自己创建的 distribute_lock 节点就释放出锁。 对于第二类, /distribute_lock 已经预先存在,所有客户端在它下面创建临时顺序编号目录节点,和选 master 一样,编号最小的获得锁,用完删除,依次方便。

思路

    1首先zookeeper中我们可以创建一个/distributed_lock持久化节点
    2然后再在/distributed_lock节点下创建自己的临时顺序节点,比如:/distributed_lock/task_00000000008
    3获取所有的/distributed_lock下的所有子节点,并排序
    4判读自己创建的节点是否最小值(第一位)
    5如果是,则获取得到锁,执行自己的业务逻辑,最后删除这个临时节点。
    6如果不是最小值,则需要监听自己创建节点前一位节点的数据变化,并阻塞。
    7当前一位节点被删除时,我们需要通过递归来判断自己创建的节点是否在是最小的,如果是则执行5);如果不是则执行6)(就是递归循环的判断)
 

5.安装

5.1 安装前准备

       安装jdk,并拷贝安装包到linux服务器。

5.2 步骤

     解压     tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/

    修改配置
     (1)将/opt/module/zookeeper-3.4.10/conf这个路径下的zoo_sample.cfg修改为zoo.cfg;
             mv zoo_sample.cfg zoo.cfg
 (2)打开zoo.cfg文件,修改dataDir路径:
              vim zoo.cfg
        修改如下内容:
             dataDir=/opt/module/zookeeper-3.4.10/zkData
  (3)在/opt/module/zookeeper-3.4.10/这个目录上创建zkData文件夹
              mkdir zkData

    启动服务   bin/zkServer.sh start

    查看状态  bin/zkServer.sh status

    启动客户端  bin/zkCli.sh

    停止服务  bin/zkServer.sh stop

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值