KAFKA入门:原理架构解析

文章目录

  • 一、认识kafka
  • 二、架构介绍
    • 2.1 工作流程
    • 2.2 Kafka可靠性保证
    • 2.3 Kafka存储

一、认识kafka

Kafka到底是个啥?用来干嘛的?

官方定义如下:
Kafka is used for building real-time data pipelines and streaming apps. It is horizontally scalable, fault-tolerant, wicked fast, and runs in production in thousands of companies.
大致的意思就是,这是一个实时数据处理系统,可以横向扩展,并高可靠!

实时数据处理:从名字上看,就是将数据进行实时处理,在现在流行的微服务开发中,最常用实时数据处理平台有 RabbitMQ、RocketMQ 等消息中间件。
这些中间件,最大的特点主要有两个:

  • 服务解耦
  • 流量削峰
    在早期的 web 应用程序开发中,当请求量突然上来了时候,我们会将要处理的数据推送到一个队列通道中,然后另起一个线程来不断轮询拉取队列中的数据,从而加快程序的运行效率。
    在这里插入图片描述
    但是随着请求量不断的增大,并且队列通道的数据一致处于高负载,在这种情况下,应用程序的内存占用率会非常高,稍有不慎,会出现内存不足,造成程序内存溢出,从而导致服务不可用。
    随着业务量的不断扩张,在一个应用程序内,使用这种模式已然无法满足需求,因此之后,就诞生了各种消息中间件,例如 ActiveMQ、RabbitMQ、RocketMQ等中间件。
    采用这种模型,本质就是将要推送的数据,不再存放在当前应用程序的内存中,而是将数据存放到另一个专门负责数据处理的应用程序中,从而实现服务解耦。
    在这里插入图片描述
    消息中间件:主要的职责就是保证能接收到消息,并将消息存储到磁盘,即使其他服务都挂了,数据也不会丢失,同时还可以对数据消费情况做好监控工作。

应用程序:只需要将消息推送到消息中间件,然后启用一个线程来不断从消息中间件中拉取数据,进行消费确认即可!

Kafka 本质其实也是消息中间件的一种,最初为了解决数据管道问题,LinkedIn团队采用了 ActiveMQ 来进行数据交换,在2010年左右,那时ActiveMQ 还远远无法满足 LinkedIn团队 对数据传递系统的要求,经常由于各种缺陷而导致消息阻塞或者服务无法正常访问,为了能够解决这个问题,LinkedIn 决定研发自己的消息传递系统,Kafka 由此诞生。

Kafka特性:

  • 高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consume操作。
  • 可扩展性:集群支持热扩展(kafka-reassign-partitions.sh)分区重分配、迁移
  • 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
  • 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)
  • 高并发:支持数千个客户端同时读写

Kafka使用场景

  • 日志收集:可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、Hbase、Solr等。(ELK+kafka)
  • 消息系统:解耦和生产者和消费者、缓存消息等。
  • 用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和数据挖掘。
  • 运营指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。
  • 流式处理:比如spark streaming和storm(大数据流处理框架,Storm是纯实时处理数据,SparkStreaming是微批处理数据)
  • 事件源 可以使用kafka流来处理事件

二、架构介绍

在这里插入图片描述
角色术语

  • Producer:Producer 即生产者,消息的产生者,是消息的入口
  • Broker:Broker 是 kafka 一个实例,每个服务器上有一个或多个 kafka 的实例,简单的理解就是一台 kafka 服务器,kafka cluster表示集群的意思
  • Topic:消息的主题(类别),可以理解为消息队列,kafka的数据就保存在topic。在每个 broker 上都可以创建多个 topic 。
  • Partition:Topic的分区,每个 topic 可以有多个分区,分区的作用是做负载,提高 kafka 的吞吐量。同一个 topic 在不同的分区的数据是不重复的,partition 的表现形式就是一个一个的文件夹!
  • Replication:每一个分区都有多个副本,副本的作用是做备胎,主分区(Leader)会将数据同步到从分区(Follower)。当主分区(Leader)故障的时候会选择一个备胎(Follower)上位,成为 Leader。在kafka中默认副本的最大数量是10个,且副本的数量不能大于Broker的数量,follower和leader绝对是在不同的机器,同一机器对同一个分区也只可能存放一个副本
  • Message:每一条发送的消息主体。
  • Consumer:消费者,即消息的消费方,是消息的出口。
  • Consumer Group:我们可以将多个消费者组成一个消费者组,在 kafka 的设计中同一个分区的数据只能被消费者组中的某一个消费者消费。同一个消费者组的消费者可以消费同一个topic的不同分区的数据,这也是为了提高kafka的吞吐量!
  • Zookeeper:kafka 集群依赖 zookeeper 来保存集群的的元信息,来保证系统的可用性。

2.1 工作流程

1、发送数据
producer就是生产者,是数据的入口。Producer在写入数据的时候永远的找leader,不会直接将数据写入follower!那leader怎么找呢?写入的流程又是什么样的呢?
我们看下图:
在这里插入图片描述
需要注意的一点是,消息写入leader后,follower是主动的去leader进行同步的!producer采用push模式将数据发布到broker,每条消息追加到分区中,顺序写入磁盘,所以保证同一分区内的数据是有序的!写入示意图如下:
在这里插入图片描述
分区的主要目的是:
  1、 方便扩展。因为一个topic可以有多个partition,所以我们可以通过扩展机器去轻松的应对日益增长的数据量。
  2、 提高并发。以partition为读写单位,可以多个消费者同时消费数据,提高了消息的处理效率。
发送模式

  • Kafka提供了发送消息三种模式:(producer.type)
    (oneway、sync、async)
    • 第一种是发送出去就算成功,这种情况当然不能保证消息成功投递到broker;
    • 第二种是Master-Slave(L-F)模型,只有当Master和所有Slave都接收到消息时,才算投递成功,这种模型提供了最高的投递可靠性,但是损伤了性能;
      在这里插入图片描述
    • 第三种模型,即只要Master确认收到消息就算投递成功;实际使用时,根据应用特性选择,绝大多数情况下都会中和可靠性和性能选择第三种模型

生产者配置

KafkaProducer中必填:
bootstrap.servers: 指定生产者客户端连接kafka集群所需的broker地址列表,格式为host1:port1,host2:port2,可以设置一个或多个。这里并非需要所有的broker地址,因为生产者会从给定的broker里寻找其它的broker。

非必填参数:

  1. client.id:这个参数用来设定kafkaProducer对应的客户端id,默认值为“”,如果不设置,会自动生成一个非空字符串,内容形式如:“producer-1”,“producer-2”…
  2. retries:配置生产者重试次数,对于可重试异常,那么只要在规定的次数内自行恢复了,就不会抛出异常,默认是0。
  3. retry.backoff.ms用来设定两次重试之间的时间间隔,默认值100。
  4. partitioner.class:显示配置使用哪个分区器。
  5. interceptor.classes:指定自定义拦截器,多个传List集合。
  6. buffer.memory:生产者客户端RecordAccumulator缓存大小,默认值为33554432B,即32M。
  7. batch.size:ProducerBatch可以复用内存区域的大小

2、消费数据
消息存储在log文件后,消费者就可以进行消费了。与生产消息相同的是,消费者在拉取消息的时候也是找leader去拉取。
  多个消费者可以组成一个消费者组(consumer group),每个消费者组都有一个组id!同一个消费组者的消费者可以消费同一topic下不同分区的数据,但是不会组内多个消费者消费同一分区的数据!!!是不是有点绕。我们看下图:
在这里插入图片描述
图示是消费者组内的消费者小于partition数量的情况,所以会出现某个消费者消费多个partition数据的情况,消费的速度也就不及只处理一个partition的消费者的处理速度!如果是消费者组的消费者多于partition的数量,那会不会出现多个消费者消费同一个partition的数据呢?上面已经提到过不会出现这种情况!多出来的消费者不消费任何partition的数据。所以在实际的应用中,建议消费者组的consumer的数量与partition的数量一致!
如果producer的流量增大,当前的topic的parition数量=consumer数量,这时候的应对方式就是横向扩展:增加topic下的partition,同时增加这个consumer group下的consumer。
ConsumerRebalance (重平衡)
本质上是一种协议,规定了一个 Consumer Group 下的所有 consumer 如何达成一致,来分配订阅 Topic 的每个分区。
例如:某 Group 下有 20 个 consumer 实例,它订阅了一个具有 100 个 partition 的 Topic 。正常情况下,kafka 会为每个 Consumer 平均的分配 5 个分区。这个分配的过程就是 Rebalance。

Rebalance 的触发条件有3个:

  • 组成员个数发生变化。例如有新的 consumer 加入或者离开组。
  • 订阅的 Topic 个数发生变化。
  • 订阅 Topic 的分区数发生变化。
    消费者配置
    KafkaConsumer中必填的:
    zookeeper.connect:zookeeper连接服务器地址 (集群可写多个)
    group.id 在使用kafka consumer IPA 的时候,group.id对应点值就是组,这个组是我们自己随便起的,当这个程序启动,这个名字就是组了,其他consumer的group.id也写这个名字,说明这些consumer是同一个组的。

非必选参数

  1. zookeeper.session.timeout.ms=5000 zookeeper的session的过期时间
  2. zookeeper.connectiontimeout.ms=10000 连接到zk超时时间
  3. zookeeper.sync.time.ms=2000 指定多久消费者更新offset到zookeeper中
  4. auto.commit.enable=true 自动向zookeeper提交offset信息
  5. auto.commit.interval.ms=1000 自动更新时间
  6. consumer.id=xxx 当前consumer的标识

2.2 Kafka可靠性保证

  • Kakfa Broker Leader的选举:Kakfa Broker集群受Zookeeper管理。所有的Kafka Broker节点一起去Zookeeper上注册一个临时节点,因为只有一个Kafka Broker会注册成功,其他的都会失败,所以这个成功在Zookeeper上注册临时节点的这个Kafka Broker会成为Kafka Broker Controller,其他的Kafka broker叫Kafka Broker follower。(这个过程叫Controller在ZooKeeper注册Watch)。例如:一旦有一个broker宕机了,这个kafka broker controller会读取该宕机broker上所有的partition在zookeeper上的状态,并选取ISR列表中的一个replica作为partition leader(如果ISR列表中的replica全挂,选一个幸存的replica作为leader; 如果该partition的所有的replica都宕机了,则将新的leader设置为-1,等待恢复,等待ISR中的任一个Replica“活”过来,并且选它作为Leader;或选择第一个“活”过来的Replica(不一定是ISR中的)作为Leader),这个broker宕机的事情,kafka controller也会通知zookeeper,zookeeper就会通知其他的kafka broker。
  • ISR kafka的ISR机制被称为“不丢消息”机制,涉及到的是kafka的同步,kafka不是完全同步,也不是完全异步。
    首先我们知道kafka 的数据是多副本的。
    每个follower 的数据都是同步leader的,是follower 主动拉取leader 的数据
    Replica的个数小于等于Broker的个数,也就是说,对于每个Partition而言,每个Broker上最多只会有一个Replica,因此可以使用Broker id 指定Partition的Replica

注意:follewer 只是数据的副本提供数据的可恢复性,本身和kafka 的读写性能无关(kafka的读写都是和leader 相关)
isr 的全称是:In-Sync Replicas isr 是一个副本的列表,里面存储的都是能跟leader 数据一致的副本,确定一个副本在isr列表中,有2个判断条件

  • 根据副本和leader 的交互时间差,如果大于某个时间差 就认定这个副本不行了,就把此副本从isr 中剔除,此时间差根据
    配置参数rerplica.lag.time.max.ms=10000 也就是默认10s,isr中的follow没有向isr发送心跳包就会被移除
  • 根据leader 和副本的信息条数差值决定是否从isr 中剔除此副本,此信息条数差值根据配置参数
    rerplica.lag.max.messages=4000 决定 ,也就是默认消息差大于4000会被移除

注意:在Kafka0.9版本之后,ISR移除了数据条数这一条件,只保留了超时时间这一条件,如果producor一次性发来了10000条数据,而默认条数差立马会大于4000 立马触发ISR

  • partition ack说明
    • ack=1,表示producer写partition leader成功后,broker就返回成功,无论其他的partition follower是否写成功。
    • ack=-1[parition的数量]的时候,表示只有producer全部写成功的时候,才算成功,kafka broker才返回成功信息。这里需要注意的是,如果ack=1的时候,一旦有个broker宕机导致partition的follower和leader切换,会导致丢数据。
    • ack=2,表示producer写partition leader和其他一个follower成功的时候,broker就返回成功,无论其他的partition follower是否写成功。
    • At most once:消息可能会丢,但绝不会重复传输。
      At least once:消息绝不会丢,但可能会重复传输。
      Exactly once:每条消息肯定会被传输一次且仅传输一次。
      kafka最多保证At least once,可以保证不丢,但是可能会重复,为了解决重复需要引入唯一标识和去重机制,kafka提供了GUID实现了唯一标识,但是并没有提供自带的去重机制。

2.3 Kafka存储

kafka通过topic来分主题存放数据,主题内有分区,分区可以有多个副本,分区的内部还细分为若干个segment。
所谓的分区其实就是在kafka对应存储目录下创建的文件夹,文件夹的名字是主题名加上分区编号,编号从0开始。

1、segment
所谓的segment其实就是在分区对应的文件夹下产生的文件。
一个分区会被划分成大小相等的若干segment,这样一方面保证了分区的数据被划分到多个文件中保证不会产生体积过大的文件;另一方面可以基于这些segment文件进行历史数据的删除,提高效率。
一个segment又由一个.log和一个.index文件组成。

  • .log
    .log文件为数据文件用来存放数据分段数据。
  • .index
    .index为索引文件保存对对应的.log文件的索引信息。
    在.index文件中,保存了对对应.log文件的索引信息,通过查找.index文件可以获知每个存储在当前segment中的offset在.log文件中的开始位置,而每条日志有其固定格式,保存了包括offset编号、日志长度、key的长度等相关信息,通过这个固定格式中的数据可以确定出当前offset的结束位置,从而对数据进行读取。
  • 命名规则
    这两个文件的命名规则为:
    partition全局的第一个segment从0开始,后续每个segment文件名为上一个segment文件最后一条消息的offset值,数值大小为64位,20位数字字符长度,没有数字用0填充。

2、读取数据
开始读取指定分区中某个offset对应的数据时,先根据offset和当前分区的所有segment的名称做比较,确定出数据在哪个segment中,再查找该segment的索引文件,确定当前offset在数据文件中的开始位置,最后从该位置开始读取数据文件,在根据数据格式判断结果,获取完整数据。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习——损失函数汇总

1. 连续值损失函数 总结:主要使用胡贝儿损失函数,应用于连续数值的预测之间的误差损失,参考地址 import torch import torch.nn as nna = torch.tensor([[1, 2], [3, 4]], dtype=torch.float) b = torch.tensor([[3, 5], [8, 6]], dtype=torch.float)loss_fn1 = torch.nn.M…

2025.01.01(IO模型分类,超时检测,抓包分析,机械臂客户端)

作业&#xff1a;基于机械臂服务器写出客户端代码并执行 #include <myhead.h> #define IP "192.168.124.62" #define PORT 8888int main(int argc, const char *argv[]) {//1.创建套接字int cfd socket(AF_INET,SOCK_STREAM,0);if(cfd-1){perror("socke…

Pandas-数据透视表

文章目录 一. Pandas透视表概述1. pivot_table函数介绍 二. 栗子-零售会员数据分析1. 案例业务介绍2. 会员存量、增量分析① group by② 透视表③ 可视化 一. Pandas透视表概述 数据透视表&#xff08;Pivot Table&#xff09;是一种交互式的表&#xff0c;可以进行某些计算&am…

STM32-笔记26-WWDG窗口看门狗

一、简介 窗口看门狗用于监测单片机程序运行时效是否精准&#xff0c;主要检测软件异常&#xff0c;一般用于需要精准检测程序运行时间的场合。 窗口看门狗的本质是一个能产生系统复位信号和提前唤醒中断的6位计数器&#xff08;有的地方说7位。其实都无所谓&#xff0…

【超好用远程工具】跨平台SSH工具WindTerm免费开源

WindTerm WindTerm概述免费开源、免费开源、免费开源下载、安装屏幕截图主窗口 &#xff08;zsh&#xff09;&#xff1a;拆分视图&#xff1a;DigeWhite 主题&#xff1a; 基本设置连接到服务器SSH 连接Telnet 连接串口连接SFTP 连接使用多标签页 高级功能脚本和自动化会话管理…

开源存储详解-分布式存储与ceph

ceph体系结构 rados&#xff1a;reliable, autonomous, distributed object storage, rados rados采用c开发 对象存储 ceph严格意义讲只提供对象存储能力&#xff0c;ceph的块存储能力实际是基于对象存储库librados的rbd 对象存储特点 对象存储采用put/get/delete&#xf…

Postman[2] 入门——界面介绍

可参考官方 文档 Postman 导航 | Postman 官方帮助文档中文版Postman 拥有各种工具、视图和控件&#xff0c;帮助你管理 API 项目。本指南是对 Postman 主要界面区域的高级概述&#xff1a;https://postman.xiniushu.com/docs/getting-started/navigating-postman 1. Header&a…

牛客网最新1129道 Java 面试题及答案整理

前言 面试&#xff0c;跳槽&#xff0c;每天都在发生&#xff0c;而对程序员来说"金三银四"更是面试和跳槽的高峰期&#xff0c;跳槽&#xff0c;更是很常见的&#xff0c;对于每个人来说&#xff0c;跳槽的意义也各不相同&#xff0c;可能是一个人更向往一个更大的…

项目总结-ElasticSearch性能优化考虑点

项目总结-ElasticSearch性能优化考虑点 一、概述二、硬件层面优化2.1 ES硬件层面-内存优化2.2 ES硬件层面-磁盘优化2.3 ES硬件层面-CPU优化2.4 ES硬件层面-网络优化 三、系统层面优化3.1 ES系统层面-文件句柄数优化3.2 ES系统层面-swap优化 四、JVM层面优化4.1 JVM层面-JVM堆大…

Paperlib(论文管理工具)

Paperlib 是一个简单好用的论文管理工具。软件接入各学科数据库用于匹配论文元数据&#xff0c;逐步为每一个学科&#xff08;例如计算机科学&#xff0c;物理学等&#xff09;定制化数据库组合提高检索精度。尤其是精准的会议论文元数据检索能力。还可以管理你的论文&#xff…

静态时序分析:线负载模型的选择机制

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html 线负载模型及其选择 线负载模型仅在Design Compiler线负载模式&#xff08;非拓扑模式&#xff09;下时使用&#xff0c;它估算了导线长度和扇出对网线的电阻、电容和面积的影响&#xff…

深入探索Java中的List集合

一、ArrayList集合 1.ArrayList集合的特点 2.ArrayList集合的一些方法 ①.add(Object element) 向列表的尾部添加指定的元素。 ②.size() 返回列表中的元素个数。 ③.get(int index) 返回列表中指定位置的元素&#xff0c;index从0开始。 ④.add(int index, Object elemen…

Spark生态圈

Spark 主要用于替代Hadoop中的 MapReduce 计算模型。存储依然可以使用 HDFS&#xff0c;但是中间结果可以存放在内存中&#xff1b;调度可以使用 Spark 内置的&#xff0c;也可以使用更成熟的调度系统 YARN 等。 Spark有完善的生态圈&#xff1a; Spark Core&#xff1a;实现了…

DMDRS部署:搭建DM8-DM8数据同步

一、部署要求 1.1 硬件要求 DMDRS服务描述源DMDRS 内存要求至少2GB的内存空间。推荐配置4GB及以上的内存空间。 源DMDRS对内存空间的需求主要与装载的并发数相关。当内存空间配置低于2GB时&#xff0c;可以调整装载的线程数来降低源DMDRS对内存空间的需求。 磁盘要求至少10GB…

Flutter:打包apk,详细图文介绍

困扰了一天&#xff0c;终于能正常打包apk安装了&#xff0c;记录下打包的流程。建议参考我这篇文章时&#xff0c;同时看下官网的构建说明。 官网构建并发布 Android 应用详情 1、AS创建Flutter项目 2、cmd执行命令 生成一个sunluyi.jks的文件&#xff0c;可以自行把sunluyi替…

【电源专题】LDO关键DC参数——效率

在讲到电源的效率方面,很多时候网上最经常看到的是“LDO的效率低,开关电源效率高,所以LDO需要更大的散热器来帮助耗散热能”。 比如如下所示为网上找到的一些总结,一般也是大家所熟知的: 是的,这描述在一定的使用条件下是正确对的,但并不完全对,因为不同的工作…

互联网直播点播平台EasyDSS无人机视频推拉流技术实现工地远程监控巡检直播

在建筑行业&#xff0c;施工现场的安全管理和实时监控一直是项目管理中的重点。随着技术的进步&#xff0c;无人机工地直播技术成为了一种新兴的解决方案&#xff0c;它不仅能够提高施工透明度&#xff0c;还能够加强现场安全管理。EasyDSS作为一种先进的流媒体技术平台&#x…

9.若依-自定义表单构建

表单构建工具&#xff0c;开发者通过图形界面和拖拽等操作&#xff0c;可以快速构建复杂的表单。 需求&#xff1a;做一些复杂的功能提交&#xff0c;涉及到多张标的数据提交。 自定义一个特殊表单页面 1.拖拉一个布局组件中行容器&#xff0c;然后在组件属性中设置表单删格在…

芊芊测字,免费测字,ai测字(1.0)

纯娱乐 芊芊测字网站&#xff1a;芊芊测字-ai免费测字

【Leecode】Leecode刷题之路第98天之验证二叉搜索树

题目出处 98-验证二叉搜索树-题目出处 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 98-验证二叉搜索树-官方解法 方法1&#xff1a;递归 思路&#xff1a; 代码示例&#xff1a;&#xff08;J…