架构图

Producer:Producer即生产者,消息的产生者,是消息的入口。

kafka cluster
Broker:Broker是kafka实例,每个服务器上有一个或多个kafka的实例,我们姑且认为每个broker对应一台服务器。每个kafka集群内的broker都有一个不重复的编号,如图中的broker-0、broker-1等……

  • Topic:消息的主题,可以理解为消息的分类,kafka的数据就保存在topic。在每个broker上都可以创建多个topic。
  • Partition:Topic的分区,每个topic可以有多个分区,分区的作用是做负载,提高kafka的吞吐量。同一个topic在不同的分区的数据是不重复的,partition的表现形式就是一个一个的文件夹!
  • Replication:每一个分区都有多个副本,副本的作用是做备胎。当主分区(Leader)故障的时候会选择一个备胎(Follower)上位,成为Leader。在kafka中默认副本的最大数量是10个,且副本的数量不能大于Broker的数量,follower和leader绝对是在不同的机器,同一机器对同一个分区也只可能存放一个副本(包括自

Message:每一条发送的消息主体。

Consumer:消费者,即消息的消费方,是消息的出口。

Consumer Group:我们可以将多个消费组组成一个消费者组,在kafka的设计中同一个分区的数据只能被消费者组中的某一个消费者消费。同一个消费者组的消费者可以消费同一个topic的不同分区的数据,这也是为了提高kafka的吞吐量!

Zookeeper:kafka集群依赖zookeeper来保存集群的的元信息,来保证系统的可用性。

Partition的组成

Partition在服务器上的表现形式就是一个一个的文件夹,每个partition的文件夹下面会有多组segment文件,每组segment文件又包含.index文件、.log文件、.timeindex文件(早期版本中没有)三个文件, log文件就实际是存储message的地方,而index和timeindex文件为索引文件,用于检索消息。

如上图,这个partition有三组segment文件,每个log文件的大小是一样的,但是存储的message数量是不一定相等的(每条的message大小不一致)。文件的命名是以该segment最小offset来命名的,如000.index存储offset为0~368795的消息,kafka就是利用分段+索引的方式来解决查找效率的问题。

存储策略

无论消息是否被消费,kafka都会保存所有的消息。那对于旧数据有什么删除策略呢?

  1. 基于时间,默认配置是168小时(7天)。
  2. 基于大小,默认配置是1073741824。

需要注意的是,kafka读取特定消息的时间复杂度是O(1),所以这里删除过期的文件并不会提高kafka的性能!

日志复制

Kafka 允许 topic 的 partition 拥有若干副本,你可以在server端配置partition 的副本数量。当集群中的节点出现故障时,能自动进行故障转移,保证数据的可用性。

创建副本的单位是 topic 的 partition ,正常情况下, 每个分区都有一个 leader 和零或多个 followers 。

所有的读写操作都由 leader 处理,一般 partition 的数量都比 broker 的数量多的多,各分区的 leader 均 匀的分布在brokers 中。所有的 followers 节点都同步 leader 节点的日志,日志中的消息和偏移量都和 leader 中的一致。(当然, 在任何给定时间, leader 节点的日志末尾时可能有几个消息尚未被备份完成)。

Followers 节点就像普通的 consumer 那样从 leader 节点那里拉取消息并保存在自己的日志文件中。Followers 节点可以从 leader 节点那里批量拉取消息日志到自己的日志文件中。

与大多数分布式系统一样,自动处理故障需要精确定义节点 “alive” 的概念。Kafka 判断节点是否存活有两种方式。

  1. 节点必须可以维护和 ZooKeeper 的连接,Zookeeper 通过心跳机制检查每个节点的连接。
  2. 如果节点是个 follower ,它必须能及时的同步 leader 的写操作,并且延时不能太久。

Kafka认为满足这两个条件的节点处于 “in sync” 状态,区别于 “alive” 和 “failed” 。 Leader会追踪所有 “in sync” 的节点。如果有节点挂掉了, 或是写超时, 或是心跳超时, leader 就会把它从同步副本列表中移除。 同步超时和写超时的时间由 replica.lag.time.max.ms 配置确定。

现在, 我们可以更精确地定义, 只有当消息被所有的副本节点加入到日志中时, 才算是提交, 只有提交的消息才会被 consumer 消费, 这样就不用担心一旦 leader 挂掉了消息会丢失。另一方面, producer 也 可以选择是否等待消息被提交,这取决他们的设置在延迟时间和持久性之间的权衡,这个选项是由 producer 使用的 acks 设置控制。 请注意,Topic 可以设置同步备份的最小数量, producer 请求确认消息是否被写入到所有的备份时, 可以用最小同步数量判断。如果 producer 对同步的备份数没有严格的要求,即使同步的备份数量低于 最小同步数量(例如,仅仅只有 leader 同步了数据),消息也会被提交,然后被消费。

ISR机制(一致性)

Kafka 动态维护了一个同步状态的备份的集合 (a set of in-sync replicas), 简称 ISR ,在这个集合中的节点都是和 leader 保持高度一致的,只有这个集合的成员才 有资格被选举为 leader,一条消息必须被这个集合 所有 节点读取并追加到日志中了,这条消息才能视为提交。这个 ISR 集合发生变化会在 ZooKeeper 持久化,正因为如此,这个集合中的任何一个节点都有资格被选为 leader 。这对于 Kafka 使用模型中, 有很多分区和并确保主从关系是很重要的。因为 ISR 模型和 f+1 副本,一个 Kafka topic 冗余 f 个节点故障而不会丢失任何已经提交的消息。

向 Kafka 写数据时,producers 设置 ack 是否提交完成, 0:不等待broker返回确认消息,1: leader保存成功返回或, -1(all): 所有备份都保存成功返回.请注意. 设置 “ack = all” 并不能保证所有的副本都写入了消息。默认情况下,当 acks = all 时,只要 ISR 副本同步完成,就会返回消息已经写入。

性能优化

顺序写磁盘

将写磁盘的过程变为顺序写,可极大提高对磁盘的利用率。Consumer通过offset顺序消费这些数据,且不删除已经消费的数据,从而避免随机写磁盘的过程。
Kafka删除旧数据的方式是删除整个Segment对应的log文件和整个index文件,而不是删除部分内容。

充分利用Page Cache(内核缓存)

相比于维护尽可能多的 in-memory cache,并且在空间不足的时候匆忙将数据 flush 到文件系统,我们把这个过程倒过来。所有数据一开始就被写入到文件系统的持久化日志中,而不用在 cache 空间不足的时候 flush 到磁盘。实际上,这表明数据被转移到了内核的 pagecache 中。

Page Cache的优点:

  1. I/O Scheduler会将连续的小块写组装成大块的物理写从而提高性能。
  2. I/O Scheduler会尝试将一些写操作重新按顺序排好,从而减少磁头移动时间。
  3. 充分利用所有空闲内存(非JVM内存)。
  4. 读操作可以直接在Page Cache内进行。如果消费和生产速度相当,甚至不需要通过物理磁盘交换数据。
  5. 如果进程重启,JVM内的Cache会失效,但Page Cache仍然可用。

零拷贝

Kafka中存在大量网络数据持久化到磁盘(Producer到Broker)和磁盘文件通过网络发送(Broker到Consumer)的过程,这个过程中传统模式下要进行数据的四次拷贝,Kafka通过零拷贝技术(sendfile)提交效率

减少网络开销

在某些情况下,数据传输的瓶颈不是 CPU ,也不是磁盘,而是网络带宽。对于需要通过广域网在数据中心之间发送消息的数据管道尤其如此。当然,用户可以在不需要 Kakfa 支持下一次一个的压缩消息。但是这样会造成非常差的压缩比和消息重复类型的冗余,比如 JSON 中的字段名称或者是或 Web 日志中的用户代理或公共字符串值。高性能的压缩是一次压缩多个消息,而不是压缩单个消息。

Kafka 以高效的批处理格式支持一批消息可以压缩在一起发送到服务器。这批消息将以压缩格式写入,并且在日志中保持压缩,只会在 consumer 消费时解压缩。

Kafka 支持 GZIP,Snappy 和 LZ4 压缩协议

参考

  • kafka中文文档
  • kafka-CAP理论
  • Kafka工作原理

简单分析KafKa工作原理相关推荐

  1. Wireshark抓包分析交换机工作原理

    [实验名称] 交换机工作原理 [实验目的] 1.熟悉Linux虚拟网络环境: 2.熟悉Linux中network namespace的基本操作: 3.熟悉Linux中虚拟以太网设备Tap和veth p ...

  2. 数字营销分析工具Google Analytics(分析)工作原理

    数字营销需要数据分析工具来调整.考核KOL,我在上篇文章"新一代智能Google Analytics助力营销分析"中对Google Analytics新版工具做了使用说明.今天来聊 ...

  3. kafka同一个group 消费两个topic吗_MQ: 一张图读懂kafka工作原理

    1.关于kafka Kafka是由Apache软件基金会开发的一个开源消息队列,由Scala和Java编写. 相关文章参考: MQ: 消息队列常见应用场景及主流消息队列ActiveMQ.RabbitM ...

  4. Kafka工作原理-数据写入、ACK、查询、消费原理

    为什么需要消息队列 周末无聊刷着手机,某宝网APP突然蹦出来一条消息"为了回馈老客户,女朋友买一送一,活动仅限今天!".买一送一还有这种好事,那我可不能错过!忍不住立马点了去.于是 ...

  5. kafka工作原理介绍

    两张图读懂kafka应用: Kafka 中的术语 broker:中间的kafka cluster,存储消息,是由多个server组成的集群. topic:kafka给消息提供的分类方式.broker用 ...

  6. rl滤波器原理_图文分析滤波器工作原理以及电路设计技巧

    常见低通滤波电路 L  一阶滤波 C  一阶滤波 CL  二阶滤波 RC  二阶滤波 LC  二阶滤波 RCR  T型三阶滤波 LCL  T型三阶滤波 CRC π三阶滤波 CLC π三阶滤波 开关电源 ...

  7. 从源码角度分析 Mybatis 工作原理

    作者:vivo互联网服务器团队-Zhang Peng 一.MyBatis 完整示例 这里,我将以一个入门级的示例来演示 MyBatis 是如何工作的. 注:本文后面章节中的原理.源码部分也将基于这个示 ...

  8. Apache kafka 工作原理介绍

    消息队列 消息队列技术是分布式应用间交换信息的一种技术.消息队列可驻留在内存或磁盘上, 队列存储消息直到它们被应用程序读走.通过消息队列,应用程序可独立地执行--它们不需要知道彼此的位置.或在继续执行 ...

  9. 转-Apache kafka 工作原理介绍

    转自: https://developer.ibm.com/zh/articles/os-cn-kafka/ 消息队列 消息队列技术是分布式应用间交换信息的一种技术.消息队列可驻留在内存或磁盘上, 队 ...

最新文章

  1. python查找字符串出现次数_Python 中找出字符串中出现频率最高的字母
  2. java io系列10之 FilterInputStream
  3. Android 拦截WebView请求,并加入或修改参数(GET)
  4. DelayQueue详解
  5. 机器学习入门-文本数据-使用聚类增加文本的标签属性
  6. 在ASP.NET项目中使用CKEditor +CKFinder实现图片上传功能
  7. android 时间应用程序,Android在首次启动时需要更多时间启动应用程序
  8. Centos镜像使用帮助
  9. Swift UIColor 添加从十六进制值初始化的扩展
  10. 问答| 在四轮驱动机器人(SSMR)运动学模型中,左右虚拟轮的线速度vl和vr如何得到?
  11. python打包成exe去cmd_完美起航-python打包exe之打包深度学习模型踩坑记录及其解决办法。...
  12. 佰马科技参加第16届中国道路照明论坛,助力智慧灯杆建设
  13. 【Tableau Desktop 企业日常问题28】Tableau 如何发布到public ?
  14. Android 代码实现shape(GradientDrawable详解)
  15. H5 font标签及其属性
  16. 2021-02-04-scrapy爬虫案例1:爬取博客园新闻版块详情页-基础入门篇
  17. python伪装ip_Python爬虫:使用IP代理池伪装你的IP地址继续爬
  18. 遇到网页无法复制文本怎么办,程序员来教你一键解锁,不需要任何软件和插件
  19. ROM(只读存储器)
  20. win11桌面出现“了解此图片”如何删除

热门文章

  1. 【NOI2013】向量内积【随机化】
  2. Xor HDU - 6899
  3. Infinite Fraction Path UVALive - 8207
  4. 【地狱副本】数据结构之线段树Ⅲ——区间最值/赋值/修改/历史值操作(HDU5306,Tyvj 1518,【清华集训2015】V,HDU6315,HDU1828,POJ3162)
  5. 洛谷P2056:[ZJOI2007]捉迷藏(点分树、STL)
  6. CF1313D:Happy New Year(状压dp)
  7. 不止代码 洛谷P1006 传纸条(dp)
  8. AT4505-[AGC029F]Construction of a tree【构造题,hall定理,网络流】
  9. jzoj3056-数字【数位dp,统计,容斥】
  10. POJ3696-The Luckiest number【数论,欧拉定理】