Zookeeper应用场景详解(5大应用场景)

Zookeeper应用场景详解(5大应用场景)-mikechen

ZooKeeper简介

Zookeeper应用场景详解(5大应用场景)-mikechen

ZooKeeper 是一个开源的分布式  协调服务框架,它是一个为分布式应用提供一致性服务的软件,是雅虎公司创建,是 Google 的 Chubby 一个开源的实现。

ZooKeeper应用场景非常丰富,下面我详解:5种ZooKeeper应用场景@mikechen

 

数据发布与订阅

数据发布/订阅系统,顾名思义就是发布者将数据发布到ZooKeeper的一个或一系列节点上,供订阅者进行数据订阅。

数据发布/订阅模式是一对多的关系,多个订阅者对象同时监听某一主题对象,这个主题对象在自身状态发生变化时会通知所有的订阅者对象。

Zookeeper应用场景详解(5大应用场景)-mikechen

数据发布/订阅一般有两种设计模式:推模式和拉模式。

1.推模式

在推模式中,服务端主动将数据更新发送给所有订阅的客户端。

2.拉模式

而拉模式则是:由客户端主动发起请求来获取数据,通常客户端采用定时轮询的方式进行拉取。

Zookeeper采用了推拉相结合的模式,客户端向服务端注册自己需要关注的节点,一旦该节点数据发生变更,那么服务端就会向相应的客户端推送Watcher事件通知。

客户端接收到此通知后,主动到服务端获取最新的数据。

 

配置管理

假如:我们线上有个服务器集群,成百上千台服务器,如果更新配置的时候怎么更新呢,一台台机器去更新?这时候做修改那就太不切实际了,那么就需要用到统一配置管理。

解决方案:

1.现在把这些配置全部放到zookeeper上去,保存在 Zookeeper 的某个目录节点中;

2.然后所有相关应用程序对这个目录节点进行监听;

3.一旦配置信息发生变化,每个应用程序就会收到 Zookeeper 的通知,然后从 Zookeeper 获取新的配置信息应用到系统中就好。

如下图所示:

Zookeeper应用场景详解(5大应用场景)-mikechen

将配置信息保存在 Zookeeper 的某个目录节点中,一旦配置信息发生变化,每台应用机器就会收到 Zookeeper 的通知,然后从 Zookeeper 获取新的配置信息应用到系统中。

 

 

命名服务

命名服务是指通过指定的名字来获取资源或者服务的地址,利用 ZooKeeper创建一个全局的路径,这个路径就可以作为一个名字。

比如,Dubbo使用ZooKeeper为其命名服务,维护全局的服务地址列表。

下图所示:

Zookeeper应用场景详解(5大应用场景)-mikechen

左侧Service唯一服务名称:

com.mikechen.helloService

这个就是命名服务,利用 ZooKeeper创建一个全局的路径,这个路径(com.mikechen.helloService)就可以作为一个名字,产生唯一的标识。

Dubbo中使用ZooKeeper来作为其命名服务,维护全局的服务地址列表,客户端应用能够根据指定名字来获取资源或服务的地址,提供者等信息。

 

分布式锁

在传统的应用程序中,线程、进程的同步,都可以通过操作系统提供的机制来完成。

比如:比如Synchronized、Lock锁等,这种方式线程锁只在同一JVM中有效果。

但是在分布式系统中,多个进程之间的同步,操作系统层面就无能为力了。

因为:已经跨了操作系统了,这时候就需要像ZooKeeper这样的分布式的协调服务来协助完成同步,这就是分布式锁。

解决方案:

1.每个客户端对某个方法加锁时,在zookeeper上的与该方法对应的指定节点的目录下,生成一个唯一的瞬时有序节点;

2.判断是否获取锁的方式很简单,只需要判断有序节点中序号最小的一个;

3.当释放锁的时候,只需将这个瞬时节点删除即可,同时可以避免服务宕机导致的锁无法释放,而产生的死锁问题。

可以直接使用zookeeper第三方库Curator客户端,这个客户端中封装了一个可重入的锁服务。
Zookeeper应用场景详解(5大应用场景)-mikechen

集群管理

在分布式的集群中,经常会由于各种原因,比如:硬件故障,软件故障,网络问题。

还经常会出现:有些服务器节点会进进出出,有新的节点加入进来,也有老的节点退出集群。

这个时候,集群中其他机器需要感知到这种变化,然后根据这种变化做出对应的决策,这就是集群管理。

一句话总结:集群管理无在乎两点:

  1. 是否有机器退出和加入;
  2. 以及选举master;

Zookeeper应用场景详解(5大应用场景)-mikechen

对于第一点:所有机器约定在父目录GroupMembers下创建临时目录节点,然后监听父目录节点的子节点变化消息,一旦有机器挂掉,该机器与 zookeeper的连接断开,新机器加入 也是类似。

对于第二点:我们稍微改变一下,所有机器创建临时顺序编号目录节点,每次选取编号最小的机器作为Master就好。

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法