Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Kafka 介绍

Kafka 介绍

作者头像
郭顺发
发布于 2023-07-17 10:01:49
发布于 2023-07-17 10:01:49
27400
代码可运行
举报
文章被收录于专栏:pandacode_cnpandacode_cn
运行总次数:0
代码可运行

Kafka 简介

1. Kafka 服务准备

1.1. Kafka 服务下载安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 下载kafka服务包
wget https://archive.apache.org/dist/kafka/0.10.2.1/kafka_2.10-0.10.2.1.tgz
# 解压
tar -zxvf kafka_2.10-0.10.2.1.tgz
# 进入kafka目录
cd kafka_2.10-0.10.2.1
# 修改配置文件server.properties
vi config/server.properties

server.properties demo

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
broker.id=0
# ip可以是公网ip
advertised.listeners=PLAINTEXT://ip:9092
# ip最好使用内网ip,否则会出现错误:Socket server failed to bind to ip:9092: 无法指定被请求的地址
listeners=PLAINTEXT://ip:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/pandas/service/log/kafka
num.partitions=1
num.recovery.threads.per.data.dir=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000

############################# Zookeeper #############################
# 最好使用内网ip,否则会出现错误:Socket server failed to bind to ip:9092: 无法指定被请求的地址
zookeeper.connect=ip:2181
zookeeper.connection.timeout.ms=6000

1.2. Kafka服务启动与关闭

Kafka服务启动

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#启动zookeeper
/<kafka目录>/bin/zookeeper-server-start.sh /<kafka目录>/config/zookeeper.properties &
#等3秒后执行
sleep 3 
#启动kafka
/<kafka目录>/bin/kafka-server-start.sh /<kafka目录>/config/server.properties &

Kafka服务关闭

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#关闭zookeeper
/<kafka目录>/bin/zookeeper-server-stop.sh /<kafka目录>/config/zookeeper.properties &
#等3秒后执行
sleep 3 
#关闭kafka
/<kafka目录>/bin/kafka-server-stop.sh /<kafka目录>/config/server.properties &

2. Kafka 基本术语描述

术语

说明

Topic

主题,用于划分消息类型,类似于分类标签,是个逻辑概念

Partition

分区,topic中的消息被分割为一个或多个partition,是一个物理概念,对应到系统上的是一个或者多个目录

Segment

段,将partition进一步细分为若干个段,每个segment文件的最大大小相等

Broker

Kafka集群包含一个或多个服务器,每个服务器节点称为一个Broker,一个topic中设置partition的数量是broker的整数倍

Producer

生产者,即消息发送者,会将消息发送到相应的partition中

Consumer Group

消费组,一个partition中的消息只能被同一个消费组中的一个消费者进行消费;而一个消费组内的消费者只会消费一个或者几个特定的partition

Replication of partition

分区副本,副本是一个分区的备份,是为了防止消息丢失而创建的分区备份

Partition Leader

每个partition有多个副本,其中有且仅有一个作为Leader,Leader是当前负责读写的partition,即所有读写操作只能发生于Leader分区上

Partition Follower

所有Follower都要从Leader上同步消息,Follower与Leader始终保持消息同步;partition leader与partition follower之间是主备关系而非主从关系

ISR

ISR:In-Sync Replicas,是指副本同步列表;AR:Assiged Replicas,指所有副本;OSR:Outof-Sync Replicas;AR=ISR+OSR

offset

偏移量,每个消息都有一个当前Partition下唯一的64字节的offset,他是相当于当前分区第一条消息的偏移量

offset commit

当consumer从partition中消费了消息后,consumer会将其消费消息的offset提交给broker,表示当前partition已经消费到了该offset所标识的消息。

Rebalance

当消费者组中消费者数量发生变化或者topic中partition数量发生变化,partition的所有权会在消费者间转移,即partition会重新分配。

__commit_offsets

消费者提交的offset被封装为了一种特殊的消息被写入到一个由系统创建的、名称为__commit_offstes的特殊topic的partition中,该topic默认包含50个partition,这些offset的默认有效期为一天

Broker Controller

Kafka集群的多个broker中,会有一个被选举为controller,负责管理集群中partition和副本replicas的状态。

Zookeeper

负责维护和协调Broker,负责Broker Controller的选举;这里要说明一下,Broker Controller是由Zookeeper选举出来的,而Partition Leader是由Broker Controller选举出来的。

Group Coordinator

group coordinator是运行在broker上的线程,主要用于consumer group中各个成员的offset位移管理和Rebalance;Group Coordinator同时管理着当前broker的所有消费者组。当Consumer需要消费数据时,并不是直接中__comsumer_offset的partition中获取的,而是从当前broker的Coordinator的缓存中获取的。而缓存中的数据是在consumer消费完提交offset时,同时提交到coordinator的缓存以及__consumer_offset的partition中的。

2.1. topic、partition、segment、broker的关系

topic是一个主题,是一个逻辑概念,而partition是一个一个先进先出的队列,而消息信息就存在partition队列中,但是由于一个topic对应的partition中消息内容太大,因此将其分为多个segment用于存储。segment文件的最大大小是一致的。

举个例子,如果一个segment的最大大小为10个字节,当写够10个字节后,就会重新再生成一个segment,segment对应的就是实际的内容文件,而内容文件又分为后缀名为log的具体消息文件和后缀名为index的消息索引文件。

切换到kafka的日至目录文件,查看即可:

这里因为是我自己的测试,没有那么大的数据量,所以文件都是0,文件的命名方式是以上一个文件的结尾偏移量得来的,第一个文件前面没有文件,所以偏移量为0。

而broker是kafka的服务器,假设某topic中有N个partiton,集群中有M个broker,则partiton与broker的关系为:

若N>M,且N%M =0 ,则每个broker会平均存储该topic的多个partiton

若N>M,且N%M!=0,则每个broker中的partion数量不是不平均的。应尽量避免这种情况,容易导致Kafka 集群消息不均衡,各个 broker 的任务压⼒不均衡。

若N<M,则会有N个broker中都存放了⼀个partition,⽽有M-N个broker是没有partition的。

总而言之一句话:⼀个 Topic 的消息可以被存放到多个 Broker 中,⼀个 Broker 中可以存放⼀个 Topic 的多 个Partition,⽽⼀个 Partition 中可以存放很多的 Segment,⼀个 Segment 中可以存放很多的消息。

2.2. consumer、consumer group与partition的关系

consumer是消费者,一个消费者可以订阅多个topic消息,也可以订阅同一个topic中多个partition的消息。

consumer group是消费者组,每一条消息只能被组内一个实例进行消费,不同的消费组可以消费同一条消息。

consumer与partition的关系:一个consumer可以消费一个或多个partition的消息,但是一个partition的消息不能被多个消费者消费,其主要目有两个,一个是为了正确的回写消费进度,另一个是为了保证同一个partition的消息顺序写、顺序读;但是这样就会造成一个问题,就是如果消费者的数量多于partition的数量的时候,就一定有消费者是处于空闲。而如果partition不是消费者的整数倍,那么也会存在有的消费者消费的partition比其他消费者多的情况,因此一般情况下,都会将partition的数量设置为消费者的整数倍,这样所有的消费者消费的partition数量一致,不会产生压力不均的问题。

2.3. Replicas of partition、Partition Leader、Partition Follower

Replicas of partition就是partition的副本数量,主要是为了解决单点问题导致的broker宕机后partition不可用,如果副本为3,那么看有几个broker,如果有一个,那么在当前的broker上会有相同的三个partition,如果有两个broker,那么会存在一个broker上有一个partition另外一个broker上有两个partition的情况,如果有三个broker,那么每一个broker上都会有一个partition。

而Partition是存在Partition Leader和Partition Follower的,每一个partition在创建的时候,都会使用Zookeeper的临时节点来确定哪一个partition是Leader,那么其余的Partition则都是Follower,只有Leader会处理客户端的读写请求,而Follower只会将Leader中的数据同步到自己的日志中,而不向外部客户端提供任何服务,它的作用就是当Leader所在的broker宕机后,其所链接的Zookeeper就是重新选举一个Leader,这是其中一个Follower会被选举为Leader,其同步的数据也就派上了用场。

创建一个topic的命令如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replicationfactor 1 --partitions 1 --topic test

其中partition表示该topic下面有多少个partition,factor是复制因子,表示每个partition需要复制几份进行保存,这里的复制因子数量不能超过broker的数量,因为超过了,一个broker中存在同一个partition的数量就大于一,没有任何意义,返回会增加数据同步和数据存储的压力。

2.4. offset、offset commit、_consumer offsets

offset就是偏移量,consumer消费消息时,是通过指定的offset来定位下一条要读取消息的位置,offset的维护是由consumer进行维护的。 在kafka0.8之后,offset保存在kafka集群上,在0.8版本之前,是保存在zookeeper上的。在新版本中,consumer的offset其实是作为一条普通的消息发送到kafka的,消息的默认主题是_consumer_offsets,其默认有50个partition。

当consumer消费完消息后,会将消费消息的offset提交给broker,表示这些消息已经被消费。

consumer提交消费offset的方式有自动提交、手动异步提交、手动同步提交、手动同步异步混合提交这几种方案:

自动提交:自动提交只需要设置使用时只需要设置enable.auto.commit为true即可。其优点就是比较简单,但是缺点是会产生重复消息。因为自动提交默认的是5秒提交一次,提交的内容是上一次被消费的数据,那么如果在第三秒的时候出现了Rebalance,在Rebalance后,consumer需要重新从上一次确认过的offset处消费,就会造成之前三秒的数据再一次被消费。

手动提交:手动同步提交需要使用commitSync(),而手动异步提交需要使用commitAsync(),同步提交的优点是比较灵活,但缺点也很明显,就是会阻塞;而异步提交的优点就是相对于同步来说,不会阻塞;那么一般我们会使用同步和异步组合使用,就是进行异步提交offset,但是需要监听broker的响应结果,如果相应结果是提交失败,则再以同步的方式进行提交。

还有一种更为精致的提交方式,commitSync(Map<TopicPartition, OffsetAndMetadata>)和commitAsync(Map<TopicPartition, OffsetAndMetadata>)。它们的参数是⼀个 Map 对象,键就是 TopicPartition,即消费的分区,⽽值是⼀个

OffsetAndMetadata 对象,保存的主要是位移数据。

上面提到的_consumer_offsets,该topic的partition默认为50个,使用哪个partition使用的是consumer groupID的hash值与partition数量取模处理,该topic中数据的有效期为1天,其key=groupid+topic+分区号,value就是当前offset的值。写⼊到__consumer_offsets主题的partition中的offset消息格式为:[Group, Topic, Partition]::[OffsetMetadata[Offset, Metadata], CommitTime, ExpirationTime]。当 Kafka 集群中的第⼀个 Consumer 程序启动时,Kafka 会⾃动创建位移主题。

参考资料

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-07-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Kafka全面认知
最早设计的目的是作为LinkedIn的活动流和运营数据的处理管道。这些数据主要是用来对用户做用户画像分析以及服务器性能数据的一些监控。
花落花相惜
2021/11/22
4850
Java基础面试题【分布式】Kafka
producer发送消息完,只等待lead写入成功就返回了,leader crash了,这时follower没来及同步,消 息丢失。
@派大星
2023/10/25
3050
Java基础面试题【分布式】Kafka
Kafka原理和实践
本文从Kafka的基本概念、特点、部署和配置、监控和管理等方面阐述 Kafka 的实践过程。
杨振涛
2019/08/08
1.4K0
Kafka是如何保证高性能和高吞吐量的?
最早设计的目的是作为LinkedIn的活动流和运营数据的处理管道。这些数据主要是用来对用户做用户画像分析以及服务器性能数据的一些监控。
IT大咖说
2019/11/14
2.9K0
快速学习-Kafka架构深入
Kafka 中消息是以 topic 进行分类的,生产者生产消息,消费者消费消息,都是面向 topic的。
cwl_java
2020/02/24
3980
Kafka学习笔记之概述、入门、架构深入
Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。
大数据真好玩
2021/03/15
7160
Kafka详解
  Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、Storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。
忧愁的chafry
2022/10/30
1.3K0
Kafka详解
第一天:Kafka理论学习
Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。在流式计算中,Kafka一般用来缓存数据,Storm通过消费Kafka的数据进行计算。
sowhat1412
2020/11/05
5130
第一天:Kafka理论学习
都说Kafka牛3万字带你全面掌握kafka
系统间的耦合高怎么办,我们如何不让一个服务过于庞大,一个好的方式就是依据具体的功能模块拆分服务,降低服务的耦合度,服务间的交互可以通过消息传递数据来实现,除此之外Kafka非常适合在线日志收集等高吞吐场景,kafka有更好的吞吐量,内置分区,副本和故障转移,这有利于处理大规模的消息,所以kafka被各大公司广泛运用于消息队列的构建:
大数据老哥
2021/03/05
1.3K0
都说Kafka牛3万字带你全面掌握kafka
kafka实战教程(python操作kafka),kafka配置文件详解
应用往Kafka写数据的原因有很多:用户行为分析、日志存储、异步通信等。多样化的使用场景带来了多样化的需求:消息是否能丢失?是否容忍重复?消息的吞吐量?消息的延迟?
全栈程序员站长
2022/08/12
2.9K0
kafka实战教程(python操作kafka),kafka配置文件详解
Kafka单机部署
kafka是由Apache软件基金会发布的一个开源流处理平台,由Scala和Java编写。它是一种高吞吐量的分布式发布的订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。
小手冰凉
2020/05/08
4.7K0
Kafka教程_图解kafka
推荐【Kafka教程】https://bigbird.blog.csdn.net/article/details/108770504 推荐【rabbitmq教程】https://bigbird.blog.csdn.net/article/details/81436980 推荐【Flink教程】https://blog.csdn.net/hellozpc/article/details/109413465 推荐【SpringBoot教程】https://blog.csdn.net/hellozpc/article/details/107095951 推荐【SpringCloud教程】https://blog.csdn.net/hellozpc/article/details/83692496 推荐【Mybatis教程】https://blog.csdn.net/hellozpc/article/details/80878563 推荐【SnowFlake教程】https://blog.csdn.net/hellozpc/article/details/108248227 推荐【并发限流教程】https://blog.csdn.net/hellozpc/article/details/107582771 推荐【JVM面试与调优教程】https://bigbird.blog.csdn.net/article/details/113888604
全栈程序员站长
2022/11/03
2.1K1
Kafka教程_图解kafka
Kafka 的稳定性
多分区原子写入: 事务能够保证Kafka topic下每个分区的原⼦写⼊。事务中所有的消息都将被成功写⼊或者丢弃。 ⾸先,我们来考虑⼀下原⼦读取-处理-写⼊周期是什么意思。简⽽⾔之,这意味着如果某个应⽤程序在某个topic tp0的偏移量X处读取到了消息A,并且在对消息A进⾏了⼀些处理(如B = F(A)),之后将消息B写⼊topic tp1,则只有当消息A和B被认为被成功地消费并⼀起发布,或者完全不发布时,整个读取过程写⼊操作是原⼦的。 现在,只有当消息A的偏移量X被标记为已消费,消息A才从topic tp0消费,消费到的数据偏移量(record offset)将被标记为提交偏移量(Committing offset)。在Kafka中,我们通过写⼊⼀个名为offsets topic的内部Kafka topic来记录offset commit。消息仅在其offset被提交给offsets topic时才被认为成功消费。 由于offset commit只是对Kafka topic的另⼀次写⼊,并且由于消息仅在提交偏移量时被视为成功消费,所以跨多个主题和分区的原⼦写⼊也启⽤原⼦读取-处理-写⼊循环:提交偏移量X到offset topic和消息B到tp1的写⼊将是单个事务的⼀部分,所以整个步骤都是原⼦的。
用户7353950
2022/06/23
1.3K0
Kafka 的稳定性
[721]linux安装kafka
首先确保你的机器上安装了jdk,kafka需要java运行环境,以前的kafka还需要zookeeper,新版的kafka已经内置了一个zookeeper环境,所以我们可以直接使用
周小董
2020/01/13
2.8K0
[721]linux安装kafka
kafka学习笔记
搭建参考: https://www.cnblogs.com/luotianshuai/p/5206662.html
保持热爱奔赴山海
2019/09/17
5580
kafka学习笔记
【Kafka】(二)Kafka 的架构
如上图所示: 一个典型的 Kafka 集群中包含若干 Producer(可以是 web 前端产生的 Page View,或者是服务器日志,系统 CPU、Memory 等); 若干 broker(Kafka 支持水平扩展,一般 broker 数量越多,集群吞吐率越高),若干 Consumer Group,以及一个 Zookeeper 集群; Kafka 通过 Zookeeper 管理集群配置,选举 leader,以及在 Consumer Group 发生变化时进行 rebalance; Producer 使用 push 模式将消息发布到 broker,Consumer 使用 pull 模式从 broker 订阅并消费消息;
redszhao
2021/08/09
9890
【Kafka】(二)Kafka 的架构
kafka使用以及原理
每条发布到Kafka集群的消息都有一个类别,这个类别被称为topic。(物理上不同topic的消息分开存储,逻辑上一个topic的消息虽然保存于一个或多个broker上但用户只需指定消息的topic即可生产或消费数据而不必关心数据存于何处)
leobhao
2022/06/28
4280
kafka使用以及原理
看完这篇Kafka,你也许就会了Kafka[通俗易懂]
Kafka是一种消息队列,主要用来处理大量数据状态下的消息队列,一般用来做日志的处理。既然是消息队列,那么Kafka也就拥有消息队列的相应的特性了。
全栈程序员站长
2022/08/24
15.9K4
看完这篇Kafka,你也许就会了Kafka[通俗易懂]
消息队列之Kafka
kafka是⼀个分布式、⽀持分区的(partition)、多副本的(replica),基于zookeeper协调 的分布式消息系统,最⼤的特性就是可以实时的处理⼤量数据以满⾜各种需求场景。 它有以下特性:
羽毛球初学者
2024/10/14
1490
Kafka 面试真题及答案,建议收藏
Kafka可以说是必知必会的了,首先面试大数据岗位的时候必问kafka,甚至现在java开发岗位也会问到kafka一些消息队列相关的知识点。先来看看有哪些最新的Kafka相关面试点:
大数据技术架构
2020/06/05
3.2K0
Kafka 面试真题及答案,建议收藏
相关推荐
Kafka全面认知
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验