kafka基础入门_CodingPark编程公园

本文是Kafka的基础入门,涵盖了消息队列对比、Kafka的概念和特性,以及Kafka的总体结构、配置、生产者、Brokers和消费者的详细讲解。Kafka作为高吞吐量的分布式消息系统,具有消息持久化、高吞吐量和分区等特性,常用于日志收集、实时数据处理等场景。
摘要由CSDN通过智能技术生成

文章介绍

本文是kafka基础入门篇,讲解内容包括:

1. 消息队列对比表
2. Kafka概念及特性
3. kafka总体结构
4. kafka各项配置
5. 生产者
6. kafka Brokers
7. 消费者

1. 消息队列对比表

消息队列可以简单理解为:把要传输的数据放在队列中

  • 把数据放到消息队列叫做生产者
  • 从消息队列里边取数据叫做消费者

消息队列来做:

  1. 解耦
  2. 异步
  3. 削峰

当前使用较多的消息队列有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等。
而部分数据库如Redis、Mysql以及phxsql也可实现消息队列的功能。
在这里插入图片描述

2. Kafka概念及特性

什么是Kafka?
kafka是由Apache软件基金会发布的一个开源流处理平台,由Scala和Java编写。它是一种高吞吐量的分布式发布的订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。对于像Hadoop一样的日志数据和离线分析系统,但又要求实时处理的限制 ,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。
比较直观的解释就是其有一个生产者(producer)和一个消费者(consumer)。可以将kafka想象成一个数据容器,生产者负责发送数据到这个容器中,而消费者从容器中取出数据,在将数据做处理,如存储到hdfs。
在这里插入图片描述
Kafka的特性
kafka是一种高吞吐量的分布式发布订阅消息系统,具有以下特性:
1)通过磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能;
2)持久性:使用文件性存储,日志文件存储消息,需要写入硬盘,采用达到一定阈值才写入硬盘,从而减少磁盘I/O,如果kafka突然宕机,数据会丢失一部分;
3)高吞吐量:即使是非常普通的硬件kafka也可以支持每秒数百万的消息;
4)支持通过kafka服务器和消费机集群来分区消息;
5)支持Hadoop并行数据加载;

目前越来越多的开源分布式处理系统都支持与Kafka集成
如Apache flume 日志收集
Apache Storm 实时数据处理
Spark 内存处理
elasticsearch 全文检索

3. kafka总体结构

kafka生产者 -> kafkaBroker -> kafka消费者
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
对于Topic中的一条特定的消息,只会被订阅此Topic的每个group中的其中一个consumer消费,此消息不会发送给一个group的多个consumer;
在这里插入图片描述

4. kafka各项配置

架构图中的各个组件作用:
1)Producer :消息生产者,就是向 kafka broker 发消息的客户端;
2)Broker :一台 kafka 服务器就是一个 broker。一个集群由多个broker 组成。一个 broker可以容纳多个 topic;
3)Consumer :消息消费者,向 kafka broker 取消息的客户端;
4)Partition:为了实现扩展性,一个非常大的 topic 可以分布到多个 broker(即服务器)上,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列。partition 中的每条消息都会被分配一个有序的 id(offset)。kafka 只保证按一个 partition 中的顺序将消息发给consumer,不保证一个 topic 的整体(多个 partition 间)的顺序;
5)Topic :Kafka根据topic对消息进行归类,发布到Kafka集群的每条消息都需要指定一个topic;
6)ConsumerGroup:每个Consumer属于一个特定的Consumer Group,一条消息可以发送到多个不同的Consumer Group,但是一个Consumer Group中只能有一个Consumer能够消费该消息;
在这里插入图片描述

📃Topic : 一个业务就是一个主题
📃Partition: 提高kafka性能的关键手段
📃zookeeper服务器会产生三类日志:事务日志、快照日志和log4j日志

建议将事务日志(dataLogDir)与快照日志(dataLog)单独配置,因为当zookeeper集群进行频繁的数据读写操作是,会产生大量的事务日志信息,将两类日志分开存储会提高系统性能,而且,可以允许将两类日志存在在不同的存储介质上,减少磁盘压力。log4j用于记录zookeeper集群服务器运行日志,该日志的配置地址在conf/目录下的log4j.properties文件中,该文件中有一个配置项为“zookeeper.log.dir=.”,表示log4j日志文件在与执行程序(zkServer.sh)在同一目录下。当执行zkServer.sh 时,在该文件夹下会产生zookeeper.out日志文件。

📃kafka broker|topic|partition|segment

kafka中消息是以topic进行分类的,生产者通过topic向kafka broker发送消息,消费者通过topic读取数据。然而topic在物理层面又能以partition为分组,一个topic可以分为若干个partition,partition还可以细分为segment,一个partition物理上由多个segment组成。
为了便于说明问题,假设这里只有一个kafka集群,且这个集群只有一个kafka broker,也就是只有一台物理机。在这个kafka broker的server.properties配置文件中定义kafka的日志文件存放路径以此来设置kafka消息文件存储目录,与此同时创建一个topic:test,partition的数量为4,启动kafka就可以在日志存放路径中看到生成4个目录,在kafka文件存储中,同一个topic下有多个不同的partition,每个partition为一个目录,partition的名称规则为:topic名称+有序序号,第一个序号从0开始。

segment是什么?
如果就以partition为最小存储单位,我们可以想象当Kafka producer不断发送消息,必然会引起partition文件的无限扩张,这样对于消息文件的维护以及已经被消费的消息的清理带来严重的影响,所以这里以segment为单位又将partition细分。每个partition(目录)相当于一个巨型文件被平均分配到多个大小相等的segment(段)数据文件中(每个segment 文件中消息数量不一定相等)这种特性也方便old segment的删除,即方便已被消费的消息的清理,提高磁盘的利用率。每个partition只需要支持顺序读写就行。
segment文件由两部分组成,分别为“.index”文件和“.log”文件,分别表示为segment索引文件和数据文件。这两个文件的命令规则为:partition全局的第一个segment从0开始,后续每个segment文件名为上一个segment文件最后一条消息的offset值(偏移量),数值大小为64位,20位数字字符长度,没有数字用0填充。

📃leader选举

一条消息只有被所有follower都从leader复制过去才会被认为已提交。这样就避免了部分数据被写进了leader,还没来得及被任何follower复制就宕机了,而造成数据丢失。而对于producer而言,它可以选择是否等待消息commit。
一种非常常用的选举leader的方式是“少数服从多数”,在进行数据的复制过程中,存在多个follower,并且每个follower的数据速度都不相同,当leader宕机后,当前的follower上谁的数据最多谁就是leader。

5.生产者

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
负载均衡:由于消息topic由多个partition组成,且partition会均衡分布到不同broker上,因此,为了有效利用broker集群的性能,提高消息的吞吐量,producer可以通过随机或者hash等方式,将消息平均发送到多个partition上,以实现负载均衡。

批量发送:是提高消息吞吐量重要的方式,Producer端可以在内存中合并多条消息后,以一次请求的方式发送了批量的消息给broker,从而大大减少broker存储消息的IO操作次数。但也一定程度上影响了消息的实时性,相当于以时延代价,换取更好的吞吐量。

6.kafka Brokers

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7. 消费者

消费者 自己管理 位移
在这里插入图片描述
在这里插入图片描述
增加消费者组,进行水平扩展,增加消费能力
在这里插入图片描述
但 消费者数量 建议 不要比分区数多
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
任何Consumer必须属于一个Consumer Group
同一Consumer Group中的多个Consumer实例,不同时消费同一个partition,等效于队列模式。如图,Consumer Group 1的三个Consumer实例分别消费不同的partition的消息,即,TopicA-part0、TopicA-part1、TopicA-part2。
不同Consumer Group的Consumer实例可以同时消费同一个partition,等效于发布订阅模式。如图,Consumer Group 1的Consumer1和Consumer Group 2的Consumer4,同时消费TopicA-part0的消息。
partition内消息是有序的,Consumer通过pull方式消费消息。
Kafka不删除已消费的消息

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

TEAM-AG

编程公园:输出是最好的学习方式

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

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

打赏作者

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

抵扣说明:

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

余额充值