详细的Kafka介绍

kafka是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),本文作为我学习kafka的一个整理记录,希望能帮想要学习kafka的同学了解kafka

顺便推荐我的微信公众号:龙叔18岁

 

1·kafka整体数据流图

 

2·概念介绍

 

3·Broker

Kafka通过zookeeper来指定一台Kafka brokercontroller

3.1·controller选举流程

3.2·controller选举触发条件

4·Topic

4.1·创建

创建topic的时候有两个参数很重要,partionsreplication-factor

创建命令:./bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test1

partitions

        指定topic有几partition

replication-factor

        topic的副本数。每个主题可以有多个副本,副本位于集群中不同的broker上,也就是说副本的数量不能超过broker的数量,否则创建主题时会失败。

例如:2broker ,创建topic的参数为 --replication-factor 2 --partitions 3,创建的toipc分区如下:有0,1,2三个分区,每个分区有2个副本

5·partition

5.1·副本replica

每个partion(分区)下面都有多个副本,副本分为leader和follower

leader接受生产者写消息,接受消费者读消息

follower不参与读写,只从leader同步数据(主动拉去leader的数据),作为备份,和kafka的读写性能无关

如果分区下面的leader异常了,从Zookeeper中读取当前分区的所有ISR(in-sync replicas)集合, kafka通过controller选出新leader

 

5.2·offset(偏移量)

每个partition不同Consumer(非同Consumer  group)消费,每个Consumer都会有自己的offset,新的Consumer订阅topic,消费一个partition时,都是从最开始的消息消费的,让然Consumer也可以调整offset去从某个点开始消费消息

  offset概念主要有以下几个:

Last Committed Offsetconsumer group 最新一次 commit offset,表示这个 group 已经把 Last Committed Offset 之前的数据都消费成功了。
Current Positionconsumer group 当前消费数据的 offset,也就是说Last Committed Offset Current Position 之间的数据已经拉取成功,可能正在处理,但是还未 commit
Log End Offset(LEO):记录底层日志 (log) 中的下一条消息的 offset, producer 来说,就是即将插入下一条消息的 offset
High Watermark(HW):已经成功备份到其他 replicas 中的最新一条数据的 offset,也就是说 Log End Offset High Watermark 之间的数据已经写入到该 partition leader 中,但是还未完全备份到其他的 replicas consumer 是无法消费这部分消息 (未提交消息)

6·关键知识点

6.1·isr

每个partition(分区)都有一个leader,多个follower。(都是数据的副本)

leader会维持一个与其保持同步的replica集合,该集合就是ISR,每一个partition都有一个ISR,它是有leader动态维护。

副本是有可能被踢出isr列表的,如:

·【1】长时间未向leader同步数据,则被踢出isr,该时间阈值replica.lag.time.max.ms参数设定,单位ms

·【2】leader的信息条数差值大于阈值,则被踢isr,阈值根据配置参数rerplica.lag.max.messages决定,单位条。

6.2·ack机制

生产者发出消息到达分区leader之后, Leader将消息写入本地Log。Follower则从Leader pull数据。Follower在收到该消息向Leader发送ACK。一旦Leader收到了ISR中所有Replica的ACK,该消息就被认为已经commit了,Leader将增加HW并且向Producer发送ACK。   leader要确保有follower同步完成,才能发送ack,这样才能保证leader挂掉之后,能在follower中选出可靠的新leader(注:生产者发送的消息只有在确认发送成功后 才能被消费者消费

至于多少个follower完成同步,就可以发送ackkafka提供了三种可靠性级别的选择,由request.required.acks参数控制,参数可选值如下:

0:生产者只管发送,不管服务器,消费者是否收到信息

1:只有leader 确认了收到消息,才确认此消息发送成功

-1只有isr n-1个副本leader 除外所以n-1)都同步了消息 此消息才确认发送成功

 

另外一个参数min.insync.replicas也很重要只有request.required.acks参数为-1是,才会生效

min.insync.replicas=n 配置参数表示 当满足n个副本的消息确认n默认1,最好大于1因为leader isr 列表中),才认为这条消息是发送成功的。

ISR中的副本数少于min.insync.replicas配置的数量时,客户端会返回异常:

org.apache.kafka.common.errors.NotEnoughReplicasExceptoin: Messages are rejected since there are fewer in-sync replicas than required

ack机制也保证了数据可靠性和数据持久性

request.required.acks=-1的情况下replication.factor>=2min.insync.replicas>=2的情况下,不会丢失数据

 

推荐公众号:龙叔18岁

 

<think>好的,用户需要了解Kafka详细技术架构和工作原理。根据用户提供的引用内容,我需要整理出Kafka的核心组件、工作原理以及相关机制。首先,Kafka的主要组件包括Producer、Broker、Consumer、Topic和Partition。每个部分的作用需要解释清楚,比如Producer负责发布消息,Broker作为消息代理存储消息等。接下来是工作原理,需要描述消息如何从Producer到Broker,再被Consumer订阅消费的过程。要提到发布-订阅模式,以及分区和副本机制的重要性,比如如何实现高吞吐和高可用。还要涉及Offset管理,说明消费者如何追踪消息位置。此外,用户可能关心Kafka的高性能设计,比如顺序读写、零拷贝技术,这些内容需要包含进去。用户提供的引用中提到了分布式架构、可靠性机制,以及应用场景如实时流处理,这些也要整合到回答中。最后,根据引用中的信息,确保使用正确的术语,比如Partition的分区策略、副本的Leader-Follower机制。需要检查是否有遗漏的重要点,比如ZooKeeper的作用,但在引用中没有提到,可能用户提供的资料有限,所以暂时不深入。同时,生成的相关问题要围绕架构、性能优化、应用场景等,帮助用户进一步学习。确保回答结构清晰,分点说明,符合用户要求的详细技术介绍。</think>### Kafka架构工作原理详解 #### 一、核心架构组件 1. **Producer(生产者)** 负责将消息发布到指定主题(Topic),支持异步/同步发送模式,可自定义分区策略(如轮询、哈希等)[^2]。 2. **Broker(消息代理)** 组成Kafka集群的节点,负责消息存储、转发和管理。每个Broker可处理多个主题分区(Partition),通过副本机制实现容灾[^1][^2]。 3. **Consumer(消费者)** 以消费者组(Consumer Group)形式订阅主题,每个分区仅能被组内一个消费者消费。Offset记录消费进度,支持手动/自动提交[^5]。 4. **Topic(主题)** 逻辑上的消息类别,分为多个分区(Partition)以实现并行处理。例如,主题`logs`可划分为10个分区,提升吞吐量[^3]。 5. **Partition(分区)** 每个分区是**有序、不可变**的消息队列,数据以追加方式写入。分区在物理上对应多个副本(Replica),包含一个Leader和多个Follower,Leader处理读写请求,Follower同步数据[^5]。 #### 二、工作原理 1. **消息发布流程** - Producer根据分区策略(如`key.hashCode() % partitions`)将消息发送到特定分区。 - Broker将消息持久化到磁盘(顺序写入,性能高),同时复制到其他副本[^3][^5]。 2. **消息消费流程** - Consumer通过订阅Topic加入消费者组,由Broker协调分配分区。 - 消费者从分区Leader拉取消息,并更新Offset(存储于内部主题`__consumer_offsets`)[^2][^4]。 3. **高可用机制** - **副本同步**:Follower定期从Leader拉取数据,若Leader故障,Controller(通过ZooKeeper选举)重新选举新Leader[^2][^5]。 - **ISR集合**:仅处于In-Sync状态的副本可参Leader选举,确保数据一致性。 #### 三、关键技术特性 1. **高性能设计** - 顺序磁盘I/O:通过追加写入和分段(Segment)存储优化磁盘访问[^3]。 - 零拷贝(Zero-Copy):使用`sendfile`系统调用减少内核态用户态数据拷贝[^5]。 2. **水平扩展** 通过增加Broker和分区数量,可线性提升吞吐量。例如,将主题分区从3扩展到6,并行处理能力翻倍。 3. **持久化保留策略** 消息默认保留7天(可配置),支持基于时间或大小的清理策略。例如: ```properties log.retention.hours=168 # 7天 log.retention.bytes=1073741824 # 1GB ``` #### 四、典型应用场景 1. **日志聚合**:集中收集分布式系统日志(如ELK结合Kafka)[^2]。 2. **实时流处理**:作为数据管道连接Spark/Flink进行实时分析[^1]。 3. **事件溯源**:存储应用状态变化事件,支持回放审计。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙叔运维

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值