【Kafka】Kafka介绍、架构和概念

news2024/11/18 3:26:54

目录

  • Kafka介绍
  • Kafka优势
  • Kafka应用场景
  • Kafka基本架构和概念
    • Producer
    • Consumer/Consumer Group
    • Broker
    • ZooKeeper
    • Topic
    • Partition
    • Replicas
    • Offset
    • segment

Kafka介绍

Kafka是是一个优秀的分布式消息中间件,关于常用的消息中间件对比可参考文章:消息中间件概述。

Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多生产者、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。

Kafka主要设计目标如下:

  • 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能。
  • 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输。
  • 支持Kafka Server间的消息分区,及分布式消费,同时保证每个分区内的消息顺序传输。
  • 同时支持离线数据处理和实时数据处理。
  • 支持在线水平扩展

有两种主要的消息传递模式:点对点传递模式、发布-订阅模式。大部分的消息系统选用发布-订阅模式。Kafka就是一种发布-订阅模式。

对于消息中间件,消息分推拉两种模式。Kafka只有消息的拉取,没有推送,可以通过轮询实现消息的推送。

Kafka具有四个核心API:

  1. Producer API:允许应用程序将记录流发布到一个或多个Kafka主题。
  2. Consumer API:允许应用程序订阅一个或多个主题并处理为其生成的记录流。
  3. Streams API:允许应用程序充当流处理器,使用一个或多个主题的输入流,并生成一个或多个输出主题的输出流,从而有效地将输入流转换为输出流。
  4. Connector API:允许构建和运行将Kafka主题连接到现有应用程序或数据系统的可重用生产者或使用者。例如,关系数据库的连接器可能会捕获对表的所有更改。

Kafka优势

  1. 高吞吐量:单机每秒处理几十上百万的消息量。即使存储了许多TB的消息,它也保持稳定的性能。
  2. 高性能:单节点支持上千个客户端,并保证零停机和零数据丢失。
  3. 持久化数据存储:将消息持久化到磁盘。通过将数据持久化到硬盘以及replication防止数据丢失。
  4. 分布式系统,易于向外扩展。所有的Producer、Broker和Consumer都会有多个,均为分布式的。无需停机即可扩展机器。多个Producer、Consumer可能是不同的应用。
  5. 可靠性 - Kafka是分布式,分区,复制和容错的。
  6. 客户端状态维护:消息被处理的状态是在Consumer端维护,而不是由server端维护。当失败时能自动平衡。
  7. 支持online和offline的场景。
  8. 支持多种客户端语言。Kafka支持Java、.NET、PHP、Python等多种语言。

Kafka应用场景

日志收集: 一个公司可以用Kafka可以收集各种服务的Log,通过Kafka以统一接口服务的方式开放给各种Consumer;

消息系统: 解耦生产者和消费者、缓存消息等;

用户活动跟踪: Kafka经常被用来记录Web用户或者App用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到Kafka的Topic中,然后消费者通过订阅这些Topic来做实时的监控分析,亦可保存到数据库;

运营指标: Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告;

流式处理: 比如Spark Streaming和Storm。

Kafka基本架构和概念

kafka的整体架构如下图所示

图片来源:https://mp.weixin.qq.com/s/_g11mmmQse6KrkUE8x4abQ

在这里插入图片描述

从大的组件上看,kafka主要由Producer、Broker、Consumer 以及负责集群管理的 ZooKeeper 组成。除了极大组件,整个消息的流转还涉及到还有几个特别重要的概念—主题(Topic)、分区(Partition)、分段(segment)、位移(offset)。

先来整体了解下基本的架构流程。

  1. Broker创建好后会把集群的元数据存到Zookeeper中,供生产者和消费者读取使用
  2. Producer负责生产消息,获取Broker的元信息,并把消息发送到Broker
  3. Broker可以有不同主题Topic,Topic是一个虚拟的概念
  4. Topic又可以有不同的分区Partition,分区由不同的分段segment组成
  5. 最后消息由Broker根据消息属性路由到了指定的主题的指定分区
  6. 多个消费者Consumer可以组成消费者组Consumer Group,共同消费不同分区的消息
  7. 消费者获取集群的Topic等元数据,并根据消息的偏移量offset来读取消息

下面来具体看下各个组件和概念。

Producer

生产者,负责消息的创建并通过一定的路由策略发送消息到合适的 Broker。broker将该消息追加到当前用于追加数据的 segment 文件中。

一般情况下,一个消息会被发布到一个特定的主题(Topic)上。

  1. 默认情况下通过轮询把消息均衡地分布到主题的所有分区上。
  2. 在某些情况下,生产者会把消息直接写到指定的分区。这通常是通过消息键和分区器来实现的,分区器为键生成一个散列值,并将其映射到指定的分区上。这样可以保证包含同一个键的消息会被写到同一个分区上。
  3. 生产者也可以使用自定义的分区器,根据不同的业务规则将消息映射到分区。

Consumer/Consumer Group

消费者,负责从 Broker 中拉取(Pull)订阅的消息并进行消费,通常多个消费者(Consumer)构成一个分组(Consumer Group),消费者组是为了保证同一个消息只能被一个组里一个消费者消费,同时可以动态扩容。

具有如下特点:

  1. 消费者组订阅一个或多个主题,并按照消息生成的顺序读取它们。
  2. 消费者通过检查消息的偏移量来区分已经读取过的消息。偏移量是另一种元数据,它是一个不断递增的整数值,在创建消息时,Kafka 会把它添加到消息里。在给定的分区里,每个消息的偏移量都是唯一的。消费者把每个分区最后读取的消息偏移量保存在Zookeeper 或Kafka上,如果消费者关闭或重启,它的读取状态不会丢失。
  3. 消费者是消费组的一部分。群组保证每个分区只能被一个消费者使用。
  4. 如果一个消费者失效,消费组里的其他消费者可以接管失效消费者的工作,再平衡,分区重新分配。

在这里插入图片描述

消费者与消费组这种模型可以让整体的消费能力具备横向伸缩性,我们可以增加(或减少) 消费者的个数来提高(或降低)整体的消费能力。对于分区数固定的情况,一味地增加消费者 并不会让消费能力一直得到提升,如果消费者过多,出现了消费者的个数大于分区个数的情况, 就会有消费者分配不到任何分区。

Broker

服务实例,负责消息的持久化、中转等功能。一个独立的Kafka 服务器被就是一个broker。

broker 是集群的组成部分。每个集群都有一个broker 同时充当了集群控制器Controller的角色。在每一个Broker在启动时都会像向ZK注册信息,ZK会选取一个最早注册的Broker作为Controller,后面Controller会与ZK进行数据交互获取元数据(即整个Kafka集群的信息,例如有那些Broker,每个Broker中有那些Partition等信息),并负责管理工作,包括将分区分配给broker 和监控broker,其他Broker是与Controller进行交互进而感知到整个集群的所有信息。

在集群中,一个分区从属于一个broker,该分区被称为分区的首领Leader。一个Topic的不同分区一般是分布在不同的broker中。

在这里插入图片描述

broker 可以为消费者提供服务,对读取分区的请求作出响应,返回已经提交到磁盘上的消息。

ZooKeeper

负责 broker、consumer 集群元数据的管理等;

注意:Producer 端直接连接 broker,不在 zk 上存任何数据,只是通过 ZK 监听 broker 和 topic 等信息

Topic

每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。

Kafka 按 topic 对消息进行分类,我们在收发消息时只需指定 topic。

的Topic是逻辑概念,并没有物理存在,但是注意物理上不同Topic的消息是分开存储的。

主题就好比数据库的表,尤其是分库分表之后的逻辑表。

Partition

分区。为了提升系统的吞吐,一个 topic 下通常有多个 partition,partition 分布在不同的 Broker 上,用于存储 topic 的消息,这使 Kafka 可以在多台机器上处理、存储消息,给 kafka 提供给了并行的消息处理能力和横向扩容能力。另外,为了提升系统的可靠性,partition 通常会分组,且每组有一个主 partition、多个副本 partition,且分布在不同的 broker 上,从而起到容灾的作用。

下面是分区数量和集群数量不同情况时,分区的分布情况:

  1. 如果某topic有N个partition,集群有N个broker,那么每个broker存储该topic的一个partition。
  2. 如果某topic有N个partition,集群有(N+M)个broker,那么其中有N个broker存储该topic的一个partition,剩下的M个broker不存储该topic的partition数据。
  3. 如果某topic有N个partition,集群中broker数目少于N个,那么一个broker存储该topic的一个或多个partition。在实际生产环境中,尽量避免这种情况的发生,这种情况容易导致Kafka集群数据不均衡。

消息以追加的方式写入分区,然后以先入先出的顺序读取。

在这里插入图片描述

Replicas

副本。即分区的副本。上面我们说到为了提升系统的可靠性,partition 通常会分组,且每组有一个主 partition、多个副本 partition,且分布在不同的 broker 上,从而起到容灾的作用。

在这里插入图片描述

图中每个TopicA-x都是一个Partition,其中后面的数字代表了一个分区中的第几个副本,同一个分区的副本需要分布在不同的broker中。

此外,我们说过多个副本Partition中会选取一个作为leader,其他的作为follower。生产者在发送数据的时候,是直接发送到leader partition里面,然后follower partition会去leader那里自行同步数据,消费者消费数据的时候,也是从leader那去消费数据的。

副本处于不同的 broker 中,当 leader 副本出现故障时,从 follower 副本中重新选举新的 leader 副本对外提供服务。Kafka 通过多副本机制实现了故障的自动转移,当 Kafka 集群中某个 broker 失效时仍然能保证服务可用。

关于如何确定副本故障和故障转移的,后面还会详细介绍。

Offset

偏移量。有两个:生产者偏移量(也是消息存储的偏移量)和消费者偏移量。

  1. 生产者Offset

即消息在日志中的位置。消息写入的时候,每一个分区都有一个offset,这个offset就是生产者的offset,同时也是这个分区的最新最大的offset。offset 是消息在分区中的唯一标识,是一个单调递增且不变的值。

在这里插入图片描述

有些时候没有指定某一个分区的offset,这个工作kafka帮我们完成。

Kafka 通过它来保证消息在分区内的顺序性,不过 offset 并不跨越分区,所以,Kafka 保证的是分区有序而不是主题有序。但是在需要严格保证消息的消费顺序的场景下,需要将partition数目设为1。

  1. 消费者Offset

当消费者进行消费的时候,是要去指分区找消息的Offset,从而找到消息进行消费。他与分区的最新消息的Offset是不一样的。他是存储在消费者组中,每个分区都有一个Offset,用于标识,当前消费者组下一个要消费消息的Offset。

在这里插入图片描述

如上图,这是某一个分区的offset情况,生产者写入的offset是最新最大的值是12,而当Consumer A进行消费时,从0开始消费,一直消费到了9,消费者的offset就记录在9,Consumer B就纪录在了11。等下一次他们再来消费时,他们可以选择接着上一次的位置消费,当然也可以选择从头消费,或者跳到最近的记录并从“现在”开始消费。

segment

分段。宏观上看,一个 partition 对应一个日志(Log)。由于生产者生产的消息会不断追加到 log 文件末尾,为防止 log 文件过大导致数据检索效率低下,Kafka 采取了分段和索引机制,将每个 partition 分为多个 segment,同时也便于消息的维护和清理。每个 segment 包含一个.log 日志文件、两个索引(.index、timeindex)文件以及其他可能的文件。每个 Segment 的数据文件以该段中最小的 offset 为文件名,当查找 offset 的 Message 的时候,通过二分查找快找到 Message 所处于的 Segment 中。

参考
https://mp.weixin.qq.com/s/_g11mmmQse6KrkUE8x4abQ
https://mp.weixin.qq.com/s/v6jUK8TIPi1Debfd40GU3w

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1395844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端npm install时node-sass无法下载导致构建失败

如图node-sass出错 解决方案 # linux SASS_BINARY_SITEhttps://npm.taobao.org/mirrors/node-sass/ npm install node-sass # window set SASS_BINARY_SITEhttps://npm.taobao.org/mirrors/node-sass&& npm install node-sass 将node-sass重新设置一下,然…

ELK 分离式日志(1)

目录 一.ELK组件 ElasticSearch: Kiabana: Logstash: 可以添加的其它组件: ELK 的工作原理: 二.部署ELK 节点都设置Java环境: 每台都可以部署 Elasticsearch 软件: 修改elasticsearch主配置文件&…

揭开UI设计的神秘面纱:如何打造一款让用户爱不释手的移动APP

文章目录 一、目标用户分析二、设计风格和色彩搭配三、布局和导航设计四、交互设计五、视觉元素设计六、响应式设计七、测试和优化八、持续更新和迭代九、团队协作和沟通十、学习和成长《移动APP UI设计与制作(微课版)》编辑推荐内容简介目录 《Flutter入门经典(移动…

深入vue响应式原理

当你把一个普通的 JavaScript 对象传入 Vue 实例作为 data 选项,Vue 将遍历此对象所有的 property,并使用 Object.defineProperty 把这些 property 全部转为 getter/setter。 这些 getter/setter 对用户来说是不可见的,但是在内部它们让 Vue …

分享一个基于easyui前端框架开发的后台管理系统模板

这是博主自己在使用的一套easyui前端框架的后台管理系统模版,包含了后端的Java代码,已经实现了菜单控制、权限控制功能,可以直接拿来使用。 springboot mybatis mybatis-plus实现的增删查改完整项目,前端使用了easyui前端框架。…

社交媒体危机管理:Facebook的公共关系之道

社交媒体的崛起为信息传播带来了前所未有的便利,然而,与之相伴而生的是社交媒体危机。作为全球最大的社交媒体平台之一,Facebook曾多次面临各种危机,这时候,危机管理成为了其公共关系的关键一环。本文将深入探讨Facebo…

卷积神经网络和深度神经网络的区别与联系

DNN是指深度神经网络,它是一个很广的概念,某种意义上CNN、RNN、GAN等都属于其范畴之内。DNN与CNN([卷积神经网络)的区别是DNN特指全连接的神经元结构,并不包含卷积单元或是时间上的关联。其中最初的神经网络的所有隐含…

空间计算时代催生新一波巨大算力市场需求

什么是空间计算? 空间计算是一种整合虚拟现实(VR)、增强现实(AR)、混合现实(MR)等技术的计算模式,旨在将数字信息与真实世界融合在一起。这种融合创造了一个全新的计算环境&#xff…

【开源】基于JAVA语言的陕西非物质文化遗产网站

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 设计目标2.2 研究内容2.3 研究方法与过程2.3.1 系统设计2.3.2 查阅文献2.3.3 网站分析2.3.4 网站设计2.3.5 网站实现2.3.6 系统测试与效果分析 三、系统展示四、核心代码4.1 查询民间文学4.2 查询传统音乐4.3 增改传统舞…

canvas绘制不同样式的六角星(示例源代码)

查看专栏目录 canvas实例应用100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

openpose之使用摄像头检测并输出到json文件

编程如画,我是panda! 前言 之前给大家分享了如何搭建openpose环境,并进行了测试案例,但是如果要使用摄像头的话,还需要修改一下运行文件,并且这次会教大家如何输出到json文件 。 如果环境还没有搭建好&am…

k8s之对外服务ingress

一、service 1、service作用 ①集群内部:不断跟踪pod的变化,不断更新endpoint中的pod对象,基于pod的IP地址不断变化的一种服务发现机制(endpoint存储最终对外提供服务的IP地址和端口) ②集群外部:类似负…

简单的推箱子游戏实战

目录 项目分析 地图初始化 背景图片 游戏场景图片: 热键控制 按键设置 确定人物位置 实现人物移动(非箱子,目的地) 推箱子控制 游戏结束 最终代码 合法性判断: 项目分析 墙:0,地板:1,箱子目的地:2,小人:3,箱子:4,箱子命中目标:5 地图初始化 背景图片 #include <…

开发实践6_缓存^中间件

以下学习 朔宁夫 开发工程师 课程。 缓存可提高程序响应速度。数据库缓存(可过期)/ Redis缓存(Key:Value)/ Memcacheed缓存/ 程序层缓存。 一 缓存 1. 数据库缓存 创建缓存数据表 // python manage.py createcachetable cache_table setting // # 缓存配置 CACHES {def…

怎么样的布局是符合可制造性的PCB布局?

满足可制造性、可装配性、可维修性要求&#xff0c;方便调试的时候于检测和返修&#xff0c;能够方便的拆卸器件&#xff1a; 1&#xff09;极性器件的方向不要超过2种&#xff0c;最好都进行统一方向等要求&#xff0c;如图1-1所示&#xff1b; 图1-1 极性器件方向统一摆放 2…

【C语言】ipoib模块 - ipoib_send_rss函数

一、ipoib_send_rss函数定义 int ipoib_send_rss(struct net_device *dev, struct sk_buff *skb,struct ib_ah *address, u32 dqpn) {struct ipoib_dev_priv *priv ipoib_priv(dev);struct ipoib_tx_buf *tx_req;struct ipoib_send_ring *send_ring;u16 queue_index;int hlen…

SQL Povit函数使用及实例

PIVOT函数常用于数据的行转列&#xff0c;同时也可以用此函数实现类似于Excel中的数据透视表的效果。 PIVOT函数 PIVOT 函数的基本语法如下&#xff1a; -- PIVOT 语法 SELECT <非透视的列>,[第一个透视的列] AS <列名称>,[第二个透视的列] AS <列名称>,.…

Oracle 数据库备份与恢复的重要性与最佳实践

文章目录 一、备份的重要性二、备份工具-RMAN四、比较备份策略五、实例恢复六、完全恢复与不完全恢复七、备份与恢复脚本 引言&#xff1a; 在现代信息时代&#xff0c;数据已成为组织和企业最重要的资产之一。保护和恢复数据的能力对于确保业务连续性和减少潜在风险至关重要。…

探索 2024 年新副业:无人饮品机的新风向

随着科技的迅猛发展&#xff0c;无人饮品机作为一种全新的商业模式&#xff0c;正逐渐成为 2024 年副业的新风向。如果你还没有了解过这种全新的副业&#xff0c;那么现在是时候深入了解一下了。 D咖无人饮品机的优势在于其 24 小时不间断的营业模式&#xff0c;它可以在你睡觉…

【成功案例】首日ROI超70%!ROI目标超150%!看 NetMarvel如何助力棋牌游戏出海?

今天无论是线上线下&#xff0c;中国游戏广告在海外市场上屡见不鲜&#xff0c;甚至还会出现包场式营销&#xff0c;“中国人敢花钱”的印象已经深入人心&#xff0c;特别是休闲游戏的爆发给众多众多厂商带来新的增长机遇&#xff0c;大家花钱的态势更猛了。 棋牌类属于休闲体…