这篇Kafka笔记真是写的太好了!建议收藏,看完也许你就掌握Kafka了

看完这篇Kafka,你也许就会了Kafka Kafka学习 文章目录Kafka学习1. Kafka简介1.1 Kafka消费模式1.2 Kafka的基础架构1.3 Kafka的安装和使用2. Kafka高级2.1 工作流程2.2 文件存储2.3 生产者分区策略2.4 生产者ISR2.4.1 副本数据同步策略2.4.2 ISR(同步副本集)2.5 生产者ack机制2.6 数据一致性问题2.7 ExactlyOnce3. 消费者分区分配策略3.1 分区分配策略3.2 消费者offset的存储3.3 消费者组案例4. 高效读写&Zookeeper作 阅读详情

推荐阅读:946页“JAVA高级架构必问面试精华”,金九银十社招全拿下

kafka 由 LinkedIn公司推出的一个高吞吐的分布式消息系统,通俗的说就是一个基于发布和订阅的消息队列,官网地址:https://kafka.apache.org/intro

应用场景

  • 异步解构:在上下游没有强依赖的业务关系或针对单次请求不需要立刻处理的业务
  • 系统缓冲:有利于解决服务系统的吞吐量不一致的情况,尤其对处理速度较慢的服务来说起到缓冲作用
  • 消峰作用:对于短时间偶现的极端流量,对后端的服务可以启动保护作用
  • 数据流处理:集成 spark 做实事数据流处理

Kafka 拓扑图(多副本机制)


由上图我们可以发现 Kafka 是分布式,同时对于每一个分区都存在多副本,同时整个集群的管理都通过 zookeeper 管理。

Kafka 核心组件

broker

Kafka 服务器,负责消息存储和转发;一 broker 就代表一个 kafka 节点。一个 broker 可以包含多个 topic

topic

消息类别,Kafka 按照 topic 来分类消息

partition

topic 的分区,一个 topic 可以包含多个 partition,topic 消息保存在各个 partition 上;由于一个 topic 能被分到多个分区上,给 kafka 提供给了并行的处理能力,这也正是 kafka 高吞吐的原因之一。
partition 物理上由多个 segment 文件组成,每个 segment 大小相等,顺序读写(这也是 kafka 比较快的原因之一,不需要随机写)。每个 Segment 数据文件以该段中最小的 offset ,文件扩展名为.log。当查找 offset 的 Message 的时候,通过二分查找快找到 Message 所处于的 Segment 中。

offset

  • 消息在日志中的位置,可以理解是消息在 partition 上的偏移量,也是代表该消息的唯一序号。
  • 同时也是主从之间的需要同步的信息

Producer

生产者,负责向 Kafka Broker 发消息的客户端

Consumer

消息消者,负责消费 Kafka Broker 中的消息

Consumer Group

消费者组,每个 Consumer 必须属于一个 group;(注意的是 一个分区只能由组内一个消费者消费,消费者组之间互不影响。)

Zookeeper

管理 kafka 集群,负责存储了集群 broker、topic、partition 等 meta 数据存储,同时也负责 broker 故障发现,partition leader 选举,负载均衡等功能。

服务治理

既然 Kafka 是分布式的发布/订阅系统,这样如果做的集群之间数据同步和一致性,kafka 是不是肯定不会丢消息呢?以及宕机的时候如果进行 Leader 选举呢?

数据同步

在 Kafka 中的 Partition 有一个 leader 与多个 follower,producer 往某个 Partition 中写入数据是,只会往 leader 中写入数据,然后数据才会被复制进其他的 Replica 中。而每一个 follower 可以理解成一个消费者,定期去 leader 去拉去消息。而只有数据同步了后,kafka 才会给生产者返回一个 ACK 告知消息已经存储落地了。

ISR

在 Kafka 中,为了保证性能,Kafka 不会采用强一致性的方式来同步主从的数据。而是维护了一个:in-sync Replica 的列表,Leader 不需要等待所有 Follower 都完成同步,只要在 ISR 中的 Follower 完成数据同步就可以发送 ack 给生产者即可认为消息同步完成。同时如果发现 ISR 里面某一个 follower 落后太多的话,就会把它剔除。

具体流程如下:




上述的做法并无法保证 kafka 一定不丢消息。虽然 Kafka 通过多副本机制中最大限度保证消息不会丢失,但是如果数据已经写入系统 page cache 中但是还没来得及刷入磁盘,此时突然机器宕机或者掉电,那消息自然而然的就会丢失。

Kafka 故障恢复


Kafka 通过 Zookeeper 连坐集群的管理,所以这里的选举机制采用的是 Zab(zookeeper 使用)。

  • 生产者发生消息给 leader,这个时候 leader 完成数据存储,突然发生故障,没有给 producer 返回 ack;
  • 通过 ZK 选举,其中一个 follower 成为 leader,这个时候 producer 重新请求新的 leader,并存储数据

Kafka 为什么这么快

顺序写磁盘

Kafka 采用了顺序写磁盘,而由于顺序写磁盘相对随机写,减少了寻地址的耗费时间。(在 Kafka 的每一个分区里面消息是有序的

Page Cache

Kafka 在 OS 系统方面使用了 Page Cache 而不是我们平常所用的 Buffer。Page Cache 其实不陌生,也不是什么新鲜事物

我们在 linux 上查看内存的时候,经常可以看到 buff/cache,两者都是用来加速 IO 读写用的,而 cache 是作用于读,也就是说,磁盘的内容可以读到 cache 里面这样,应用程序读磁盘就非常快;而 buff 是作用于写,我们开发写磁盘都是,一般如果写入一个 buff 里面再 flush 就非常快。而 kafka 正是把这两者发挥了极致:

Kafka 虽然是 Java 写的,但它尽量避开了 JVM 的限制,它利用了 Page cache 来存储,这样躲开了数据在 JVM 因为 GC 而发生的 STD。另一方面也是 Page Cache 使得它实现了零拷贝,具体下面会讲。

零拷贝

无论是优秀的 Netty 还是其他优秀的 Java 框架,基本都在零拷贝减少了 CPU 的上下文切换和磁盘的 IO。当然 Kafka 也不例外。零拷贝的概念具体这里不作太详细的复述,大致的给大家讲一下这个概念。

传统的一次应用程请求数据的过程


这里大致可以发传统的方式发生了 4 次拷贝,2 次 DMA 和 2 次 CPU,而 CPU 发生了 4 次的切换。(DMA 简单理解就是,在进行 I/O 设备和内存的数据传输的时候,数据搬运的工作全部交给 DMA 控制器,而 CPU 不再参与任何与数据搬运相关的事情)

零拷贝的方式


通过优化我们可以发现,CPU 只发生了 2 次的上下文切换和 3 次数据拷贝。(linux 系统提供了系统事故调用函数“ sendfile()”,这样系统调用,可以直接把内核缓冲区里的数据拷贝到 socket 缓冲区里,不再拷贝到用户态)

分区分段

我们上面也介绍过了,kafka 采取了分区的模式,而每一个分区又对应到一个物理分段,而查找的时候可以根据二分查找快速定位。这样不仅提供了数据读的查询效率,也提供了并行操作的方式

数据压缩

Kafka 对数据提供了:Gzip 和 Snappy 压缩协议等压缩协议,对消息结构体进行了压缩,一方面减少了带宽,也减少了数据传输的消耗

Kafka 安装

安装 JDK

由于使用压缩包还需要自己配置环境变量,所以这里推荐直接用 yum 安装,熟悉查看目前 Java 的版本:

yum -y list Java*

安装你想要的版本,这里我是 1.8

yum install java-1.8.0-openjdk-devel.x86_64

查看安装是否成功使用查看版本命令,如果有显示版本证明安装没问题

Java -version

安装 Zookeeper

首先需要去官网下载安装包,然后解压

tar -zxvf zookeeper-3.4.9.tar.gz  

要做的就是将这个文件复制一份,并命名为:zoo.cfg,然后在 zoo.cfg 中修改自己的配置即可

cp zoo_sample.cfg zoo.cfg


vim zoo.cfg

配置解释如下

# zookeeper内部的基本单位,单位是毫秒,这个表示一个tickTime为2000毫秒,在zookeeper的其他配置中,都是基于tickTime来做换算的
tickTime=2000


# 集群中的follower服务器(F)与leader服务器(L)之间 初始连接 时能容忍的最多心跳数(tickTime的数量)。
initLimit=10


#syncLimit:集群中的follower服务器(F)与leader服务器(L)之间 请求和应答 之间能容忍的最多心跳数(tickTime的数量)
syncLimit=5
# 数据存放文件夹,zookeeper运行过程中有两个数据需要存储,一个是快照数据(持久化数据)另一个是事务日志
dataDir=/tmp/zookeeper


## 客户端访问端口
clientPort=2181

配置环境变量

vim ~/.bash_profile


export ZK=/usr/local/src/apache-zookeeper-3.7.0-bin
export PATH=$PATH:$ZK/bin
export PATH 


// 启动
zkServer.sh start

下面能看启动成功

// 查看启动状态
zkServer.sh status

安装 Kafka

下载 kafka

https://www.apache.org/dyn/closer.cgi?path=/kafka/2.8.0/kafka-2.8.0-src.tgz

安装 kafka

 tar -xzvf kafka_2.12-2.0.0.tgz 

配置环境变量:

 export ZK=/usr/local/src/apache-zookeeper-3.7.0-bin
 export PATH=$PATH:$ZK/bin
 export KAFKA=/usr/local/src/kafka
 export PATH=$PATH:$KAFKA/bin

启动 Kafka

 nohup kafka-server-start.sh 自己的配置文件路径/server.properties &

最后

最近我整理了整套《JAVA核心知识点总结》,说实话 ,作为一名Java程序员,不论你需不需要面试都应该好好看下这份资料。拿到手总是不亏的~我的不少粉丝也因此拿到腾讯字节快手等公司的Offer

Java进阶群

好了,以上就是本文的全部内容了,如果觉得有收获,记得三连,我们下期再见。

推荐阅:读 946页“JAVA高级架构必问面试精华”,金九银十社招全拿下

超全的Kafka知识点总结(建议收藏!)         前段时间写了Kafka快速入门系列1-8,但苦于知识点非常繁琐,对于很多初级选手来说并不友好,因此博主又根据所学,整理了一份关于Kafka知识点总结,希望对大家的学习有所帮助(✪ω✪)         码字不易,先赞后看! ... 阅读详情

相关推荐

全网最详细的Kafka应用教程【建议收藏】

kafka在设计之初的时候 开发人员们在除了消息中间件以外,还想吧kafka设计为一个能够存储数据的系统,有点像常见的非关系型数据库,比如说NoSql等。除此之外 还希望kafka能支持持续变化,不断增长的数据流, 可以发布 和订阅数据流,还可以对于这些数据进行保存也就是说kafka的本质 是一个数据存储平台,流平台 , 只是他在做消息发布,消息消费的时候我们可以把他当做消息中间件来用。

tangjieqing的博客 1645

kafka基础架构

1)Producer:消息生产者,就是向kafkabroker发消息的客户端; 2)Consumer:消息消费者。向kafka broker取消息的客户端; 3)Consumer Group(CG):消费者组,由多个consumer组成。消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费;消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。 4)Broker:一台kafka服务器就是一个broker。一个集群由多个broker组成...

李白 484

kafka-example:一个简单的Kafka消费者和生产者示例

简单的Kafka消费者-生产者示例 运行项目的步骤 下载Kafka 0.10.0.0二进制文件cd kafka_2.11-0.10.0.0 运行zookeeper和kafka服务器bin/zookeeper-server-start.sh config/zookeeper.properties bin/kafka-server-start.sh config/server.properties 使用kafka cli手动创建主题bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic odd bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor

Kafka - broker使用-topic

broker在kafka的服务端运行,一台服务器相当于一个broker;每个broker下可以有多个topic,每个topic可以有多个partition,在producer端可以对消息进行分区,每个partiton可以有多个副本,可以使得数据不丢失。通常以集群模式,下面来阐述一下broker的几个状况。分区数据与副本kafka的partition有一个leader的数据区域,是为了接收producer端发送的数据;

萌兔兔MMQ!! 1379

如何浏览与下载全球免费的地图高分辨率(亚米级)的遥感影像?

前言 如果你想使用商业卫星的高分辨遥感影像,一般价格昂贵。我们可以使用地图平台上免费的高分辨率数据。目前数据源很多,比如说google earth、天地图、四维地球、必应地图等等。这些影像统一有一个共同点就是:RGB三波段;Web地图瓦片服务。这意味着我们可以通过瓦片服务下载影像,但下载的影像只有三个波段,分别是 一.引言 二、可使用高分辨率的地图数据源 1.Google Earth影像 2.Esri World Image 3.天地图 4.必...

锐多宝的地理空间 2万+

软件工程期末知识点总结【超详细】

生命周期模型(过程模型):瀑布模型、快速原型模型、增量模型、螺旋模型、喷泉模型。2、实体联系图:1、数据对象2、属性3、联系(1:1、1:N、M:N)3、语句覆盖 就是设计足够的调试用例,使得程序中的每个语句至少执行一次。 5、判定覆盖就是设计足够的测试用例,使得程序中每个判定的取“真”分支和取“假”分支至少都执行一次,判定覆盖又称分支覆盖 6、条件覆盖就是设计足够的测试用例,使得程序判定中的每个条件能获得各种可能的结果。7、软件开发时期通常分成4个阶段:总体设计、详细设计、编码和单元测试、综合测试。

这个人好有趣....hh 1万+

线上部署Kafka和ES,为啥JVM堆内存分配越大,性能反而越低?

本文给大家聊一个生产环境的实践经验:线上系统部署的时候,JVM堆内存大小是越大越好吗? 先说一个前提,本文主要讨论Kafka和Elasticsearch两种分布式系统的线上部署情况,不是普通的Java应用系统 1、是否依赖Java系统自身内存处理数据? 先说明一点,不管是我们自己开发的Java应用系统,还是一些中间件系统,在实现的时候都需要选择是否基于自己Java进程的内存...

weixin_38642703的博客 600

添加odbc数据源时的一些问题和解决办法

pl/sql

Mr_Syh的博客 9645

狂神说笔记——Linux快速入门27

为什么要学习Linux?linux诞生了这么多年,以前还喊着如何能取代windows系统,现在这个口号已经小多了,任何事物发展都有其局限性都有其天花板。就如同在国内再搞一个社交软件取代腾讯一样,想想而已基本不可能,因为用户已经习惯于使用微信交流,不是说技术上实现不了解而是老百姓已经习惯了,想让他们不用,即使他们自己不用亲戚朋友还是要用,没有办法的事情。用习惯了windows操作系统,再让大家切换到别的操作系统基本上是不可能的事情,改变一个人已经养成的习惯太难。

杨丙寅 1220

当我们谈论Unidbg时我们在谈什么

文章目录一、前言二、使用Unidbg的工作量是什么三、补环境补的是什么3.1 运行环境缺失3.2 上下文缺失四、Unidbg 不是所有情况下最优的解决方案五、Unidbg在大多数情况下是好的方案六、Unidbg和风控无关七、尾声 一、前言 这是一篇漫谈Unidbg的文章,我对Unidbg的使用和理解都还很浅,日后会更新或修改看法,欢迎大佬指点,也期待同侪讨论。 二、使用Unidbg的工作量是什么 我们常规使用Frida + IDA的动静态分析中,工作可能是这样的 找线索→Frida Hook验证→验证成功继

lilac的博客 5789

后向投影算法(BPA)-SAR成像算法系列(二)

SAR成像算法:后向投影算法(BPA)原理介绍及实现步骤解析。

yjh_2019的博客 1万+

Kafka进阶之Replication(1),狂神说docker进阶笔记

这份文档从构建一个键值数据库的关键架构入手,不仅带你建立起全局观,还帮你迅速抓住核心主线。除此之外,还会具体讲解数据结构、线程模型、网络框架、持久化、主从同步和切片集群等,帮你搞懂底层原理。相信这对于所有层次的Redis使用者都是一份非常完美的教程了。你的支持,我的动力;祝各位前程似锦,offer不断!!!你的支持,我的动力;祝各位前程似锦,offer不断!!!

2401_83946044的博客 824

YOLOv11改进有效系列目录 - 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制 - 针对多尺度、小目标、遮挡、恶劣天气等问题

在一些特定情况下,目标检测任务由于多种因素的影响,变得更加复杂和困难。以下是几类常见的困难目标检测场景:1. 小目标检测定义:小目标检测是指当目标在图像中的占比非常小时,模型需要准确识别和定位这些目标。典型场景包括远程监控、卫星图像分析等。挑战1. 低分辨率:由于目标在图像中占据像素较少,细节缺失,特征提取难度增加。2. 特征不足:小目标缺乏明显的形状和纹理特征,容易被复杂背景淹没。3. 检测难度大:由于小目标与背景之间的对比度较低,误检的几率上升。4. 数据不平衡。

qq_64693987的博客 4万+

这篇Kafka笔记真是写的太好了!不收藏都对不起我的眼睛

虽然我个人也经常自嘲,十年之后要去成为外卖专员,但实际上依靠自身的努力,是能够减少三十五岁之后的焦虑的,毕竟好的架构师并不多。架构师,是我们大部分技术人的职业目标,一名好的架构师来源于机遇(公司)、个人努力(吃得苦、肯钻研)、天分(真的热爱)的三者协作的结果,实践+机遇+努力才能助你成为优秀的架构师。如果你也想成为一名好的架构师,那或许这份Java成长笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

2401_84046677的博客 881

【3GPP核心网】【5G】史上最全的5G协议规范总结

物理层信道定义:TS38.211(物理层信号的生成、调制,DMRS和额外DMRS,PRACH configuration index,Point A等介绍)传输信道和控制信道的数据处理:TS38.212(包括复用,信道编码,交织,DCI,DMRS端口号等)物理层控制过程:TS38.213(同步,上行功控,随机接入,UE上报和接收控制消息的过程,SSB等)物理层测量:TS38.215(UE和网络的测量控制,UE测量能力)频率、频点相关F R1:TS38.101-1。

风云说通信 3178

天龙八部TLBB系列 - 网单用数据库修改为其他门派

专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等) --- 天龙八部修改门派

空名先生 9430

这篇Kafka笔记真是写的太好了吧。

kafka 由 LinkedIn 公司推出的一个高吞吐的分布式消息系统,通俗的说就是一个基于发布和订阅的消息队列,官网地址: https://kafka.apache.org/intro 应用场景 异步解构:在上下游没有强依赖的业务关系或针对单次请求不需要立刻处理的业务 系统缓冲:有利于解决服务系统的吞吐量不一致的情况,尤其对处理速度较慢的服务来说起到缓冲作用 消峰作用:对于短时间偶现的极端流量,对后端的服务可以启动保护作用 数据流处理:集成 spark 做实事数据流处理 Kafk...

m0_49496327的博客 176

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

头条二面Kafka面经总结:搞懂Kafka的这个问题,你离大厂就不远了!!(建议收藏)

有些读者去头条二面,被面试官问了一个关于Kafka的问题:多个Kafka消费者如何同时消费相同Topic下的相同Partition的数据?看似一个简单的问题,竟然把这位读者问懵了!今天,我们一起来分析下这道面试题!

冰河的专栏 5740

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

kafka看完这篇就够了

知识脑图参考链接 1. 基础知识 1.1 三大角色 1.1.1 消息系统 系统解耦、异步通信、削峰填谷;kafka还提供了其他消息中间件难以实现的 消息顺序性保障 及 回溯消费; kafka可以把消息持久化到磁盘;kafka的消息持久化功能和多副本机制,可以使它作为长期的数据存储系统来使用; kafka为各个流式处理框架提供了 可靠的数据来源 和 流式处理类库(窗口、连接、聚合等操作); 1.2 基本术语 Producer 生产者,负责创建消息,将消息投递

qq_44713855的博客 3001

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

看完这篇还不会kafka,我跪榴莲!

图片来自unsplash导读:Kafka 是一个分布式消息队列,具有高性能、持久化、多副本备份、横向扩展能力。生产者往队列里写消息,消费者从队列里取消息进行业务逻辑。一般...

Hadoop技术博文 9122

Kafka最全知识总结(建议收藏)

1、为什么有消息系统 解耦合 异步处理 例如电商平台,秒杀活动。一般流程会分为:1:风险控制、2:库存锁定、3:生成订单、4:短信通知、5:更新数据 通过消息系统将秒杀活动业务拆分开,将不急需处理的业务放在后面慢慢处理;流程改为:1:风险控制、2:库存锁定、3:消息系统、4:生成订单、5:短信通知、6:更新数据 流量的控制 1. 网关在接受到请求后,就把请求放入到消息队列里面 2.后端的服务从消息队列里面获取到请求,完成后续的秒杀处理流程。然后再给用户返回结果。优点:控.

ytp552200ytp的博客 1998

Kafka快速入门系列(15) | Kafka知识点总结(建议收藏!)

  本篇博主带来的是Kafka知识点总结。 目录1.Kafka中的ISR、AR又代表什么?2.Kafka中的HW、LEO等分别代表什么?3.Kafka中是怎么体现消息顺序性的?4.Kafka中的分区器、序列化器、拦截器是否了解?它们之间的处理顺序是什么?5.Kafka生产者客户端的整体结构是什么样子的?使用了几个线程来处理?分别是什么?6.“消费组中的消费者个数如果超过topic的分区,那么就会有...

不温卜火 5876
上一篇: 外包离职,历时学习416天,成功上岸百度,分享成长过程~
下一篇: 校招:JAVA后端面试应该掌握到什么程度?全网Java学习路线最完整,最详细的版本,助你成功拿到满意的offer
普通网友
博客等级 码龄6年 3807粉丝 69原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值