Kafka学习笔记
kafka是一个分布式的基于发布/订阅模式的消息队列,主要用于大数据实时操作领域。
优点:解耦、缓冲、可恢复性、消峰、异步通信
server.properties
broker.id=0 //唯一标识(整数)
log.dirs=/tmp/kafka-logs //暂存数据路径
log.retention.hours=168 //删除保留数据删除时间(7天)
zookeeper.connect=localhost:8080 //指向zk地址 zk集群地址
(hadoop102:2181、hadoop103:2181、hadoop104:2181)
delete.topic.enable=true //删除topic功能使用

集群:
服务器端负载均衡:

客户端负载均衡:(zookeeper)
紫色为zk
在这里插入图片描述

消息系统:
在这里插入图片描述
kafka架构:
在这里插入图片描述

在这里插入图片描述
kafka成员组成结构:
Producer:消息生产者,向kafka broker发消息的客户端
Consumer:消息消费者,向kafka broker拿取消息的客户端
Topic:一个队列,主题
Consumer Group(CG):实现topic消息的广播和单播的手段,一个topic可以有多个CG
Broker:一个kafka服务器就是一个broker,一个集群由多个broker组成,一个broker可以容纳多个topic
Partition(分区):为了实现扩展性,一个非常大的topic可以分布到多个broker上,一个topic可以分为多个partition,每个partition是一个有序队列,partition中每个消息都会被分配一个有序id(offset偏移量)。kafka只能保证按一个partition中的顺序将消息发给consumer,不保证一个topic的整体顺序。
Offset(偏移量):kafka存储文件都是按照offset.kafka命名,用offset方便查找。

kafka如何增加消费能力:增加分区(一个分区对应一个消费者)
消费者利用消费者组来消费,一个或几个consumer在一个下消费者组里
linux 启动kafka:
bin/kafka-server-start.sh config/server.properties
bin/kafka-server-start.sh -daemons config/server.properties(后台执行不打印日志)

kafka写入流程
高吞吐量
顺写日志
零复制

分段日志:Segment(保证kafka高吞吐, 通过偏移量查询数据可直接在.log文件精确定位哪个文件)
预读(read ahead 把相邻的数据也读出来,是查询一块区域),后写(write behind)
kafka生产过程分析:
写入方式:producer采用推(push)模式将消息发布到broker,每条消息都被追加(append)到分区中,属于顺序写入磁盘(顺序的比随机的写入内存效率高,保障kafka吞吐率)
如果10个消费者,那么拷贝次数是10+1次(可以证明kafka零复制)
在这里插入图片描述

分区(Partition):
消息发送时都被发送到一个topic,本质就是一个目录,而topic是由一些PartitionLogs(分区日志)组成:
在这里插入图片描述

分区原因:
①方便在集群中扩展,每个topic有多个分区组成,所以整个集群可以存任意大小数据。
②提高并发,因为可以分区为单位读写。

分区原则:
①指定了分区,直接使用
②未指定分区但指定key,通过key的value进行hash出一个分区
③分区和key都没有指定,使用轮询选出一个分区

查找逻辑:
如offset偏移量为:12,则寻找对应的分区文件,如大于0010小于0020,最后找到0010文件,然后用偏移量12-文件名10,得到位置是第二个位置,这时用索引查找第二个位置在哪。
0000.index针对分区的索引(文件格式,1 0,2 5,3 9)表示第一个元素从0开始,第二个元素从5开始。
0000.log存储数据的分区
副本(replication):
一个partition可能会有多个replication(对应server.properties)配置中的default.replication.facotr=N)。没有replication的情况下,一旦broker宕机,所有patition的数据都不可以被消费,同时producer不能将数据存于上面的patition。用了replication后,一个patition可能会有多个replication,这时需要在某些replication之间选一个leader,producer和consumer只与这个leader交互,其他的replication作为follower从leader中复制数据。
写入流程:
kafka生成数据时的应答机制(ACK)
取值为0:生产者发送完数据,不关心数据是否到达kafka,直接发送下一条数据,这样做效率高,但是数据丢失的可能性大,
取值为1:生产者发送数据,需要等待Leader应答,如果应答完成继续发送数据,这种模式不关心follower是否接收成功,性能相对慢一点儿,相对保证数据安全,但数据保存到Leader成功后,Leader宕机,follwer没来得及获取数据,会导致数据丢失情况。
取值为-1(all):生产者发送数据,需要所有副本(Leader+follower)的应答,这种方式数据最安全,但是性能比较差。
生产数据:
注:DQ双端队列(当Sender失败时,将失败数据放回DQ然后重新获取,这样能保证不从头开始获取数据,提高性能保证执行顺序)

在这里插入图片描述

kafka数据保存

在这里插入图片描述

HW:High WaterMark
LEO:Log End Offset
木桶理论:(能存多少水要看最短的板子的高度)

在这里插入图片描述

在这里插入图片描述

存储策略(两种):
基于时间:log.retention.hours=168
基于大小:log.retention.bytes=1073741824(1g)
kafka去重的做法,手动commit,offset不保存到zk,保存到redis中(set类型)
消费方式:
消费者采用pull(拉)模式从broker中读取数据,因为push(推)模式很难适应消费速率不同的消费者,因为消息发送频率由broker决定。
kafka和Flume比较
flume:
适合多个生产者
适合下游数据消费者不多
适合数据安全性不高的
kafka:
适合数据下游消费众多的
适合数据安全比较高的操作,支持副本(replication)
常用的模型是:
线上数据–》flume–》kafka–》flume(根据情景增删流程)–》HDFS
公司数据采集用基层架构:两层 flume、kafka
在这里插入图片描述

为什么kafka可以实现高吞吐
零拷贝
顺写日志(顺序写入)
预读(读取数据时将前后相邻的数据也读出来),
后写(写文件做io时先写入磁盘缓存,到一定大小时系统将io磁盘一次性写很多进去),
分段日志(数据文件分段存储,前面的数据超过168小时=7天就删除)
批处理(双端队列每个分区增加一批数据,批量发送)
压缩(传递byte数组,传输快占比小)默认是关闭的,可以配置开启
kafka偏移量offset存放位置
①早期存放zk中,缺点是频繁更新offset会增加zk负担,zk主要承担协调调度工作。
②0.9版本后偏移量放在kafka cluster集群中,(这时zk会生成 topic(_consumer_offset)默认是50个分区,放到kafka集群中)
③自定义存放,如可以存放在redis中,用set类型保证唯一性
kafka用什么方式消费数据(拉、推)?
poll拉(速率问题)
如何保证不丢失或重复消费
生产者(不丢数据):
①同步发送数据
②ACK应答机制ack=-1(all)但效率会慢一些
消费者(防止重复消费):
自己维护offset避免重复消费(低级api)
kafka元数据存放位置
zk(/controller,/cluster,/consumer,/broker)
为什么要用kafka,直接用flume直接存放在hdfs上可不可以
Flume只是传输框架,不能存放数据(这样需要获取几天前的数据flume做不到)
Flume丢失数据,因为没有副本,断电/关闭数据丢失
消费者处理麻烦,如果添加消费者会有影响其他消费者
kafka用的版本
2.11_0.11.0.2 (2.11是前面开发工具版本,0.11是kafka版本)
kafka如何保证不同订阅源获取相同的一份内容
HW,LEO(高水位,偏移量)木桶理论
在这里插入图片描述

kafka中leader的选举机制
zk中的/controller(集群控制器,临时节点)有关系,如有三台机器去连接zk,按照连接顺序判定。通过watch监听器,监听这个节点,一旦leader挂掉,其他服务器抢夺leader,谁先占用谁就是leader。kafka和zk的leader选举有点小区别,要分清,要分清,要分清。
kafka消费速度
增加分区和消费者
注:kafka-topics.sh工具也是我们用来创建topic、查看topic详情的工具。增加分区的命令(kafka-topics --zookeeper hadoop004:2181 --alter --topic flink-test-04 --partitions 3)
增加拉取数据的大小
增加批处理的大小
kafka分区是什么
Leader
Follwer
Replication
分区导致的一些问题(有序、分区号问题)等
kafka原理,isr中什么情况下brokerid会消失
ISR指的是同步副本。在定义ISR时,它是一组与领导者同步的消息副本。
副本down掉,
网络阻塞、网络不通畅等
Lag(落后),落后太多
flume和kafka有序吗
flume有序(Queue)
kafka同一个分区有序,kafka不保证不同分区的有序
kafka如何保证负载均衡
由于领导者的主要角色是执行分区所有读写请求任务,追随者被动复制领导者。在领导者失败或宕机时,其中一个跟随者会接管领导者的角色,整个过程保证服务器的负载均衡。
如果副本长时间不在ISR中,这意味着什么
这就意味着跟随者不能向领导者收集数据那样快速的获取数据。
kafka和Flume之间的区别是什么
工具类型:
kafka是面向多个生产者和消费者的通用工具。
Flume是特定应用程序的专属工具。
复制功能:
kafka复制事件。
Flume不复制事件。
Kafka是分布式流处理平台吗,用来做了什么
是一个流处理平台,作用如下:
轻松推送记录
存储大量记录,不会出现存储问题。
kafka你的项目中做了什么
在两个系统中传输数据,用来构建实时的消息流管道。
kafka构建一个流处理平台,可以对数据快速做出反应。
传统的消息传递方法
排队:消费者池可以从服务器读取消息并且每条消息转到其中一个消息的方法。
发布-订阅:在发布-订阅中,消息被广播给所有消费者。
kafka比较rabbitMQ
功能:
kafka:分布式、持久的高度可用的,分享和复制数据
rabbitmq:中没有这些功能
响应速度:
kafka:每秒100000条消息
mq:每秒20000条消息
kafka比较传统消息队列
数据保留:
传统数据队列:通常从队列末尾处理完后删除消息。
kafka:消息使用后依然存在,默认是168小时
基础逻辑:
传统队列系统不允许基于类似消息或事件处理逻辑。
Kafka允许基于类似消息或事件处理逻辑。
kafka做集群的好处
克服收集大量数据和分析收集数据的挑战,我们需要一个消息队列系统。
只需存储/发送事件以进行实时处理,就可以跟踪Web活动。
通过这一点,我们可以发出警报并报告操作指标。
此外,我们可以将数据转换为标准格式。
此外,它允许对主题的流数据进行连续处理。
由于它的广泛使用,它秒杀了竞品,如ActiveMQ,RabbitMQ等。
如何调整kafka获得最佳性能
①调整生产者
②kafka代理调优
③调整消费者
kafka核心业务
添加和删除Kafka主题
如何修改Kafka主题
如何关机
在Kafka集群之间镜像数据
找到消费者的位置
扩展您的Kafka群集
自动迁移数据
退出服务器
数据中心
系统工具
Kafka迁移工具:它有助于将代理从一个版本迁移到另一个版本。
Mirror Maker:Mirror Maker工具有助于将一个Kafka集群的镜像提供给另一个。
消费者检查:对于指定的主题集和消费者组,它显示主题,分区,所有者。
Kafka提供的保证是什么
答:生产者向特定主题分区发送的消息的顺序相同。
此外,消费者实例按照它们存储在日志中的顺序查看记录。
此外,即使不丢失任何提交给日志的记录,我们也可以容忍最多N-1个服务器故障。

Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐