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