Kafka

本文详细介绍了Apache Kafka,一个基于Zookeeper的消息系统。内容涵盖Kafka的架构,包括broker、producer、consumer、topic和partition,以及Kafka的执行步骤,如启动Zookeeper、创建topic和消费数据。还探讨了Kafka的存储机制,如ISR、segment管理和offset管理,并解释了生产数据和消费数据的分配策略及负载均衡。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
Kafka官网:http://kafka.apache.org/

一、是什么

       Apache Kafka是一个开源的消息系统。由scala写成。是由Apache软件基金会开发的一个开源消息系统项目。
       Kafka最初由LinkedIn开发,并于2011年初开源。2012年10 月从Apache Incubator毕业。该项目的目标是为处理实时数据提供一个统一的高吞吐量低延迟的平台。

二、Kafka架构

Kafka是基于Zookeper的消息系统,将自己的元数据信息存储在Zookeper上。元数据信息包括Kafka的id、端口号等信息。Kafka集群由多个broker组成,每个broker是一个Kafka进程,一般一个机器上一个broker进程。每个broker进程启动后,会向zookeper记录元数据信息(hostname主机名,端口号port),以便生产者消费者使用。
在这里插入图片描述

生产者producer:生产数据,生产数据时,有一个消息分发策略

topic partition replication副本:每个分片都有对应的副本,副本的数量可以通过创建topic时指定。

分区partition:避免数据一个分片存储不了。使用多个分片存储。例如:预计会产生100G数据,但是一个机器最多只能存储50G的数据,就必须要使用两个机器存储。将两个机器叫做两个分片。

消费者consumer:消费数据。连接zookeeper,获取需要消费的信息。

topic:数据的分类,一类信息的汇总。

三、kafka执行步骤:

1.首先启动zookeeper服务:kafka集群是基于zookeeper执行的
          bin/zkServer.sh start
2.启动kafka集群
          ./bin/kafka-server-start.sh ./config/server.properties
3.创建topic:
          bin/kafka-topics.sh --create --topic 主题名 --zookeeper 192.168.187.146:2181 --config --partitions 分区数 --replication-factor 副本数
4.创建生产者
          bin/kafka-topics.sh --describe --zookeeper
192.168.187.146:2181 --topic 主题名

5.创建消费者
          ./bin/kafka-console-consumer.sh --zookeeper 127.0.0.1:2181 --topic 主题名 --from-beginning

四、消息队列的作用:

五、Kafka存储机制:

ISR:选择partition的leader,leader主要用来读和写数据。存放的是活着的,可用的分片,用来同步和保存数据。并且与主机点的数据同步的非常及时。选择leader不是选举机制。是为了避免出现partition存在没有leader可用的,不能及时读写的情况。
每个segment默认大小1G.当存放数据的大小超过1G就会产生新的segment。

partition在形态上是一个目录文件, 在目录下有很多segment,每个segment主要存放着index和log,index存放索引数据,log存放原始数据(生产者生产过来的数据)。
每个分片有多个副本,leader选举算法
1)最开始leader选举:controller角色的broker指定
zookeeper目录树下有个controller,由leader提供读写服务。
2)运行过程中有ISR选举方式

六、生产数据的分配策略:

1)数据分发到一个分片中去。
2)随机发送,nextValue轮询方式自增长
3)自定义规则发送,key的定义决定分发到哪个分区,对key取hascode后对分区数取余,获取到的余数,决定当前key所对应的value到哪个分片。
key.hascode%numPartitions

七、消费数据的offset管理:

offset存放位置:
    0.8版本存放在zookeeper目录下
    0.8+版本存放在kafka的topic中(consumer_topic)

根据offset去拉取数据,避免数据拉取重复。根据offset拉取数据有两种方式。分别是:
1)拉取到数据后立即更新offset,高级Api
2)拉取到数据,等业务逻辑完成后再更新offset,避免出现数据虽然拉取但没有成功存放到数据库,再拉取数据导致数据丢失的的情况。手动同步offset。低级API

八、消费者的负载均衡

数据消费时,遵循负载均衡原则:
      一个partition再同一时间,只能被组Group内的一个consumer消费。但一个consumer可以消费多个partition。当消费者的个数大于partition个数时,会出现闲置的consumer。
在这里插入图片描述
当一个partition中存在多个segment时,判断offset在哪个segment中。通过offset的数值在000000xxxxxx.index中通过范围进行判断。
举例:根据offset查询数据:offset=340000
1)遍历所有的segment,确定每个segment的起始范围(二分查找法)
0-12,12-24,24-36,36-48万
2)读取24-36的segment的index索引文件,通过索引文件 ,知道offset对应的数据在log中的位置。
3)然后根据位置读取log中的数据。
在这里插入图片描述
索引文件稀疏存储,可以大幅度降低index文件元数据占用空间大小。.index文件,log文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值