Zookeeper是一个开源的分布式协调服务,主要用于解决分布式系统中的节点管理问题,如实时感知节点状态和统一管理等
从设计模式角度来看,Zookeeper是一个基于观察者模式设计的分布式服务管理框架,负责存储和管理大家关心的数据,当数据状态发生变化时,Zookeeper会通知已经在Zookeeper上注册的观察者做出相应的反应
实现原理上,Zookeeper可以看作是文件系统和通知机制的结合
Zookeeper的应用场景包括:
统一配置管理:将公共配置信息放到ZK中,修改ZK的信息后,会通知相关配置文件
统一命名服务:在某一个节点下放一些IP地址,通过访问ZK的一个Znode节点获取这些IP地址
同一集群管理:分布式集群中状态的监控和管理,使用Zookeeper来存储
分布式协调:将多个服务提供者的信息放在某个节点上,服务的消费者可以通过ZK调用
服务节点动态上下线:提供者宕机时,会删除在ZK的节点,然后ZK通知给消费者
软负载均衡
动态选举Master:Zookeeper会每次选举最小编号的作为Master,如果Master挂了,对应的Znode节点就会删除,然后让新的最小编号作为Master
分布式锁
Zookeeper的文件系统类似于Unix文件系统,可以看做是一颗树,每个节点叫做Znode,每个Znode最多能存1MB数据,数据通常是配置信息。每个节点可以通过路径来标识
ZooKeeper的实现原理主要包括以下几个方面:
简单的数据模型:ZooKeeper使用一个共享的树形结构的名字空间来进行相互协调,服务器内存中的数据模型由一系列被称为ZNode的数据节点组成。ZooKeeper将全量的数据存储在内存中,以此来提高服务器吞吐、减少延迟
文件系统和通知机制:ZooKeeper提供了一个类似于文件系统的结构,同时具有通知机制。客户端可以注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,ZooKeeper会通知客户端
节点类型:ZooKeeper实现了多种功能的核心原理是其节点类型,包括持久节点、临时节点和顺序节点。持久节点在创建后会一直保存在ZooKeeper上,除非主动删除;临时节点仅在创建的当前会话中有效,会话断开后,临时节点会被删除;顺序节点在创建时会自动分配一个顺序编号
ZAB协议:ZooKeeper的核心是原子广播,这个机制保证了各个server之间的同步,实现这个机制的协议叫做Zab协议。Zab协议主要负责在ZooKeeper的所有服务器之间保持数据一致性
集群和选举机制:ZooKeeper可以构建集群,一个ZooKeeper集群通常由一组机器构成,组成ZooKeeper集群的每台机器都会在内存中维护当前服务器状态,并且每台机器之间都相互通信。ZooKeeper集群中的服务器节点分为Leader和Follower,启动时会进行选举产生Leader节点
Watcher机制:ZooKeeper可以提供分布式数据的发布/订阅功能,依赖的就是Watcher监听机制。客户端可以向服务端注册Watcher监听,服务端的指定事件触发之后,就会向客户端发送一个事件通知
通过这些实现原理,ZooKeeper能够为分布式应用提供一致性服务,解决分布式系统中的节点管理问题,如实时感知节点状态和统一管理等
ZooKeeper中的节点类型具有以下特性:
持久节点(PERSISTENT):持久节点在创建后会一直存在,直到被主动删除。它们的生命周期与创建它们的客户端会话无关,不会因为客户端会话失效而消失
临时节点(EPHEMERAL):临时节点的生命周期依赖于创建它们的客户端会话。一旦会话结束,临时节点将被自动删除。临时节点不允许拥有子节点
顺序节点(SEQUENTIAL):顺序节点在创建时会自动分配一个顺序编号。在ZK中,每个父节点会为其第一级子节点维护一份时序,记录每个子节点创建的先后顺序
持久顺序节点(PERSISTENT_SEQUENTIAL):这类节点具有持久节点和顺序节点的特性。在创建子节点时,ZK会自动为给定节点名加上一个数字后缀,作为新的节点名。这个数字后缀的范围是整型的最大值
临时顺序节点(EPHEMERAL_SEQUENTIAL):这类节点具有临时节点和顺序节点的特性。在客户端会话失效后,节点会自动清除
容器节点(CONTAINER):容器节点是在ZooKeeper 3.5版本之后新增的节点类型。它的表现形式和持久节点类似,但当容器节点的子节点数量为0时,容器节点会被ZooKeeper自动清除
持久TTL节点(PERSISTENT_WITH_TTL)和持久顺序TTL节点(PERSISTENT_SEQUENTIAL_WITH_TTL):这两种节点类型在创建时需要指定一个生存时间(TTL)。当节点的生存时间到期后,节点会被自动删除
这些节点类型及其特性使得ZooKeeper能够满足不同的分布式应用场景需求,如统一配置管理、分布式锁、集群选举等
在ZooKeeper中,顺序节点(SEQUENTIAL)的作用主要体现在为节点分配一个全局唯一的顺序编号,以保证节点的创建顺序。这种特性在分布式系统中的某些场景下非常有用,例如分布式锁、选举等
顺序节点在创建时,ZooKeeper会自动为给定节点名加上一个数字后缀,这个数字后缀由父节点维护的自增整型数字生成。这样,每个顺序节点都具有一个全局唯一的顺序编号,可以用来表示节点的创建顺序
例如,在实现分布式锁时,可以利用顺序节点的特性。客户端在请求锁时,在一个固定的持久节点下创建临时顺序节点。ZooKeeper会为这些临时顺序节点分配一个全局唯一的顺序编号。客户端可以根据这个编号来判断自己是否获得了锁。具体来说,如果客户端创建的节点编号是当前所有节点中最小的,那么它就获得了锁
总之,ZooKeeper中顺序节点的作用主要是为节点分配全局唯一的顺序编号,以保证节点的创建顺序。这种特性在分布式系统的某些场景下非常有用,如分布式锁、选举等
顺序节点在分布式锁中的作用主要是为了确保在多个客户端竞争锁时,能够按照创建顺序来决定哪个客户端获得锁。在实现分布式锁的过程中,每个客户端都会在指定的节点下注册一个临时顺序节点。ZooKeeper会为这些临时顺序节点分配一个全局唯一的顺序编号。客户端可以根据这个编号来判断自己是否获得了锁
具体来说,如果客户端创建的节点编号是当前所有节点中最小的,那么它就获得了锁。如果自己的节点不是所有子节点中最小的,意味着还没有获得锁。在这种情况下,客户端只需要监听比自己编号小的节点。当比自己小的节点被删除后,客户端会收到watcher事件,此时再次判断自己的节点是不是所有子节点中最小的。如果是,则获得锁;否则就不断重复这个过程