Kafka导航【Kafka】

这篇具有很好参考价值的文章主要介绍了Kafka导航【Kafka】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

2023-9-4 09:20:52

以下内容源自《【Java】》
仅供学习交流使用

版权

禁止其他平台发布时删除以下此话
本文首次发布于CSDN平台
作者是CSDN@日星月云
博客主页是https://blog.csdn.net/qq_51625007
禁止其他平台发布时删除以上此话

推荐

【尚硅谷】Kafka3.x教程(从入门到调优,深入全面)

kafka学习笔记

链接: https://pan.baidu.com/s/19Bcvf1oUwQP1UIJMlEg5Xw
提取码: wkb4

Kafka

第1章 Kafka概述【Kafka】

第2章 Kafka快速入门【Kafka】

第3章 Kafka生产者【Kafka】

第4章 Kafka Broker【Kafka】

第5章 Kafka消费者【Kafka】

第6章 Kafka-Eagle监控【Kafka】

第7章 Kafka-Kraft模式【Kafka】

随堂笔记

一、概述
	1、定义
		1)传统定义
			分布式  发布订阅   消息队列
			发布订阅:分为多种类型 订阅者根据需求 选择性订阅
		2)最新定义
			流平台(存储、计算)
	2、消息队列应用场景
		1)缓存消峰 
		2)解耦
		3)异步通信
	3、两种模式
		1)点对点
			(1)一个生产者 一个消费者 一个topic  会删除数据  不多

		2)发布订阅
			(1)多个生产者  消费者多个  而且相互独立  多个topic 不会删除数据
	4、架构
		1)生产者
			100T数据
		
		2)broker 
			(1)broker  服务器 hadoop102 103 104
			(2)topic 主题  对数据分类
			(3)分区
			(4)可靠性  副本
			(5)leader  follower 
			(6)生产者和消费者 只针对leader操作
		
		
		3)消费者
			(1)消费者和消费者相互独立
			(2)消费者组 (某个分区 只能由一个消费者消费)
		
		
		4)zookeeper
			(1)broker.ids 0 1 2 
			(2)leader 
二、入门
	1、安装
		1)broker.id  必须全局唯一
		2)broker.id、log.dirs zk/kafka
		3)启动停止  先停止kafka  再停zk
		4)脚本
			#!/bin/bash
			
			case $1 in
			"start")
				for i in hadoop102 hadoop103 hadoop104
				do
					ssh $i "绝对路径"
				done
			;;
			"stop")
			
			;;
			esac
	2、常用命令行
		1)主题 kafka-topic.sh 
			(1)--bootstrap-server  hadoop102:9092,hadoop103:9092
			(2)--topic first
			(3)--create 
			(4)--delete
			(5)--alter
			(6)--list
			(7)--describe
			(8)--partitions
			(9)--replication-factor 
	
		2)生产者 kafka-console-producer.sh 
			(1)--bootstrap-server  hadoop102:9092,hadoop103:9092
			(2)--topic first
		
		
		3)消费者 kafka-console-consumer.sh 
			(1)--bootstrap-server  hadoop102:9092,hadoop103:9092
			(2)--topic first
			
三、生产者 
	1、原理
	
	2、异步发送API
		0)配置
			(1)连接  bootstrap-server 
			(2)key value序列化
		
		1)创建生产者
		KafkaProducer<String,String>()
		
		2)发送数据
			send() send(,new Callback)
		
		3)关闭资源
	3、同步发送
		。。。
		
		send() send(,new Callback).get()
		。。。
	4、分区	
		1)好处
			存储
			
			计算
		2)默认分区规则
			(1)指定分区 按分区走
			(2)key  key的hashcode值%分区数
			(3)没有指定key  没有指定分区   粘性
				第一随机
		3)自定义分区
			定义类 实现partitioner接口 
	5、吞吐量提高
		1)批次大小  16k  32k
		2)linger.ms  0  => 5-100ms
		3)压缩  
		4)缓存大小  32m  => 64m 
	6、可靠性 
		acks  
		0  丢失数据
		1   也可能会丢  传输普通日志
		-1  完全可靠  + 副本大于等于2  isr >=2    => 数据重复
	7、数据重复
		1)幂等性
			<pid, 分区号,序列号>
			默认打开
		
		2)事务
			底层基于幂等性
			
			(1)初始化
			(2)启动
			(3)消费者offset
			(4)提交
			(5)终止
	8、数据有序
		单分区内有序(有条件)
		多分区有序怎么办?
	9、乱序
		1)inflight  =1 
		2)没有幂等性 inflight  =1 
		3)有幂等性
四、broker 
	1、zk存储了哪些信息
		(1)broker.ids
		(2)leader 
		(3)辅助选举  controller 
	2、工作流程
	
	3、服役
		1)准备一台干净服务器 hadoop100
		2)对哪个主题操作 
		3)形成计划
		4)执行计划
		5)验证计划
	
	4、退役
		1)要退役的节点不让存储数据
		2)退出节点
	5、副本 
		1)副本的好处   提高可靠性
		2)生产环境中通常2个  默认1个
		3)有leader follower  leader 
		4)isr 
		5)controller  isr[0  2 3 ] 存活  ar [0  1 2 3]
		6)Leader 挂了 
		7)follower 挂了  
		8)副本分配 默认 
		9)手动副本分配  制定计划  执行计划   验证计划  
		10)leader partition的负载均衡  10%
		11)手动增加副本因子 
	6、存储机制 
		broker  topic  partition log segment 1g   稀疏索引  4kb 
	7、删除数据
		默认7天   3天  7小时
		两种  删除  压缩 
		删除:
		压缩:
	8、高效读写
		1)集群  采用分区
		2)稀疏索引 
		3)顺序读写 
		4)零拷贝 和页缓存 
五、消费者 
	1、总体流程
	2、消费者组 
	3、按照主题消费
		0)配置信息
			连接
			反序列化
			组id 
			
		1)创建消费者
		2)订阅主题
		
		3)消费数据
	4、按照分区 
	5、消费者组案例
		组id 
	6、分区分配策略  再平衡
		7个分区  3个消费者
		
		range
		0  1 2 x
		3 4 
		5 6 
		
		
		roundrobin
		轮询
		0  3  6
		1  4
		2  5
	
		
		
		粘性  2 2 3 
		0  3 4
		2  6
		1 5 
	7、offset
		1)默认存储在系统主题
		2)自动提交  5s   默认 
		3)手动提交  同步  异步  
		4)指定offset消费  seek ()
		5)按照时间消费  
		6)漏消费  重复消费
	8、事务 
		生产端  =》 集群
		集群 =》 消费者
		消费者 =》 框架
	9、数据积压
		1、增加分区 增加消费者个数
		2、生产  =》 集群  4个参数
		3、消费端  两个参数  50m   500条
		
六、生产调优 硬件选择
	1、100万日活 * 没人每天产生日志100条  =  1亿条 (中型公司)
		处理日志速度  1亿条 / (24 * 3600s ) = 1150条/s 
		1条日志 (0.5k - 2k 1k)
		1150条 * 1k /s  =  1m/s 
		
		高峰值 (中午小高峰 8 -12 ): 1m/s  * 20倍 =  20m/s  -40m/s 
		
	2、购买多少台服务器
		服务器台数= 2 * (生产者峰值生产速率 * 副本数 / 100) + 1 
				   =  2  * (20m/s * 2 /100) + 1
				   = 3 台
					
	3、磁盘选择
		kafka 按照顺序读写   机械硬盘和固态硬盘 顺序读写速度差不多
		
		1亿条  *  1k = 100g 
		100g * 2个副本 * 3天 / 0.7 = 1t
		建议三台服务器总的磁盘大小  大于1t 
		
	4、内存选择
		kafka  内存 = 堆内存(kafka 内部配置) + 页缓存(服务器内存)
		1)堆内存 10 -15g
		2)页缓存  segment (1g )  (分区数Leader(10) * 1g * 25%)/ 3 = 1g
		一台服务器 10g + 1g 
		
	5、CPU选择	
		32cpu
	6、网络选择
	
	测试:
	1、batch.size=16384 linger.ms=0      9.76 MB/sec
	2、batch.size=32768 linger.ms=0     9.76 MB/sec
	3、batch.size=4096 linger.ms=0      3.81 MB/sec
	4、batch.size=4096 linger.ms=50	  3.83 MB/sec
	5、batch.size=4096 linger.ms=50 compression.type=snappy   3.77 MB/sec
	6、batch.size=4096 linger.ms=50 compression.type=zstd     5.68 MB/sec
	7、batch.size=4096 linger.ms=50 compression.type=gzip      5.90 MB/sec
	8、batch.size=4096 linger.ms=50 compression.type=lz4       3.72 MB/sec
	9、batch.size=4096 linger.ms=50 buffer.memory=67108864   3.76 MB/sec

	
	消费者  一次处理500条   81.2066m/s 
	消费者  一次处理2000条  138.0992m/s 
	消费者  一次处理2000条  fetch.max.bytes=104857600   145.2033m/s

		

第三章 生产者

3.4生产者分区

3.4.1.分区好处

Kafka导航【Kafka】,Kafka,kafka,分布式

3.4.2 生产者发送消息的分区策略

3.4.3 自定义分区器

3.5 生产经验——生产者如何提高吞吐量

可以修改以下4个参数:

  1. batch.size:批次大小,默认16k (也就是一个batch满了16kb就发送出去).如果 batch 太小,会导致频繁网络请求,吞吐量下降;
    如果batch太大,会导致一条消息需要等待很久才能被发送出去,而且会让内存缓冲区有很大压力,过多数据缓冲在内存里.一般在实际生产环境,这个batch的值可以增大一些来提升吞吐量。
  2. linger.ms:等待时间,默认值是0ms(意思就是消息立即被发送,不延迟,来一条发送一条),但是这是不对的。可以将其修改为5-100ms.假如linger.ms设置为为50ms,消息被发送出去后会进入一个batch,如果50ms内,这个batch满了16kb就会被发送出去。但是如果50ms时间到,batch没满,那么也必须把消息发送出去了,不能让消息的发送延迟时间太长,也避免给内存造成过大的一个压力。
  3. compression.type默认是none,不压缩,可以使用lz4,snappy等压缩,压缩之后可以减小数据量,提升吞吐量,但是会加大producer端的cpu开销。
  4. RecordAccumulator(buffer.memory):设置发送消息的缓冲区,默认值是33554432(32MB).如果发送消息出去的速度小于写入消息进去的速度,就会导致缓冲区写满,此时生产消息就会阻塞住,所以说这里就应该多做一些压测,尽可能保证说这块缓冲区不会被写满导致生产行为被阻塞住.缓冲区大小,可以将其修改为64m.

3.6 生产经验——数据可靠性

1.ack 应答原理

Kafka导航【Kafka】,Kafka,kafka,分布式
思考:Leader收到数据,所有Follower都开始同步数据,但有一个Follower,因为某种故障,迟迟不能与Leader进行同步,那这个问题怎么解决呢?
Leader维护了一个动态的in-sync replica set(ISR),意为和Leader保持同步的Follower+Leader集合(leader:0,isr:0,1,2)。如果Follower长时间未向Leader发送通信请求或同步数据,则该Follower将被踢出ISR。该时间阈值由replica.lag.time.max.ms参数设定,默认30s。例如2超时,(leader:0, isr:0,1)。这样就不用等长期联系不上或者已经故障的节点。

数据可靠性分析(以下2种情况和ack=1的效果是一样的,仍然有丢数的风险(leader:0,isr:0)):

分区副本设置为1个
ISR里应答的最小副本数量(min.insync.replicas,默认为1)设置为1.设置acks=all,且副本数为3,极端情况下,如果ISR中只有leader一个副本时,此时producer发送的数据只要leader同步成功就会返回响应.
因此:

数据完全可靠条件 = ACK级别设置为-1 + 分区副本大于等于2 + ISR里应答的最小副本数量大于等于2

可靠性总结:

  1. acks=0,生产者发送过来数据就不管了,可靠性差,效率高;
  2. acks=1,生产者发送过来数据Leader应答,可靠性中等,效率中等;
  3. acks=-1,生产者发送过来数据Leader和ISR队列里面所有Follwer应答,可靠性高,效率低;

在生产环境中,acks=0很少使用;acks=1,一般用于传输普通日志,允许丢个别数据;acks=-1,一般用于传输和钱相关的数据,对可靠性要求比较高的场景。

3.7 生产经验——数据去重

3.7.1 数据传递语义

数据传递语义:

至少一次(At Least Once)= ACK级别设置为-1 + 分区副本大于等于2 + ISR里应答的最小副本数量大于等于2
最多一次(At Most Once)= ACK级别设置为0
总结:

  • At Least Once可以保证数据不丢失,但是不能保证数据不重复;
  • At Most Once可以保证数据不重复,但是不能保证数据不丢失。
  • 精确一次(Exactly Once):对于一些非常重要的信息,比如和钱相关的数据,要求数据既不能重复也不丢失。Kafka 0.11版本以后,引入了一项重大特性:幂等性和事务。

3.7.2 幂等性

1)幂等性原理

幂等性就是指Producer不论向Broker发送多少次重复数据,Broker端都只会持久化一条,保证了不重复。

精确一次(Exactly Once)=幂等性+至少一次( ack=-1+分区副本数>=2+ISR最小副本数量>=2)。

重复数据的判断标准:具有<PID, Partition,SeqNumber>相同主键的消息提交时,Broker只会持久化一条。其中PID是Kafka每次重启都会分配一个新的;Partition表示分区号;Sequence Number是单调自增的。

所以幂等性只能保证的是在单分区单会话内不重复

2) 如何使用幂等性

开启参数 enable.idempotence 默认为 true,false 关闭。

3.7.3生产者事务

1)Kafka 事务原理

Kafka导航【Kafka】,Kafka,kafka,分布式

生产经验——数据有序

生产经验——数据乱序

生产经验——分区的分配以及再平衡
Range 以及再平衡
RoundRobin 以及再平衡
Sticky 以及再平衡

Kafka总体

如何提升吞吐量

如何提升吞吐量?

  1. 提升生产吞吐量
    (1)buffer.memory:发送消息的缓冲区大小,默认值是32m,可以增加到64m。
    (2)batch.size:默认是16k。如果batch设置太小,会导致频繁网络请求,吞吐量下降;如果batch太大,会导致一条消息需要等待很久才能被发送出去,增加网络延时。
    (3)linger.ms,这个值默认是0,意思就是消息必须立即被发送。一般设置一个5-100毫秒。如果linger.ms设置的太小,会导致频繁网络请求,吞吐量下降;如果linger.ms太长,会导致一条消息需要等待很久才能被发送出去,增加网络延时。
    (4)compression.type:默认是none,不压缩,但是也可以使用lz4压缩,效率还是不错的,压缩之后可以减小数据量,提升吞吐量,但是会加大producer端的CPU开销。
  2. 增加分区
  3. 消费者提高吞吐量
    (1)调整fetch.max.bytes大小,默认是50m。
    (2)调整max.poll.records大小,默认是500条。
  4. 增加下游消费者处理能力

数据精准一次

  1. 生产者角度
    (1) acks设置为-1 (acks=-1)。
    (2)幂等性(enable.idempotence = true) + 事务 。
  2. broker服务端角度
    (1)分区副本大于等于2 (–replication-factor 2)。
    (2) ISR里应答的最小副本数量大于等于2 (min.insync.replicas = 2)。
  3. 消费者
    (1) 事务 + 手动提交offset (enable.auto.commit = false)。
    (2) 消费者输出的目的地必须支持事务(MySQL、Kafka)。

最后

2023-9-7 18:06:13

我们都有光明的未来

祝大家考研上岸
祝大家工作顺利
祝大家得偿所愿
祝大家如愿以偿
点赞收藏关注哦文章来源地址https://www.toymoban.com/news/detail-861699.html

到了这里,关于Kafka导航【Kafka】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 分布式 - 消息队列Kafka:Kafka生产者架构和配置参数

    生产者发送消息流程参考图1: 先从创建一个ProducerRecord对象开始,其中需要包含目标主题和要发送的内容。另外,还可以指定键、分区、时间戳或标头。在发送ProducerRecord对象时,生产者需要先把键和值对象序列化成字节数组,这样才能在网络上传输。 接下来,如果没有显式

    2024年02月13日
    浏览(25)
  • 分布式 - 消息队列Kafka:Kafka消费者的分区分配策略

    Kafka 消费者负载均衡策略? Kafka 消费者分区分配策略? 1. 环境准备 创建主题 test 有5个分区,准备 3 个消费者并进行消费,观察消费分配情况。然后再停止其中一个消费者,再次观察消费分配情况。 ① 创建主题 test,该主题有5个分区,2个副本: ② 创建3个消费者CustomConsu

    2024年02月13日
    浏览(24)
  • 分布式 - 消息队列Kafka:Kafka生产者发送消息的方式

    不管是把Kafka作为消息队列、消息总线还是数据存储平台,总是需要一个可以往Kafka写入数据的生产者、一个可以从Kafka读取数据的消费者,或者一个兼具两种角色的应用程序。 Kafka 生产者是指使用 Apache Kafka 消息系统的应用程序,它们负责将消息发送到 Kafka 集群中的一个或多

    2024年02月13日
    浏览(21)
  • 分布式 - 消息队列Kafka:Kafka消费者和消费者组

    1. Kafka 消费者是什么? 消费者负责订阅Kafka中的主题,并且从订阅的主题上拉取消息。与其他一些消息中间件不同的是:在Kafka的消费理念中还有一层消费组的概念,每个消费者都有一个对应的消费组。当消息发布到主题后,只会被投递给订阅它的每个消费组中的一个消费者

    2024年02月13日
    浏览(24)
  • 分布式 - 消息队列Kafka:Kafka消费者分区再均衡(Rebalance)

    01. Kafka 消费者分区再均衡是什么? 消费者群组里的消费者共享主题分区的所有权。当一个新消费者加入群组时,它将开始读取一部分原本由其他消费者读取的消息。当一个消费者被关闭或发生崩溃时,它将离开群组,原本由它读取的分区将由群组里的其他消费者读取。 分区

    2024年02月12日
    浏览(19)
  • 分布式 - 消息队列Kafka:Kafka 消费者消费位移的提交方式

    最简单的提交方式是让消费者自动提交偏移量,自动提交 offset 的相关参数: enable.auto.commit:是否开启自动提交 offset 功能,默认为 true; auto.commit.interval.ms:自动提交 offset 的时间间隔,默认为5秒; 如果 enable.auto.commit 被设置为true,那么每过5秒,消费者就会自动提交 poll() 返

    2024年02月12日
    浏览(25)
  • 分布式 - 消息队列Kafka:Kafka 消费者消息消费与参数配置

    01. 创建消费者 在读取消息之前,需要先创建一个KafkaConsumer对象。创建KafkaConsumer对象与创建KafkaProducer对象非常相似——把想要传给消费者的属性放在Properties对象里。 为简单起见,这里只提供4个必要的属性:bootstrap.servers、key.deserializer 和 value.deserializer。 ① bootstrap.servers 指

    2024年02月12日
    浏览(21)
  • 分布式 - 消息队列Kafka:Kafka生产者发送消息的分区策略

    01. Kafka 分区的作用 分区的作用就是提供负载均衡的能力,或者说对数据进行分区的主要原因,就是为了实现系统的高伸缩性。不同的分区能够被放置到不同节点的机器上,而数据的读写操作也都是针对分区这个粒度而进行的,这样每个节点的机器都能独立地执行各自分区的

    2024年02月13日
    浏览(21)
  • 分布式应用之Zookeeper和Kafka

    1.定义 2.特点 3.数据结构 4.选举机制 第一次选举 非第一次选举 5.部署 1.概念 中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。 2.消息队列型 3.Web应用型(代理服务器) 1.为什么需要MQ 2.消息队列作用 3.消息队列模式 ①点对

    2024年02月15日
    浏览(25)
  • 分布式 - 消息队列Kafka:Kafka生产者发送消息的3种方式

    不管是把Kafka作为消息队列、消息总线还是数据存储平台,总是需要一个可以往Kafka写入数据的生产者、一个可以从Kafka读取数据的消费者,或者一个兼具两种角色的应用程序。 Kafka 生产者是指使用 Apache Kafka 消息系统的应用程序,它们负责将消息发送到 Kafka 集群中的一个或多

    2024年02月13日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包