《我们一起进大厂》系列-Zookeeper基础

本文涉及的产品
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
函数计算FC,每月15万CU 3个月
简介: 如果大家公司里的消息队列Kafka是2.80版本以下的版本,那说明你们的服务器还在跑着一台提供给Kafka核心功能支持的Zookeeper。当年雅虎工程师在给这个分布式协调服务项目起名时,还发生一段有趣的故事。像如今大名鼎鼎的Hadoop是大象的名字,用于分享大规模数据集的Pig项目是猪,都是某种可爱的动物。时任研究院的首席科学家Raghu Ramakrishnan就跳出来开玩笑:“在这样下去,我们这儿就变成动物园了!于是,大家都起哄起来:那就叫它动物管理员吧。

点赞再看,Java进阶一大半

如果大家公司里的消息队列Kafka是2.80版本以下的版本,那说明你们的服务器还在跑着一台提供Kafka核心功能支持的Zookeeper

当年雅虎工程师在给这个分布式协调服务项目起名时,还发生了一个有趣的故事。像如今大名鼎鼎的Hadoop是大象的名字,用于分析大规模数据集的Pig项目是猪,都是某种可爱的动物。时任研究院的首席科学家Raghu Ramakrishnan就跳出来开玩笑说:“再这样下去,我们这儿就变成动物园了!“。于是,大家都起哄起来:那就叫它动物管理员吧。

在这里插入图片描述

现在ZooKeeper在GitHub已有Star数⭐️12.1k、Fork数7.2k

大家好,我是南哥。

一个Java学习与进阶的领路人,相信对你通关面试进入心心念念的公司有所帮助。

本文收录在我开源的《Java学习进阶指南》中,涵盖了在大厂工作的Javaer都不会不懂的核心知识、面试重点。相信能帮助到大家在Java成长路上不迷茫,南哥希望收到大家的 ⭐ Star ⭐支持我完善下去。GitHub地址:https://github.com/hdgaadd/JavaProGuide

1. ZooKeeper分布式锁

1.1 排他锁实现分布式锁

面试官:知道Zookeeper有什么应用场景吗?

目前地球村里大型公司部署的分布式技术,绝大部分都是由Zookeeper提供底层的技术支持,所以Zookeeper多么重要就不用我多说了吧。

我们可以利用Zookeeper来完成分布式系统涉及的各种核心功能,例如以下4种:

  1. 数据发布/订阅。可以用来实现配置中心。

  2. 命名服务。类似于UUID,可以生成全局唯一的ID。

  3. 集群管理。每一个服务器是一个子节点,可以用来检测到集群中机器的上/下线情况。

  4. 分布式锁。

南哥先讲下我们可以怎么利用Zookeeper来实现分布式锁,要实现分布式锁,分为获取锁和释放锁两个步骤。

ZooKeepr获取锁时会在/exclusive_lock节点下创建子节点,如果创建成功则获得锁。如果创建失败,则访问Zookeeper的客户端会在该节点注册一个Watcher监听,用来实时监控子节点的变更从而重新获得锁,这有点类似于线程的循环等待。

当要释放锁时,Zookeeper会删除该子节点,此时/exclusive_lock节点下就有空位了。Watcher监听则通知客户端可以重新创建子节点来获得锁资源。

在这里插入图片描述

1.2 共享锁实现分布式锁

面试官:你说的是排他锁,共享锁呢?

大家有没发现,上面分布式锁的实现方式是排他锁,我们也可以使用共享锁的实现方式,来看看两者的区别。

排他锁,又称为写锁或独占锁,是一种基本的锁类型。如果事务T1对数据对象O1加上了排他锁,那么在整个加锁期间,只允许事务T1对O1进行读取和更新操作,其他任何事务都不能再对这个数据对象进行任何类型的操作——直到T1释放了排他锁。

共享锁,又称为读锁,同样是一种基本的锁类型。如果事务T1对数据对象O1加上了共享锁,那么当前事务只能对O1进行读取操作,其他事务也只能对这个数据对象加共享锁——直到该数据对象上的所有共享锁都被释放。

Zookeeper以共享锁方式来实现分布式锁,每次读、写请求都会去创建子节点,这是一个类似于“/shared_lock/[Hostname]-请求类型-序号”的临时顺序节点

每一个要获得分布式锁的客户端都会去获取子节点列表,同时注册Watcher监听,读、写这两步有不同的步骤。

(1)获取读锁的话,如果前面比自己小的序号没有写请求,则表示可以读。

(2)获取写锁的话,只有在自己是序号最小的情况下,才可以读成功。

另外共享锁的释放锁和排他锁都是一样的,只需要删除所创建的子节点就可以。

1.3 共享锁羊群效应

面试官:有没听说过共享锁的羊群效应?

大家要注意下,共享锁来实现分布式锁,在集群规模比较大的场景下,可能会出现羊群效应。

什么是羊群效应?我们看看百度百科的解释。

羊群效应是个人的观念或行为由于真实的或想象的群体的影响或压力,而向与多数人相一致的方向变化的现象。

其实共享锁的特别之处,在于每次读、写请求都要注册Watcher监听来获取子节点列表,特别是数量更多的读请求,每1分钟可能是上百万次的请求。

以共享锁来实现,子节点列表只要每次一变动,就要通知所有的服务器客户端。这明显造成了短时间大量的事件通知,给Zookeeper带来的性能消耗是巨大的。

1.4 处理羊群效应

面试官:那怎么解决呢?

如何看待共享锁带来的羊群效应,我们从两个方面来看待。如果在集群不大的情况下羊群效应发生带来的影响不会太大,而且这种设计简单实用

而如果在集群规模大的场景下,我们可以这样改进。客户端的读、写请求首先获取子节点列表,但都不注册Watcher监听

(1)读请求:只向比自己序号小的最后一个写请求节点注册Watcher监听。

(2)写请求:只向比自己序号小的最后一个节点注册Watcher监听。

这样的设计就可以避免羊群效应,主要是从监听子节点列表,改进为只监听某个子节点

2. Kafka应用场景

2.1 Kafka应用场景

面试官:Kafka应用场景呢,知道Kafka是怎么利用Zookeeper吗?

南哥了解到的Kafka利用Zookeeper的主要有 4 点,我们来看看。

(1)使用Zookeeper来对所有Broker服务器、Topic进行管理。Broker启动后都会到Zookeeper上创建属于自己的临时节点,其节点路径为/broker/ids/[0…N],注册Topic节点也是一样。

(2)而在Kafka防止消费重复消费方面,消费者消费消息后,都会在消息分区写入临时节点,代表该消息已消费。

(3)另外在Kafka生产者负载均衡方面,Kafka消息生产者会通过监听Broker节点列表,负载均衡地分发到某一个Broker。

(4)在消费者负载均衡有两方面。一方面,每一个消费者服务器都会在Zookeeper创建消费者节点。当有新消息时,Kafka就可以通过Zookeeper的消费者节点列表负载均衡地通知某个消费者;另一方面,Kafka将一个Topic分成了多个分区,多个分区由不同的Broker处理,这是实现对Broker的负载均衡

戳这,《JavaProGuide》作为一份涵盖Java程序员所需掌握核心知识、面试重点的Java学习进阶指南。

在这里插入图片描述

欢迎关注南哥的公众号:Java进阶指南针,公众号里有南哥珍藏整理的大量优秀pdf书籍!

我是南哥,南就南在Get到你的有趣评论➕点赞➕关注。

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

相关文章
|
Kubernetes Ubuntu 应用服务中间件
在Ubuntu22.04 LTS上搭建Kubernetes集群
在Ubuntu22.04.4上安装Kubernetes v1.28.7,步骤超详细
5526 3
在Ubuntu22.04 LTS上搭建Kubernetes集群
|
Cloud Native Java 编译器
Java生态系统的进化:从JDK 1.0到今天
Java生态系统的进化:从JDK 1.0到今天
|
5月前
|
人工智能 自然语言处理 达摩院
通义大模型:中国AI领域的新里程碑
本文介绍了阿里巴巴达摩院研发的“通义大模型”系列,该模型在2025年已成为AI领域的重要里程碑。通义大模型拥有超大规模参数、多模态融合、高效训练框架和中文优化等技术特点,在智能客服、内容创作、教育和企业服务等多个场景实现应用。未来,它将在多模态能力、小样本学习、安全性及应用场景拓展等方面持续突破,推动中国AI技术进步与行业智能化转型。
1750 18
|
运维 Ubuntu 网络协议
Ubuntu系统下修改网卡IP地址
【7月更文挑战第3天】Ubuntu系统下修改网卡IP地址
1345 1
|
7月前
|
人工智能 自然语言处理 算法
垂直领域大模型必须备案吗?90%企业都搞错的大模型备案真相!
珠宝设计师专用的大模型是否需要备案?本文解析大模型备案与算法备案的区别及法规边界。大模型备案针对公众服务,仅面向专业设计师可暂缓;但算法备案必须完成。涉及深度合成类算法的企业需在30日内备案。合规不仅是义务,更是提升企业竞争力的关键。
|
人工智能 Linux Python
Alibaba Cloud Linux 3.2104 LTS 64位 怎么安装python3.10.12和pip3.10
Alibaba Cloud Linux 3.2104 LTS 64位 怎么安装python3.10.12和pip3.10
1791 1
|
Oracle 关系型数据库 数据库
数据库数据恢复—Oracle数据库文件出现坏块的数据恢复案例
打开oracle数据库报错“system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。 数据库没有备份,无法通过备份去恢复数据库。用户方联系北亚企安数据恢复中心并提供Oracle_Home目录中的所有文件,急需恢复zxfg用户下的数据。 出现“system01.dbf需要更多的恢复来保持一致性”这个报错的原因可能是控制文件损坏、数据文件损坏,数据文件与控制文件的SCN不一致等。数据库恢复工程师对数据库文件进一步检测、分析后,发现sysaux01.dbf文件损坏,有坏块。 修复并启动数据库后仍然有许多查询报错,export和data pump工具使用报错。从数据库层面无法修复数据库。
数据库数据恢复—Oracle数据库文件出现坏块的数据恢复案例
|
10月前
|
传感器 监控 自动驾驶
智能交通系统在现代城市中的应用与挑战####
【10月更文挑战第29天】 本文探讨了智能交通系统在现代城市中的应用现状,分析了其技术架构、核心功能及面临的主要挑战。通过案例分析,阐述了智能交通系统如何有效缓解城市拥堵、提升交通安全与效率。同时,文章也指出了数据安全、隐私保护及技术整合等方面的问题,为未来智能交通系统的优化与发展提供了思路。 ####
407 2
|
11月前
|
JavaScript 前端开发 Java
vertx的学习总结1
本文概述了Vert.x的特点,包括其异步非阻塞的编程模型、多语言支持、响应式编程能力、内置网络支持和模块化设计,并讨论了异步与响应式编程的关系,分布式系统的必要性,以及Vert.x的替代方案。
187 1
|
JavaScript Java 测试技术
基于SpringBoot+Vue的网上订餐系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的网上订餐系统的详细设计和实现(源码+lw+部署文档+讲解等)
214 1