16年第一天上班 接下来几天会整理下之前学过的知识 :node
一. ZooKeeper介绍apache
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、命名服务、分布式同步、组服务等
二. ZooKeeper的使用场景服务器
数据发布与订阅(配置中心)负载均衡
发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到ZK节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新。例如全局的配置信息,服务式服务框架的服务地址列表等就很是适合使用。框架
注意:在上面提到的应用场景中,有个默认前提是:数据量很小,可是数据更新可能会比较快的场景。异步
负载均衡分布式
这里说的负载均衡是指软负载均衡。在分布式环境中,为了保证高可用性,一般同一个应用或同一个服务的提供方都会部署多份,达到对等服务。而消费者就需要在这些对等的服务器中选择一个来执行相关的业务逻辑,其中比较典型的是消息中间件中的生产者,消费者负载均衡。oop
在某个消费者故障或者重启等状况下,其余消费者会感知到这一变化(经过 zookeeper watch消费者列表),而后从新进行负载均衡,保证全部的分区都有消费者进行消费。code
命名服务(Naming Service)server
命名服务也是分布式系统中比较常见的一类场景。在分布式系统中,经过使用命名服务,客户端应用可以根据指定名字来获取资源或服务的地址,提供者等信息。被命名的实体一般能够是集群中的机器,提供的服务地址,远程对象等等——这些咱们均可以统称他们为名字(Name)。其中较为常见的就是一些分布式服务框架中的服务地址列表。经过调用ZK提供的建立节点的API,可以很容易建立一个全局惟一的path,这个path就能够做为一个名称。
注意,全部向ZK上注册的地址都是临时节点,这样就可以保证服务提供者和消费者可以自动感应资源的变化。
分布式通知/协调
ZooKeeper中特有watcher注册与异步通知机制,可以很好的实现分布式环境下不一样系统之间的通知与协调,实现对数据变动的实时处理。使用方法一般是不一样系统都对ZK上同一个znode进行注册,监听znode的变化(包括znode自己内容及子节点的),其中一个系统update了znode,那么另外一个系统可以收到通知,并做出相应处理
1). 另外一种心跳检测机制:检测系统和被检测系统之间并不直接关联起来,而是经过zk上某个节点关联,大大减小系统耦合。
2). 另外一种系统调度模式:某系统有控制台和推送系统两部分组成,控制台的职责是控制推送系统进行相应的推送工做。管理人员在控制台做的一些操做,其实是修改了ZK上某些节点的状态,而ZK就把这些变化通知给他们注册Watcher的客户端,即推送系统,因而,做出相应的推送任务。
3). 另外一种工做汇报模式:一些相似于任务分发系统,子任务启动后,到zk来注册一个临时节点,而且定时将本身的进度进行汇报(将进度写回这个临时节点),这样任务管理者就可以实时知道任务进度。
总之,使用zookeeper来进行分布式通知和协调可以大大下降系统之间的耦合
集群管理与Master选举
Master选举则是zookeeper中最为经典的应用场景了。
分布式锁
分布式锁,这个主要得益于ZooKeeper为咱们保证了数据的强一致性。锁服务能够分为两类,一个是 保持独占,另外一个是 控制时序。
分布式队列
队列方面,简单地讲有两种,一种是常规的先进先出队列,另外一种是要等到队列成员聚齐以后的才统一按序执行。对于第一种先进先出队列,和分布式锁服务中的控制时序场景基本原理一致,这里再也不赘述。 第二种队列实际上是在FIFO队列的基础上做了一个加强。一般能够在 /queue 这个znode下预先创建一个/queue/num 节点,而且赋值为n(或者直接给/queue赋值n),表示队列大小,以后每次有队列成员加入后,就判断下是否已经到达队列大小,决定是否能够开始执行了。这种用法的典型场景是,分布式环境中,一个大任务Task A,须要在不少子任务完成(或条件就绪)状况下才能进行。这个时候,凡是其中一个子任务完成(就绪),那么就去 /taskList 下创建本身的临时时序节点(CreateMode.EPHEMERAL_SEQUENTIAL),当 /taskList 发现本身下面的子节点知足指定个数,就能够进行下一步按序进行处理了。
三. ZooKeeper的集群安装部署
**要将 ZK 集群的节点数量要为奇数(2n+1:如 三、五、7 个节点)较为合适** 服务器 1:192.168.1.81 端口:218一、288一、3881 服务器 2:192.168.1.82 端口:218二、288二、3882 服务器 3:192.168.1.83 端口:218三、288三、3883 1. 修改/etc/hosts 192.168.1.81 zk-01 192.168.1.82 zk-02 192.168.1.83 zk-03 2. 解压zookeeper,在安装目录中建立data,logs目录 3. copy 安装文件中conf/ 下的 zoo_sample.cfg cp zoo_sample.cfg zoo.cfg 4. 配置每一个节点的zoo.cfg,例如: #心跳时间 tickTime=2000 #Zookeeper 服务器集群中链接到 Leader 的 Follower 服务器 initLimit=10 syncLimit=5 dataDir=/${ZK_HOME}/node-01/data dataLogDir=/${ZK_HOME}/node-01/logs clientPort=2181 server.1=zk-01:2881:3881 server.2=zk-02:2882:3882 server.3=zk-03:2883:3883 5. 在 dataDir=/${ZK_HOME}/data 下建立 myid 文件分别是配置中server.x中x的值 6. iptables中过滤暴露的端口 7. 启动 /${ZK_HOME}/bin/zkServer.sh start 8. 侦听 tail -500f /${ZK_HOME}/bin/zookeeper.out
ZK下载地址:http://apache.fayea.com/zookeeper/
ZK的介绍、场景、集群安装就到这里,欢迎提问!