kafka

kafka简介 kafka的消息模型 阅读详情

目录

1.概述

2.入门

2.1 测试消息的生产与消费

3.生产者详解

3.1 kafka java客户端数据生产流程分析

3.2 发送类型

3.3 序列化器

3.4 分区器

3.5 拦截器

3.6其他参数

4.消费者

4.1 消息接受参数设置

4.2 订阅主题和分区

4.3 位移提交

4.4 同步、异步提交

4.5 指定位移消费

4.6再均衡监听器

4.7 消费者拦截器

5.主题

5.1 增加分区

6.分区

6.1 分区分配策略

7.存储结构

7.1 日志索引

8.稳定性

8.1 幂等性

8.2 事务

8.3 控制器

8.4 可靠性保证

9.消费组

9.1. 命令行工具

9.2 数据管道connect

10.spring boot 整合kafka


1.概述

为方便扩展,并提高吞吐量,一个topic分为多个partition;

配合分区的设计,提出消费组的概念,组内每个消费者并行消费;

为提高可用性,为每个partition增加若干副本;

zk中记录的是leader,2.8.0之后也可以配置不采用zk

2.入门

config下的Server.properties修改:

broker.id=唯一标识

log.dirs = /opt/module/kafka/datas

zookeeper.connect = xx.xx.xx.xx:2181,xx.xx.xx.xx:2181,xx.xx.xx.xx:2181/kafka

启动命令:./bin/kafka-server-start.sh config/server.properties(默认可以不指定)

2.1 测试消息的生产与消费

命令如下:

创建一个主题
bin/kafka-topic.sh --zookeeper localhost:2181 --create --topic chl --partitions 2 --replication-factor 1
 
# zookeeper 指定kafka所连接的zk服务器地址
# topic 指定要创建的主题名称
# partitions 指定了分区个数
# replication-factor 指定副本因子
# create 创建主题的命令

查看所有主题:

/bin/kafka-topic.sh --zookeeper localhost:2181 --list

   

/bin/kafka-start.sh --zookeeper localhost:2181 --describe --topic chl

启动消费端接受消息:

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic chl
# bootstrap-server 指定了连接kafka集群的地址
# topic 指定了消费端订阅的主题

生产端发送消息:

/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic chl
# broker-list 指定连接kafka集群的地址
# topic指定了发送消息的主题

查看linux centos7 防火墙是否关闭:firwwall -cmd --state

总结kafka服务端配置:

zookeeper.connect #指明zookeeper地址,如果zk是集群则以逗号分开;
listeners:监听列表,broker对外提供服务时绑定的ip和端口,多个以逗号隔开,如果监听器名称不是一个安全的协议,listener.security.protocol.map也必须设置,主机名称设置0.0.0.0绑定所有的接口,主机名称为空则绑定默认的接口。如:PLAINTEXT://myhost:9092,SSL://9091 CLIENT://0.0.0.0:9092 REPLICATION://localhost:9093
broker.id:broker的唯一标识符,如果不配置,则自动生成,建议配置
log.dir:日志数据存放目录
message.max.bytes:服务器接受单个消息的最大大小,默认976.6kb

3.生产者详解

3.1 kafka java客户端数据生产流程分析

3.2 发送类型

 producer.send(record);

同步发送:

通过send()发送完消息后返回一个Future对象,然后调用Future对象的get()方法等待kafka

响应,如果kafka正常响应,返回一个RecordMetaData对象,该对象存储消息的偏移量

如果kafka发生错误,无法正常响应,就会抛出异常

异步发送:

producer.send(record,new Callback(){

public void onCompletion(RecordMetadata metadata,Excepton exception){

 if(exception ==null){

        System.put.prinltn(metadata.partition()+":"+metadata.offset());

}

}

});

3.3 序列化器
 

消息要到网络上传输,必须进行序列化,而序列化器的作用就是如此。

kafka提供了默认的字符串序列化器(StringSerializer),还有IntegerSerializer、字节数组ByteSerializer序列化器,这些序列化器都实现了接口

3.4 分区器

本身kafka有自己的分区策略的,如果未指定,就会默认的分区策略;

kafka根据传递消息的key来进行分区的分配,即hash(key)%numPartitions。如果key相同的话,就会分配到统一分区。

自定义分区器实现Partitioner

3.5 拦截器

Producer拦截器interceptor是个相当新的功能,它和consumer、interceptor是在kafka0.10版本被引入的,主要用于实现clients端的定制化控制逻辑。

生产者拦截器可以在消息发送前做一些准备工作。

使用场景:1.按照某个规则过滤掉不符合要求的消息。2.修改消息的内容。3.统计类需求

实现ProducerInterceptor接口

KafkaProducer对象是线程安全的,多个线程可以共享KafkaProducer对象。

3.6其他参数

acks:

这个参数用来指定分区中必须有多个副本收到这条消息,之后生产者才会认为这条消息写入成功。acks是生产者客户端中非常重要的一个参数,它涉及到消息的可靠性和吞吐量之间的权衡。

ack=0,生产者在成功写入消息之前不会等待任何来自服务器的响应。如果出现问题生产者是感知不到的,消息就丢失了。不过因为生产者不需要等待服务器响应,所以它可以以网络能够支撑的最大速度发送消息,从而达到很高的吞吐量。

ack=1,默认值1,只要集群的首领节点收到消息,生产者就会收到一个来自服务器的成功响应。如果消息无法达到首领节点(比如首领节点奔溃,新的首领还没有被选举出来),生产者会收到一个错误响应,为了避免数据丢失,生产者会重发消息。但是,这样有可能会导致数据丢失,如果收到写成功通知,此时首领节点没来得及同步数据到follow节点,首领节点奔溃,就会导致数据丢失。

ack=-1,只有当所有参与复制的节点都收到消息时,生产者会收到一个来自服务器的成功响应,这种模式是最安全的,它可以保证不止一个服务器收到消息。

acks参数是一个字符串类型,不是整数类型,如果配置成整数类型会抛出异常。

4.消费者

4.1 消息接受参数设置

序列化、设置消费组

4.2 订阅主题和分区

正在表达式订阅:

consumer.subscribe(Pattern.compile("chl*"));

指定订阅的分区:

comsumer.assign(Arrays.asList(new TopicPartition("topic0888"),0));

4.3 位移提交

对于kafka中的分区而言,它的每条消息都有唯一的offSet,用来表示消息在分区中的位置

调用poll()时,该方法会返回我们没有消费的消息,当消息从broker返回消费者时,broker并不跟踪这些消息是否被消费者接收到,kafak让消费者自身管理消费的位移,并向消费者提供更新位移的接口,这种更新位移方式称为提交。

会导致重复消费、消息丢失等情况;

默认自动提交offset;enable.auto.commit(true);

4.4 同步、异步提交

自动提交:

这种方式让消费者来管理位移,应用本身不需要显示操作。当enable.auto.commit设置为true,那么消费者会在poll方法调用后每隔5秒(由auto.commit.interval.ms指定)提交一次位移。和很多其他操作一样,自动提交也是由poll()方法来驱动的,在调用poll方法时,消费者判断是否达到提交时间,如果是则提交上一次poll返回的最大位移。需要注意到,这种方式可能会导致消息重复消费,假如,某个消费者poll消息后,应用正在处理消息,在3秒后kafka进行了重平衡,那么由于没有更新位移导致重平衡后部分消息重复消费。

4.5 指定位移消费

目前为止,我们知道消息的拉取是根据poll()方法中的逻辑处理的,但是这个方法对于普通开发人员来说就是个黑盒处理,无法精确掌握其消费的起始位置。

seek()方法正好提供了这个功能,让我们得以追踪以前的消费或者回溯消费

4.6再均衡监听器

再均衡是指分区的所处从一个消费者转移到另外一个消费者的行为,它为消费组具备了高可用性和伸缩性提供了保障,使得我们既方便有又安全地删除消费组内的消费者或者往消费者内添加消费者。不过再均衡发生期间,消费者是无法拉取消息的。

4.7 消费者拦截器

消费者拦截器主要是在消费到消息或在提交消费位移时进行的一些定制化的操作。

5.主题

topic元数据信息保存在zk中

创建副本时,副本数量不能大于总节点数量。

删除主图:

若delete.topic.enable=true,直接彻底删除topic;

若delete.topic.enable=false,如果当前Topic没有使用过即没有传输过消息,可以彻底删除;

如果当前Topic有使用过传输过消息,并没有真正删除Topic只是把这个topic标记为删除,重启Kafka server后删除。

5.1 增加分区

修改分区时,只能增加分区,不能减少分区,减少会报异常;

6.分区

kafka可以将主题划分为多个分区partition,会根据分区规则选择把消息存储到哪个分区中,只要如果分区规则设置的合理,那么所有的消息将会被均匀的分布到不同的分区中,这样就实现了负载均衡和水平扩展。另外,多个订阅者可以从一个或多个分区中同时消费数据,以支撑海量数据处理能力。

producer和consumer都只会与leader角色的分区副本相连。

Follower:

Follower跟随leader,所有写请求都通过leader路由,数据变更会广播给所有Follower,Follower与lead保持数据同步,如果Leader失效,则从Follower中选举出一个新的leader。当Follower与Leader挂掉、卡主或者同步太慢,leader会把这个Follower从ISR列表中删除,重新建一个Follower.

Zookeeper:负责维护和协调broker,当kafka系统中新增了broker或某个broker发生故障失效时,由zookeeper通知生产者和消费者,生产者和消费者依据zk的broker状态消息与broker协调数据的发布和订阅任务。

AR:分区中的所有副本;

ISR:所有与leader副本(包括Leader副本在内)保持一定程度的副本组成ISR;

OSR:与Leader副本同步滞后过多的副本;

HW:高水位,标识了一个特定的offset,消费者只能拉取到这个offset之前的消息;

LEO:日志末端位移,记录了该副本底层日志中下一条消息的位移值,注意是下一条消息

集群的时候 server.properties ,不用配置listener了,添加host.name,port

6.1 分区分配策略

按照kafka默认的消费逻辑设定,一个分区只能被同一个消费组内的一个消费者消费,

7.存储结构

 每一个partition(文件夹)相当于一个巨型文件被平均分配到多个大小相等segment数据文件里;

但每一个段Segment file消息数量不一定相等,这样的特性方便old segment file 高速被删除。默认情况下每一个文件大小为1g。

每一个partition仅仅需要支持顺序读写即可。segment文件生命周期由服务端配置参数决定。

segment file组成:index file 和 data file,此2个文件,一一对应,成对出现后,后缀.index和.log

7.1 日志索引

kafka解决查询效率的手段之一就是将数据文件分段,比如有100条message,它们的offest是从0到99,假设数据文件分成5段,第一段0-19,第二段20-39,依次类推,每段放在一个单独的数据文件里面,数据文件以该段中最小的offset命名。

总结:

零拷贝技术只用将磁盘文件的数据复制到页面缓存中,然后将数据从页面缓存直接发送到网络中,避免了重复复制数据

8.稳定性

8.1 幂等性

接口的多次调用所产生的结果和调用一次是一致的,生产者在进行重试的时候有肯能会重复写入消息,而kafka的幂等性功能就可以避免这种情况。

幂等性条件:只能保证Producer在单个会话内不丢不重,如果producer出现意外挂掉再重启是无法保证的。

幂等性不能跨多个partition,只能保证单个partition内的幂等性,当涉及多个topic-partition时,这中间的状态并没有同步。

Producer只需要把enable.idempotence()设置为true即可。默认就为true。

8.2 事务
 

需要定义transactionId;

producer.initTransaction();

producer.beginTransaction();

producer.commitTransaction();提交

producer.abortTransaction();回滚

8.3 控制器

kafka集群中会有一个或多个broker,其中有一个broker会被选举为控制器,它负责管理整个集群中所有分区和副本的状态。集群中仅有一个控制器

具备控制器身份的broker需要比其他普通的broker多一份职责,具体:

1.监听partition相关的变化

2.监听topic的变化

3.监听broker的变化

8.4 可靠性保证
 

kafka的保证:

1.保证分区消息的顺序

如果使用同一个生产者往同一个分区写入消息,而且消息B在消息A之后写入,那么kafka可以保证消息B的偏移量比消息A的偏移量大,而且消费者会先读取消息A 再读取消息B

2.只有消息被写入分区的所有副本时,才被认为是已提交

3.只要有一个副本是活跃的,那么已提交的消息就不会丢失;

4.消费者只能读取已经提交的消息。

9.消费组

9.1. 命令行工具

bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list

9.2 数据管道connect

10.spring boot 整合kafka

pom: spring-kafka

application.yml: spring.kafka.producer.bootstrap-servers=127.0.0.1:9092

KafkaTemplate;

消费者@KafkaListener(id="",topic="",group="")

@Transaction(rollback=RuntimeException.class) 也支持kafka事务回滚

Flume 1.8 写kafka到不同主题和不同分区 (随机)配置 logcollect.sources.taildir-source.interceptors =interceptor logcollect.sources.taildir-source.interceptors.interceptor.type = regex_extractor logcollect.sources.taildir-source.interceptors.interceptor... 阅读详情

相关推荐

【Kafka】Kafka-Eagle 和 Kafka-UI 的安装使用

Kafka Eagle 提供了完善的管理页面,可以监控 Kafka 集群的整体运行情况,很方便的去管理和可视化 Kafka 集群的一些信息,例如 Broker 详情、性能指标趋势、Topic 集合、消费者信息等,在生产环境中经常使用。

2403_86969226的博客 3269

Kafka

一、基础概念 关键术语 1.主题(topic):一个 topic 里保存的是同一类消息,相当于对消息的分类,每个 producer 将消息发送到 kafka 中,都需要指明要存的 topic 是哪个,也就是指明这个消息属于哪一类。 2.分区(partition):每个 topic 都可以分成多个 partition,每个 partition 在存储层面是 append log 文件。任何发布到此 partition 的消息都会被直接追加到 log 文件的尾部。为什么要进行分区呢?最根本的原因就.

sinat_34814635的博客 1万+

使用kafka-eagle监控kafka

kafka-eagle(/'iːg(ə)l/)是一款简单高效的监控系统,用以监控kafka的偏移量、元数据等信息,它还提供了邮件、钉钉、微信报警功能。本篇假设已经存在一个可用的kafka集群,并介绍kafka-eagle搭建与使用。 官网:https://www.kafka-eagle.org/ github:https://github.com/smartloli/kafka-eagle 前...

敲天 5031

学习系列——kafak入门及其原理

Kafka简介 Kafka是linkedin使用Scala编写具有高水平扩展和高吞吐量的分布式消息系统。Kafka对消息保存时根据Topic进行归类,发送消息者成为Producer,消息接受者成为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)称为broker。无论是Kafka集群,还是producer和consumer都依赖于zookeeper来保证系统可用性,为集群保存一些meta信息。 主流MQ对比 ActiveMQ RabbitMQ Kafka

weixin_43963583的博客 6053

Kafka(一)使用Docker Compose安装单机Kafka以及Kafka UI_docker 部署单机kafka

还有就是,当使用任何来自于bitnami的镜像,如何遇到了问题,想查看日志,可以将镜像的Debug日志打开,通过环境变量控制由于Docker Hub的说明字数限制,可以在Github上查看。

2501_90252715的博客 2100

Kafka Confluent 简介

Apache Kafka 消息分发组件,数据采集后先入Kafka。 Schema Registry Schema管理服务,消息出入kafka、入hdfs时,给数据做序列化/反序列化处理。 Kafka Connect 提供kafka到其他存储的管道服务,此次焦点是从kafka到hdfs,并建立相关HIVE表。 Kafka Rest Proxy 提供kafka的Rest API服务。 Kafk

石权的博客 1万+

安装配置Kafka,并使用Java集成Kafka

Kafka 是Java 语言编写的,因此需要在安装 Kafka 之前先安装 Java 运行环境。Kafka 支持 Java 8 及以上版本。可以通过以下命令检查 Java 运行环境的版本Kafka 的运⾏环境依赖于 ZooKeeper,Kafka 使用 ZooKeeper 进行分布式协调,因此在安装 Kafka 之前,需要先安装 ZooKeeper。

m0_73799407的博客 4351

docker部署kafka监控服务kafka-exporter

1、kafka需要zookeeper管理,所以需要先安装zookeeper。 下载docker pull wurstmeister/zookeeper:latest版本 docker pull wurstmeister/zookeeper 启动镜像生成容器 docker run -d --restart="always" --name zookeeper -p 2181:2...

zchlove137的博客 4983

kafka实战

1. kafka介绍 1.1. 主要功能 根据官网的介绍,ApacheKafka®是一个分布式流媒体平台,它主要有3种功能:   1:It lets you publish and subscribe to streams of records.发布和订阅消息流,这个功能类似于消息队列,这也是kafka归类为消息队列框架的原因   2:It lets ...

weixin_30614109的博客 6776

Kafka【三】Windows下安装Kafka集群

如果启动过程报错,主要是因为zookeeper和kafka的同步问题,请先执行cluster-clear.cmd文件,再执行cluster.cmd文件即可。集群启动命令后,会打开多个黑窗口,每一个窗口都是一个kafka服务,请不要关闭,一旦关闭,对应的kafka服务就停止了。因为kafka内置了ZooKeeper软件,所以此处将解压缩的文件作为ZooKeeper软件使用。将kafka1文件夹复制两份,改名为kafka2,kafka3。修改文件夹名为kafkazookeeper。

小小默:进无止境 3069

如何用 Kafka Manager 实现 Kafka 集群全面监控

Apache Kafka 是现代大数据架构中不可或缺的组件,广泛用于日志收集、流处理、消息队列等场景。随着 Kafka 集群规模的增长和业务复杂度的提升,**对 Kafka 的实时监控变得尤为重要**。

九天的专栏 974

java kafka使用

是一款结合了目前Kafka监控工具的特点,重新研发的一块开源免费的Kafka集群优秀的监控工具在启动Kafka的脚本前,添加export JMX_PORT=9988上传解压,配置环境变量vim /etc/profile配置vim conf/system-config.properties#修改第4行,配置kafka集群别名#修改第5行,配置ZK集群地址#修改第64行,打开图标统计#修改第122行,开启mysql启动。

wste3567的博客 2195

kafka发送消息至指定分区

前言 在实际使用中,我们可能需要对某个topic下不同的消息进行分类管理,比如确保消费的顺序性,在这种场景下,我们可以首先确保生产者发送消息到指定的分区即可 本文的测试基于docker搭建的一个双节点的简单集群,有兴趣搭建的同学可参考我的另一篇博客 1、创建一个名为second的topic 在该topic下,有3个分区,两个副本 $KAFKA_HOME/bin/kafka-topics.sh --create --zookeeper zoo1:2181 --replication-factor 2 --pa

congge 1万+

Kafka + Kafka-UI

✅ 使用不需要 Zookeeper 的 Kafka—— 那就是Kafka KRaft 模式从 Kafka 2.8+ 起官方支持,3.3+ 开始默认推荐。去掉 zookeeper 依赖简化部署,性能更高更符合现在 Kafka 的新一代标准架构。

Bruce__taotao的博客 3458

【Kafka】Kafka认证与授权

Kafka的认证机制 概述 GSSAPI:使用的Kerberos认证,可以集成目录服务,比如AD。Kafka最小版本 0.9 PLAIN:使用简单用户名和密码形式,Kafka最小版本 0.10 SCRAM:主要解决PLAIN动态更新问题以及安全机制,Kafka最小版本 0.10.2 OAUTHBEARER:基于OAuth 2认证框架,Kafka最小版本 2.0 配置SASL\PLAIN 创建kafka_server_jaas.conf文件 这个文件是配置Broker服务端的JAAS,进入Kafka程序目录的

九师兄 7648

Windows10下RTABMAP+T265实现三维建图

win10+rtabmap+t265扫描地形

Suxiang1997的博客 3486

Kafka:浅谈对Kafka的认识

消息系统都致力于让Consumer以最大的速率最快速的消费消息,一些消息系统比如Scribe和Apache Flume采用了Push模式,将消息推送到下游的Consumer。更进一步的性能优化是零拷贝的使用,也就是从磁盘日志到消费者客户端的数据传递,因为Kafka是MQ,对于msg不具备加工处理,所以得以实现。物理上不同Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个Broker上,但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处。注意:ack的默认值就是1。

王小二(海阔天空) 3279

Setup&Hold互卡问题和Useful Skew的影响

setup和hold互卡问题分析

godping的博客 5093

使用Kafka UI管理Kafka

在使用Kafka进行开发时,有个可视化的管理界面有助于提高开发效率。目前已经有很多Kafka的管理界面实现。本文介绍的Kafka UI是一个新的实现。 该界面的GitHub地址是provectus/kafka-ui。GitHub - provectus/kafka-ui: Open-Source Web GUI for Apache Kafka ManagementOpen-Source Web GUI for Apache Kafka Management. Contribute to provectu

成富的专栏 1万+

(七)独立按键

(七)独立按键

m0_52555663的博客 1717

芒果YOLOv5改进107:ARConv自适应旋转卷积,全网首发 | 即插即用:以增强其表征能力,从而准确检测方向物体,ICCV顶会论文idea

ARConv自适应旋转卷积,全网首发 | 即插即用:以增强其表征能力,从而准确检测方向物体,ICCV顶会论文idea

包括YOLOv5、YOLOv7、YOLOv8等模型改进 956

kafka系列之camel-kafka

文章目录概述详解camel-kafka 概述 首先关于 camel 的基本概念和用法,以及 kafka 的基本概念和用法,这里就不啰嗦了。这篇文章假设你对二者都有基本的认识。 camel 本身是一个路由引擎,通过 camel 你可以定义路由规则,指定从哪里(源)接收消息,如何处理这些消息,以及发往哪里(目标)。camel-kafka 就是 camel 的其中一个组件,它从指定的 kafka top...

lucasma的博客 4939

OpenClaw一人公司落地案例:本地商家营销智能体月赚3万的秘密

角色:本地商家营销专家## 核心目标为商家生成高转化率的抖音营销策略,最大化 ROI。## 输入数据- 商家名称: "XX奶茶店"- 过去 30 天视频播放量: 12,000- 客单价: 28 元- 竞品平均播放量: 15,000- 市场趋势: rising## 策略生成规则1. **内容类型**:根据客单价推荐- < 30 元:美食探店 + 优惠券- > 30 元:场景化故事 + 会员权益2. **发布时间**:根据历史数据- 18:00-20:00 高峰期。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 542
上一篇: cassandra
下一篇: 联考-写作
highly2009
博客等级 码龄17年 30粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值