前言
今天来聊一下,Zookeeper的典型应用场景。
本文将从以下场景,来进行描述:
- 数据发布订阅(配置中心)
- 命名服务
- Master选举
- 分布式队列
- 分布式锁
数据发布订阅(配置中心)
何为配置中心
当系统架构由单机架构进入分布式架构之后,系统的复杂性大幅度上升,针对分布式应用的配置内容,很难以管理。为了更好地管理,分布式系统内各应用的配置项,采用配置中心化,使用一个中间件配置中心来进行统一配置的管理。
zookeeper实现配置中心
Zookeeper用来实现配置中心,因为我们之前讲过的,Zookeeper具有的一些特殊性
- znode能够存储数据
- watch能够监听数据改变
znode能够按照要求,定制化保存所有的配置内容,同时使用watch监听机制,能够实时刷新客户端的配置获取,保证各客户端应用,能够实时获取到最新的配置。
常用的,可以采用两种配置形式来实现:
- 一个配置项一个znode
更适合于配置项比较少的,可以采用此方式,实现快速配置存储、实时获取。当配置项比较多,如果采用此,可能会造成zookeeper节点非常多 - 一个配置文件一个znode
可以通过将整个配置,写入一个znode的数据中,比如采用byte形式写入,客户端完成读取之后,转成客户端需要的格式,然后进行相关处理。
命名服务
何为命名服务
命名服务,即动态的维护服务地址,保证调用可用性。
Zookeeper实现命名服务
场景:
工程师小明 负责A服务的开发,工程师小丽 负责B服务的开发,A服务其中有业务逻辑,需要依赖B服务,调用B服务,完成功能实现。当小明已经完成A服务开发之后,被安排开发别的项目,但是此时B服务仍未完成。思考,小明如何实现不停机,上线A服务?
如图所示,我们可以通过zookeeper来实现
A服务客户端,注册一个watch监听到节点znode(/ServiceB),B服务完成节点znode(/ServiceB)的创建,当B服务完成上线后,节点发生数据变化,激活监听机制,A服务收到数据变化,进行刷新B服务地址,从而实现不停机,上线A服务。
Master选举
何为Master选举
在集群方案中,无法保证Master是一直可用的,当Master失去可用性,挂掉,那么slave实例必须能够进行Master的选举,保证整个系统的可用,这就是Master选举。
Zookeeper实现Master选举
实现Master选举,市面上有很多成熟的方案。那么,我们主要聊一下,采用Zookeeper实现Master选举。其实,采用Zookeeper实现Master选举非常简单。
如下图所示:
我们需要将所有slave客户端应用都使用watch机制,监听Master注册的临时节点znode(/Master),当Master发生故障,宕机之后,节点znode(/Master)因为是临时节点,因此发生session失效。各slave客户端,监听到变化,争抢创建临时主节点znode(/Master),当一个slave创建成功之后,便成为新的Master,其他slave就还进入等待中。同时,获取Master的实时信息,进行数据同步。
与此同时,我们可以将所有的客户端实例,都注册临时或者临时顺序节点,在一个集群节点znode(/servers)下,因此,我们可以通过,获取(/servers)可以查看分布式应用中,所有应用的健康状态,可以进行心跳检测。同时,采用最小节点为Master方式,也能实现Master选举
分布式队列
何为分布式队列
在分布式系统应用中,我们可以采用生产者-消费者的设计模式,来实现异步数据传输,完成各种队列功能。市面上,常见的分布式队列中间件,包括RabbitMQ、RocketMQ、ActiveMQ、Kafka等,那么zookeeper同样可以实现分布式队列。
Zookeeper实现分布式队列
Zookeeper实现分布式队列,因为我们之前讲核心概念中的特性,FIFO。
如下图所示:
生产者客户端应用,可以创建顺序节点 在一个集群节点znode(/Queue)下,然后消费者,监听集群节点znode(/Queue),读取最新的子节点信息,消费最小号节点的数据值。
此处,重点在于创建的是顺序节点。
同时,队列分为有界队列,无界队列。无界队列,生产者,可以争抢创建顺序节点,有界队列,则需要进行控制生产者的创建,此时,就需要分布式锁的出现,来控制生产者创建节点。
分布式锁
何为分布式锁
分布式应用中,对于集群中应用的业务操作,有所控制,需要有机制来进行管理,即为分布式锁,通过对资源加锁,实现,管理。
Zookeeper实现分布式锁
实现分布式锁,存在两种实现方式
- 创建临时节点
如下图所示,可以通过创建临时节点znode(/Lock),争抢创建,当创建成功后,获得锁,然后删除临时节点
实现逻辑如下图所示:
缺点是会发生惊群效应,当锁被释放,会一波激起千层浪,引发大范围的通知,如果高并发的系统,可能会引发灾难性的问题。
- 创建顺序临时节点
场景:
小明在医院中治疗感冒,来到医院,先需要进行取号操作,完成取号后,按照号码顺序,进行医疗室。如果前边的号码病人因为某些原因,提前离开,不就诊,小明无需再次取号,可以直接递进。
Zookeeper实现分布式锁,就可以采用场景中类似的实现。
如下图所示,可以通过创建临时顺序节点,到一个集群节点znode(/Lock)上,实现锁的实现。每个实例,通过watch监听前一个顺序节点实例状态。
实现逻辑如下图所示:
总结
以上就是今天我们聊的内容,Zookeeper作为分布式协调服务,因其一些特性,有非常丰富的使用场景。