首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Zookeeper从入门到放弃之Zookeeper典型应用场景

前言

今天来聊一下,Zookeeper的典型应用场景。

本文将从以下场景,来进行描述:

  • 数据发布订阅(配置中心)
  • 命名服务
  • Master选举
  • 分布式队列
  • 分布式锁

数据发布订阅(配置中心)

何为配置中心

当系统架构由单机架构进入分布式架构之后,系统的复杂性大幅度上升,针对分布式应用的配置内容,很难以管理。为了更好地管理,分布式系统内各应用的配置项,采用配置中心化,使用一个中间件配置中心来进行统一配置的管理。

zookeeper实现配置中心

Zookeeper用来实现配置中心,因为我们之前讲过的,Zookeeper具有的一些特殊性

  • znode能够存储数据
  • watch能够监听数据改变

znode能够按照要求,定制化保存所有的配置内容,同时使用watch监听机制,能够实时刷新客户端的配置获取,保证各客户端应用,能够实时获取到最新的配置。

常用的,可以采用两种配置形式来实现:

  1. 一个配置项一个znode
  2. 一个配置文件一个znode

命名服务

何为命名服务

命名服务,即动态的维护服务地址,保证调用可用性。

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实现分布式锁

实现分布式锁,存在两种实现方式

  1. 创建临时节点

如下图所示,可以通过创建临时节点znode(/Lock),争抢创建,当创建成功后,获得锁,然后删除临时节点

实现逻辑如下图所示:

缺点是会发生惊群效应,当锁被释放,会一波激起千层浪,引发大范围的通知,如果高并发的系统,可能会引发灾难性的问题。

  1. 创建顺序临时节点

场景:

小明在医院中治疗感冒,来到医院,先需要进行取号操作,完成取号后,按照号码顺序,进行医疗室。如果前边的号码病人因为某些原因,提前离开,不就诊,小明无需再次取号,可以直接递进。

Zookeeper实现分布式锁,就可以采用场景中类似的实现。

如下图所示,可以通过创建临时顺序节点,到一个集群节点znode(/Lock)上,实现锁的实现。每个实例,通过watch监听前一个顺序节点实例状态。

实现逻辑如下图所示:

总结

以上就是今天我们聊得内容,Zookeeper作为分布式协调服务,因其一些特性,有非常丰富的使用场景。

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/1dcd3f8b100645e0da782a279
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券