ZooKeeper简介
ZooKeeper 是一个开源的分布式 协调服务框架,它是一个为分布式应用提供一致性服务的软件,是雅虎公司创建,是 Google 的 Chubby 一个开源的实现。
ZooKeeper应用场景非常丰富,下面我详解:5种ZooKeeper应用场景@mikechen
数据发布与订阅
数据发布/订阅系统,顾名思义就是发布者将数据发布到ZooKeeper的一个或一系列节点上,供订阅者进行数据订阅。
数据发布/订阅模式是一对多的关系,多个订阅者对象同时监听某一主题对象,这个主题对象在自身状态发生变化时会通知所有的订阅者对象。
数据发布/订阅一般有两种设计模式:推模式和拉模式。
1.推模式
在推模式中,服务端主动将数据更新发送给所有订阅的客户端。
2.拉模式
而拉模式则是:由客户端主动发起请求来获取数据,通常客户端采用定时轮询的方式进行拉取。
Zookeeper采用了推拉相结合的模式,客户端向服务端注册自己需要关注的节点,一旦该节点数据发生变更,那么服务端就会向相应的客户端推送Watcher事件通知。
客户端接收到此通知后,主动到服务端获取最新的数据。
配置管理
假如:我们线上有个服务器集群,成百上千台服务器,如果更新配置的时候怎么更新呢,一台台机器去更新?这时候做修改那就太不切实际了,那么就需要用到统一配置管理。
解决方案:
1.现在把这些配置全部放到zookeeper上去,保存在 Zookeeper 的某个目录节点中;
2.然后所有相关应用程序对这个目录节点进行监听;
3.一旦配置信息发生变化,每个应用程序就会收到 Zookeeper 的通知,然后从 Zookeeper 获取新的配置信息应用到系统中就好。
如下图所示:
将配置信息保存在 Zookeeper 的某个目录节点中,一旦配置信息发生变化,每台应用机器就会收到 Zookeeper 的通知,然后从 Zookeeper 获取新的配置信息应用到系统中。
命名服务
命名服务是指通过指定的名字来获取资源或者服务的地址,利用 ZooKeeper创建一个全局的路径,这个路径就可以作为一个名字。
比如,Dubbo使用ZooKeeper为其命名服务,维护全局的服务地址列表。
下图所示:
左侧Service唯一服务名称:
com.mikechen.helloService
这个就是命名服务,利用 ZooKeeper创建一个全局的路径,这个路径(com.mikechen.helloService)就可以作为一个名字,产生唯一的标识。
Dubbo中使用ZooKeeper来作为其命名服务,维护全局的服务地址列表,客户端应用能够根据指定名字来获取资源或服务的地址,提供者等信息。
分布式锁
在传统的应用程序中,线程、进程的同步,都可以通过操作系统提供的机制来完成。
比如:比如Synchronized、Lock锁等,这种方式线程锁只在同一JVM中有效果。
但是在分布式系统中,多个进程之间的同步,操作系统层面就无能为力了。
因为:已经跨了操作系统了,这时候就需要像ZooKeeper这样的分布式的协调服务来协助完成同步,这就是分布式锁。
解决方案:
1.每个客户端对某个方法加锁时,在zookeeper上的与该方法对应的指定节点的目录下,生成一个唯一的瞬时有序节点;
2.判断是否获取锁的方式很简单,只需要判断有序节点中序号最小的一个;
3.当释放锁的时候,只需将这个瞬时节点删除即可,同时可以避免服务宕机导致的锁无法释放,而产生的死锁问题。
可以直接使用zookeeper第三方库Curator客户端,这个客户端中封装了一个可重入的锁服务。
集群管理
在分布式的集群中,经常会由于各种原因,比如:硬件故障,软件故障,网络问题。
还经常会出现:有些服务器节点会进进出出,有新的节点加入进来,也有老的节点退出集群。
这个时候,集群中其他机器需要感知到这种变化,然后根据这种变化做出对应的决策,这就是集群管理。
一句话总结:集群管理无在乎两点:
- 是否有机器退出和加入;
- 以及选举master;
对于第一点:所有机器约定在父目录GroupMembers下创建临时目录节点,然后监听父目录节点的子节点变化消息,一旦有机器挂掉,该机器与 zookeeper的连接断开,新机器加入 也是类似。
对于第二点:我们稍微改变一下,所有机器创建临时顺序编号目录节点,每次选取编号最小的机器作为Master就好。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》