一、背景
在互联网应用中,为了适应业务的要求,企业级的系统通常是庞大的,为了解决这一问题,分布式架构应运而生。
分布式架构带来了其特有的复杂性。各个系统需要协调服务,于是zookeeper便诞生了。
zookeeper主要用来解决分布式集群中应用系统的一致性问题。
二、存储结构
ZooKeeper采用了类似文件系统的的数据模型。
1)类似文件系统的结构
2)在zookeeper中,每一个节点被称为一个znode如nodeA、nodeB都是一个znode,每个znode具有唯一的路径标识。
在zookeeper中,有4种znoode类型。
1、PERSISTENT:持久节点。创建后只要不删除就永久存在。
2、EPHEMERAL:临时节点。会话结束后该结点自动被删除,EPHEMERAL结点不允许有子节点。
3、PERSISTENT_SEQUENTIAL:持久有序节点。
4、EPHEMERAL_SEQUENTIAL:临时有序节点。
3) znode节点可以被监控,包括这个目录中存储的数据的修改,子节点目录的变化,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的集中管理,集群管理,分布式锁等等。
4)每一个znode为三部分组成:
1、stat. 此为状态信息, 描述该znode的版本, 权限等信息
;
2、data. 与该znode关联的数据
;
3、children. 该znode下的子节点
;
三、常见应用场景
让我们来看看zookeeper可以为我们带来什么,在来决定是否要适用这项结束。
1)配置管理:zookeepe通过发布与订阅模式为我们提供了一个集中的配置管理,当这个配置产生变化时,可以立刻通知到各个应用系统。
2)Name Server:分布式环境下,经常需要对应用/服务进行统一命名,便于识别不同服务。
比如通过名称来获取服务的地址。
3)分布式锁:单机程序为了避免数据不一致的问题常常加锁,zookeeper可以为我们提供在分布式情况需要对相应资源加锁。
(可以支持多种锁类型如互斥锁、自旋锁等)
4)集群管理:在分布式环境下经常会由于各种原因,比如硬件故障,软件故障,网络问题,有些节点会进进出出。zookeeper通过对临时有序节点和监听机制实现集群管理。
四、成熟项目中的使用
1)storm中用zookeeper来协调同步集群中机器的状态(并不传递消息)。基本不会有负载,对机器性能没什么要求。
2)dubbo中采用zookeeper来作注册中心,在阿里内部采用的是基于数据库的注册中心。
3)Hadoop中用zookeeper来管理集群中的NameNode。
4)kafka通过zookeeper实现生产者在消费端的负载均衡,动态的集群扩展等等。
还有很多场景就不一一列举了。
五、总结
虽然在挺久之前就接触过zk,但一直没有太深入的学习,现在正好工作中需要使用,借此机会再深入的学习下。