Kafka框架学习笔记 尚硅谷

Kafka框架学习笔记 尚硅谷因为本人不是大数据方向的 但是公司一个项目用到了kafka 我就学习一下 如果笔记有什么不对的地方 敬请谅解文章目录Kafka框架学习笔记 尚硅谷因为本人不是大数据方向的 但是公司一个项目用到了kafka 我就学习一下 如果笔记有什么不对的地方 敬请谅解Kafka概述定义传统消息队列的应用场景使用消息队列的好处消息队列的Kafka基础框架构Kafka快速入门安装操作命令命令行控制台生产者消费者测试数据日志分离Kafka高级工作流程文件存储机制Kafka生产者分区策略生产
摘要由CSDN通过智能技术生成

Kafka框架学习笔记 尚硅谷

因为本人不是大数据方向的 但是公司一个项目用到了kafka 我就学习一下 如果笔记有什么不对的地方 敬请谅解

Kafka概述

定义

在这里插入图片描述

传统消息队列的应用场景

在这里插入图片描述

使用消息队列的好处

1)解耦
允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。
2)可恢复性
系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所
以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。
3)缓冲
有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致
的情况。
4)灵活性 & 峰值处理能力(削峰)
在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。
如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列
能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。
5)异步通信
很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户
把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要
的时候再去处理它们。

消息队列的

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

kafka是属于发布订阅模式中消费者主动拉去topic队列里的消息 优点是消费者读取速度自己控制 缺点是 每次都要去询问是否有消息,没有消息时 就会导致资源浪费

Kafka基础框架构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
消费组个数和分区数个数相等时 效率最高

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

Kafka快速入门

安装

jar包下载地址http://kafka.apache.org/downloads.html
在这里插入图片描述

tar -zxvf kafka_2.12-2.6.0.tgz

修改配置文件
新建一个目录
在这里插入图片描述

在这里插入图片描述
操作以下内容

#broker 的全局唯一编号,不能重复
broker.id=0
#删除 topic 功能使能
delete.topic.enable=true
#处理网络请求的线程数量
num.network.threads=3
#用来处理磁盘 IO 的现成数量
num.io.threads=8
#发送套接字的缓冲区大小
socket.send.buffer.bytes=102400
#接收套接字的缓冲区大小
socket.receive.buffer.bytes=102400
#请求套接字的缓冲区大小
socket.request.max.bytes=104857600
#kafka 运行日志存放的路径
log.dirs=/root/kafka_2.12-2.6.0/logs
#topic 在当前 broker 上的分区个数
num.partitions=1
#用来恢复和清理 data 下数据的线程数量
num.recovery.threads.per.data.dir=1
#segment 文件保留的最长时间,超时将被删除
log.retention.hours=168
#配置连接 Zookeeper 集群地址
zookeeper.connect=192.168.2.108:2181
在这里插入图片描述
5)配置环境变量
在这里插入图片描述
先启动 zookeeper
在这里插入图片描述
在这里插入图片描述
启动kafka 后台启动 以守护进程启动

./kafka-server-start.sh -daemon  ../config/server.properties

在这里插入图片描述
可以写一个集群启动脚本
在这里插入图片描述

操作命令

创建 主题topic

 ./kafka-topics.sh  --create  --zookeeper localhost:2181 --topic firstTopic --partitions 2 --replication-factor 1

注意 副本数不能大于主机数 但是可以有多个分区
在这里插入图片描述
查看主题

./kafka-topics.sh  --list --zookeeper localhost:2181

在这里插入图片描述
去查看 刚在建立的logs目录
在这里插入图片描述
first-1或者-0是分区号
server.log 是日志

删除日志
./bin/kafka-topics.sh --delete --zookeeper localhost:2181 --topic firstTopic
在这里插入图片描述
测试是否删除成功 新建一个同名的 3个分区的主题
在这里插入图片描述
查看主题详情

./bin/kafka-topics.sh --describe --topic firstTopic --zookeeper localhost:2181

在这里插入图片描述

命令行控制台生产者消费者测试

设置生产者

./bin/kafka-console-producer.sh --topic firstTopic --broker-list localhost:9092 

在这里插入图片描述
设置消费者
老方法 将offset存在zookeeper 我的 2.12版本好像直接用不了了在这里插入图片描述

在这里插入图片描述
消息默认保存七天 七天之后 --form-begining就取不到以前的消息了

新方法 offset存在本地

./bin/kafka-console-consumer.sh --topic firstTopic --bootstrap-server localhost:9092

生产者发消息
在这里插入图片描述
消费者取消息
在这里插入图片描述
本地offset 如果是kafka集群 将会轮循储存消费者offset 如 kafka1存 __consumer_offsets-1 __consumer_offsets-3 __consumer_offsets-5
kafka2存 __consumer_offsets-2 __consumer_offsets-4 __consumer_offsets-6
在这里插入图片描述

数据日志分离

关闭kafka 会有点慢
在这里插入图片描述
删除logs目录
在这里插入图片描述
zookeeper里也要删除kafka的信息
除了 zookeeper 其他都是kafka的信息
在这里插入图片描述
暴力一点 先停止zk

 ./zkServer.sh stop

删除version-2
在这里插入图片描述
启动zk

./bin/zkServer.sh star
./bin/zkCli.sh

没有数据了

在这里插入图片描述
创建data目录
在这里插入图片描述

修改存放地址
在这里插入图片描述
启动kafka
在这里插入图片描述
还没创建主题
在这里插入图片描述
创建主题

bin/kafka-topics.sh --zookeeper localhost:2181 --topic forst --partitions 2 --replication-factor 1 --create

在这里插入图片描述
日志和数据分离
在这里插入图片描述
logs.dir 其实是数据路径
在这里插入图片描述
测试一下 数据看不清楚 因为被序列化了
在这里插入图片描述

Kafka高级

工作流程

在这里插入图片描述

Kafka 中消息是以 topic 进行分类的,生产者生产消息,消费者消费消息,都是面向 topic
的。
topic 是逻辑上的概念,而 partition 是物理上的概念,每个 partition 对应于一个 log 文
件,该 log 文件中存储的就是 producer 生产的数据。Producer 生产的数据会被不断追加到该
log 文件末端,且每条数据都有自己的 offset。消费者组中的每个消费者,都会实时记录自己
消费到了哪个 offset,以便出错恢复时,从上次的位置继续消费。

文件存储机制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
因为索引中的每个字段大小都一样查找速度快 通过2分查找法查找出文件的偏移量,就可以直接定位.log文件中的位置

Kafka生产者

分区策略

提高负载能力和读写能力
在这里插入图片描述
既没有分区 也没key 就通过轮循的方式 速记生成一个数字 开始轮循
在这里插入图片描述

生产者ISR

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
但是第二种会有问题 当kafka有10台节点 在备份数据时 宕机一个节点 那就没办法发送ack 所以kafak做了优化 (ISR)

ISR(同步副本)
在这里插入图片描述

采用第二种方案之后,设想以下情景:leader 收到数据,所有 follower 都开始同步数据,
但有一个 follower,因为某种故障,迟迟不能与 leader 进行同步,那 leader 就要一直等下去,
直到它完成同步,才能发送 ack。这个问题怎么解决呢?
Leader 维护了一个动态的 in-sync replica set (ISR),意为和 leader 保持同步的 follower 集
合。当 ISR 中的 follower 完成数据的同步之后,leader 就会给 follower 发送 ack。如果 follower
长 时 间 未 向 leader 同 步 数 据 , 则 该 follower 将 被 踢 出 ISR , 该 时 间 阈 值 由replica.lag.time.max.ms 参数设定。Leader 发生故障之后,就会从 ISR 中选举新的 leader。
选新的leader 老版本是通过通信时间和同步数据条数大小 两个标准进行选择 新版本只有同步数据条数作为标准

生产者ACK机制

在这里插入图片描述
在这里插入图片描述
当leader写完数据 啷个follow也备份完了 在发送ack之前 leader 挂了 将会重选一个leader 原理的follow已经有 hello了 但是 producer会再发一次

数据一致性问题

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

Exactly Once (精准 一次性)语义

在这里插入图片描述

Kafka消费者

分区分配策略

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
优点 每个消费者消费的消息的差值对多为1 缺点 该模式将整个消费者组里的所有消费者订阅的主题当做一个整体 会导致消息分配错误 如果消费者A订阅的T1 消费之B订阅了T2 轮循模式吧生产者当做一个整体 轮循发给生产者 这样 消费者A可能收到T2的消息 消费者B可能收到T1的消息
所以有一个使用前提 当前消费者组里的消费者订阅的主题都是一样的
(2)Range在这里插入图片描述
在这里插入图片描述
7/3 除不尽 就给第一个3个消息 7-3/2 另外两个 分两个消息
缺点是消费者的消息数量不对等问题

消费者数量发生变化的时候 会重新出发分区分配策略

消费者offset的存储

在这里插入图片描述


结论 消费者offset 通过消费者组+主题+分区 存储
在这里插入图片描述

Kafka 高效读写数据(了解)

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

Kafka事务

Kafka 从 0.11 版本开始引入了事务支持。事务可以保证 Kafka 在 Exactly Once 语义的基
础上,生产和消费可以跨分区和会话,要么全部成功,要么全部失败。

通过transactionID 确定了PID的唯一性 保证了幂等性 从而保证了精准一次性
在这里插入图片描述

Kafka API

ProducerAPI

消息发送流程

在这里插入图片描述

在这里插入图片描述

API普通生产者

修改 kafka的配置文件server.properties

# 不然java api无法访问
listeners=PLAINTEXT://{
   你的主机名}:9092

新建模块kafkademo
pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.luyi</groupId>
    <artifactId>kafka-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    
  • 6
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值