Zookeeper相关内容及简单理解、安装
一、什么是Zookeeper
Zookeeper是一个开源的分布式服务框架,它是Apache hadoop项目的一个子项目,主要用来解决分布式应用场景中存在的一些问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置管理等。在分布式模式下,能够为分布式应用提供高性能和可靠地协调服务,使用Zookeeper可以简化分布式协调服务的实现。
Zookeeper提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
具体可见这个博客:http://blog.csdn.net/liuyuehu/article/details/52120546
和 http://blog.csdn.net/u012152619/article/details/52908878
二、Zookeeper一般用在什么场合?
数据发布与订阅(配置中心):
发布与订阅,是发布者将数据发布到zk节点上,工订阅者动态获取数据,实现配置信息的集中式管理和动态更新。例如全局的配置信息,服务式服务框架的服务地址。
(1)应用中用到的一些配置信息放到ZK上进行集中管理。通常是:应用在启动时会主动来获取一次配置,在节点上注册一个Watcher,以后每次配置有更新时,都会实时通知给订阅了的哭护短,从而达到获取最新配置信息的目的。
(2)分布式搜索服务器中,索引的云信息和服务器集群机器的节点状态存放ZK的一些指定节点,供各个客户端订阅使用
负载均衡
这里说的负载均衡是指软负载均衡。在分布式环境中,为了保证高可用性,通常同一个应用或同一服务的提供方都会部署多份,达到对等服务。而消费者就需要在这些对等服务的服务器中选择一个来执行相关的业务逻辑,其中比较典型的是消息中间件中生产者/消费者负载均衡。
消息中间件发布者和订阅者的负载均衡,linkedin开源的KafkaMQ和阿里开源的metaq都是通过zookeeper来做到生产者、消费者的负载均衡。这里以metaq为例讲下:
生产者负载均衡/消费者负载均衡:
metaq发送消息的时候,生产者在发送消息的时候必须选择一台broker上的一个分区来发送消息,因此metaq在运行过程中,会把所有broker和对应的分区信息全部注册到ZK指定节点上,默认的策略是一个依次轮询的过程,生产者在通过ZK获取分区列表之后,会按照brokerId和partition的顺序排列组织成一个有序的分区列表,发送的时候按照从头到尾循环往复的方式选择一个分区来发送消息。
在消费过程中,一个消费者会消费一个或多个分区中的消息,但是一个分区只会由一个消费者来消费。MetaQ的消费策略是:
-
每个分区针对同一个group只挂载一个消费者。
-
如果同一个group的消费者数目大于分区数目,则多出来的消费者将不参与消费。
-
如果同一个group的消费者数目小于分区数目,则有部分消费者需要额外承担消费任务。
在某个消费者故障或者重启等情况下,其他消费者会感知到这一变化(通过 zookeeper watch消费者列表),然后重新进行负载均衡,保证所有的分区都有消费者进行消费。
(3)命名服务(Naming Service)
命名服务也是分布式系统中比较常见的一类场景。在分布式系统中,通过使用命名服务,客户端应用能够根据指定名字来获取资源或者服务的地址,提供者等信息。被命名实体通常可以是集群中的机器,提供的服务地址,远程对象等等——这些我们都可以统称为他们的名字(Name)。其中较为常见的就是一些分布式服务框架中的服务地址列表。通过调用ZK提供的创建节点的API,能够很容易创建一个全局唯一的path,这个path就可以作为一个名称。
Dubbo中使用zookeeper来作为命名服务,维护全局的服务地址列表。
在Dubbo(下一个话题讲)中:
服务提供者在启动的时候,向ZK上的指定节点/dubbo/${serviceName}/providers目录下写入自己的URL地址,这个操作就完成了服务的发布。
服务消费者启动的时候,订阅/dubbo/${serviceName}/providers目录下的提供者URL地址,并向/dubbo/${serviceName}/consumers目录下写入自己的URL地址。
向ZK上注册的地址都是临时节点,这样就能够保证服务提供者和消费者能自动感应资源的变化。
(4)分布式通知/协调
Zookeeper中持有watcher注册与异步通知机制,能够很好的实现分布式环境下不同系统之间的通知与协调,实现对数据变更的实时处理。使用方法通常是不同系统都对ZK上同一个znode进行注册,监听znode的变化(包括znode本身内容及其子节点),其中一个系统更新了znode,那么另一个系统能够收到通知,并做出相应处理。(http://www.cnblogs.com/tommyli/p/3766189.html)
(5)集群管理与Master选举:
集群机器监控:通常用于对集群中机器状态有较高的要求的场景,能够快速对集群中机器变化做出响应。
(6)分布式锁
分布式锁,这个主要得益于ZooKeeper为我们保证了数据的强一致性。锁服务可以分为两类,一个是保持独占,另一个是控制时序。
(7)分布式队列
队列方面,简单地讲有两种,一种是常规的先进先出队列,另一种是要等到队列成员聚齐之后的才统一按序执行。
第二种队列其实是在FIFO队列的基础上作了一个增强。通常可以在 /queue 这个znode下预先建立一个/queue/num 节点,并且赋值为n(或者直接给/queue赋值n),表示队列大小,之后每次有队列成员加入后,就判断下是否已经到达队列大小,决定是否可以开始执行了。这种用法的典型场景是,分布式环境中,一个大任务Task A,需要在很多子任务完成(或条件就绪)情况下才能进行。这个时候,凡是其中一个子任务完成(就绪),那么就去 /taskList 下建立自己的临时时序节点(CreateMode.EPHEMERAL_SEQUENTIAL),当 /taskList 发现自己下面的子节点满足指定个数,就可以进行下一步按序进行处理了。
三、windows中下载、安装Zookeeper,启动:
(1)下载在搜索框输入Zookeeper进入官网即可。下载的是zip包,解压如下:
(2)bin目录如下:
(3)打开控制台窗口,并转到bin目录下:
运行zkServer.cmd:
注意此时如果启动失败,意外关闭,并提示zoo.conf找不到,那么zoo_sample.conf也是可以的,不过要实现对改文件进行部分修改,换成你自己的参数。如图:
Zookeeper启动之后会显示如下信息,如图:
最后几行是这样的:表示启动成功,
(4)启动客户端运行查看一下:
表示客户端已经顺利连接,Zookeeper启动成功!