Kafka 入门知识,看这一篇就够了(上)

news2024/11/15 11:06:09

目录

  • 01 初识 Kafka
  • 02 topic & partition
  • 03 Kafka 分布式

最近在学习 Kafka(别问,问就是公司在用 ),将学习过程中的笔记整理出来分享给大家,就当是入入门

提前预览

01 初识 Kafka

Kafka 最早是由 LinkedIn 公司开发的,作为其自身业务消息处理的基础,后 LinkedIn 公司将Kafka 捐赠给 Apache,现在已经成为 Apache 的一个顶级项目了

Kafka 作为一个高吞吐的分布式的消息系统,目前已经被很多公司应用在实际的业务中了,并且与许多数据处理框架相结合,比如 Hadoop,Spark 等

与传统的消息队列相比(RaabitMQ、RocketMQ等)除了异步、消峰、解耦三大经典场景之外,Kafka 有着更多的适用场景:

  1. Kafka 被设计为一个分布式系统,便于向外拓展
  2. Kafka 支持高吞吐量
  3. Kafka 可以将消息持久化到磁盘,因此可以用于批量消费

Kafka 角色

  • 生产者(producer):也叫发布者,负责创建消息
  • 消费者(consumer):也叫订阅者,负责消费(读取)消息
  • Kafka server(broker):producer 和 consumer 都是 Kafka 的 客户端,Kafka 服务端通常被称作 broker

02 topic & partition

Kafka 是发布/订阅模型,消息以 topic 来分类,每一个 topic 都对应一个消息队列,订阅这个 topic 的 consumer 都会能够消费到对应的消息

为了提高吞吐量,实现 topic 的负载均衡,Kafka 在 topic 下又引用了分区(partition)的概念,能够大大提高消费速率

例如某个 topic 下有 n 个队列,那么这个 topic 的并发度就提高 n,同时可以支持 n 个 consumer 并行消费该 topic 中的消息

在这里插入图片描述

对于每一个 topic ,Kafka 会维护其 partition 下的 log,如下图所示

在这里插入图片描述

每一个 patition 都是一个顺序的、不可变的消息队列,并且可以持续地添加。patition 中的消息都被分配了一个唯一的序列号,也叫做偏移量(offset)

这就会导致 Kafka 是没有办法删除消息的,Kafka 会保持所有的消息,无论消息是否被消费,保持到它们过期

实际上 consumer 只是拥有 offset,正常情况当 consumer 消费消息的时候,offset 也线性的的增加,consumer 可以将 offset 重置为更老的一个 offset,重新读取消息

因为每一个 consumer 对应一个 partition,所以不会影响其他 consumer 的操作

PS:topic 是逻辑上的概念,消息真正是存储到 partition 中去的

03 Kafka 分布式

Kafka 一开始就被设计成了分布式的架构,有集群(cluster)的概念

一个 Kafka 服务器被称为 broker,broker 接收 producer 的消息并存入磁盘,consumer 连接 broker 消费消息

若干个 broker 组成一个 cluster,集群内某个 broker 会成为集群控制器(cluster controller),负责管理集群,包括分配分区给 broker,监控 broker 等

在 cluster 中,一个分区由一个 broker 负责,这个 broker 是这个分区中的 leader,当然一个分区可以被复制到多个 broker 上实现冗余

当broker出现故障时还可以将其分区重新分配到其他的broker上,保证高可用性

在这里插入图片描述
Kafka是如何实现数据冗余的呢?

为了实现数据冗余,保证业务的高可用性,Kafka 引入了副本的概念

在 Kafka 集群里,副本有两种角色:

1、对外提供读写服务的称之为 leader;

2、不对外提供读写服务的称之为 follower,follower 会去同步 leader 的数据以此来保证数据一致性

Kafka 会尽量的把 partition 的副本均分在不同的 broker 上,并从中挑选一个作为 leader 副本

在这里插入图片描述
如上图所示:每个 broker 有两个主题,每个主题有两个分区,每个分区有一个副本,分别在不同的 broker 上

只要还存在一个副本,那么 producer 提交的数据就不会丢失,如果某些副本落后于 leader 副本,那么落后的副本就会被移出

如果 leader 副本所在的主机宕机,那么集群就会从剩余的 follower 副本中重新挑选一个副本作为新的 leader 副本,但不是所有的 follower 都有资格去竞选 leader 的(有些数据落后于 leader 太多的 follower 是不能参加竞选的)

为了能够更好地管理副本,Kafka 引入了 ISR——Kafka 动态维护的一组同步副本集合

每个 topic 下的 partition 都有自己的 ISR 列表,ISR 中所有的 follower 都与 leader 保持同步状态,而且 leader 也在 ISR 列表中,只有在自己 ISR 列表中的副本才能参与 leader 竞选

ISR 中的副本是如何保持同步的呢?

在这里插入图片描述
每个 partition 的副本中都会维护三个位移量:

  1. 起始位移:副本中第一条消息的位置
  2. 高水印标记(HW):表示副本最新一条被提交的消息的位置,这个值决定了 consumer 可以读到的消息最大范围,超过 HW 的消息(图中超过5,6)属于未提交消息,consumer 是读取不到的
  3. 日志末端位移(LEO),表示下一条代写入消息的位移,也就是说 LEO 指向的位置是没有消息的,当写入一条消息时 LEO 会加1

leader 和 follower 都具有这三个位移量,partition 的 HW 值就是 leader 的 HW 值,并且 leader 所在的 broker 上还保存了 follwer 的 HW 和 LEO 值

在这里插入图片描述
什么时候更新 LEO 值

我们知道,leader 所在的 broker 上保存了所有 follower 的 HW 和 LEO 值,同时 follower 所在的 broker 也保存了自己的 HW 和 LEO

producer 向 leader 写入数据,那么 leader 的 LEO 就会增加,follower 向 leader 同步数据并写入自己的日志文件时 follower 的 LEO 也会增加

leader 所在的 broker 保存的 follower 的 LEO 值是在 leader 收到 follower 的同步数据请求后和真正发送数据给 follower 之前进行更新的,而且发送同步数据请求的时候 follower 会发送自己的 HW 值,leader 所在的 broker 上保存的 follower 的 LEO 值就是 follower 同步数据是时发送的 HW 值

什么时候更新 HW 值

  • follower

follower 收到数据后需要写入日志里,然后就会更新自己的 LEO 值,更新完之后再去更新自己的 HW 值:leader 发送给 follower 的数据中包含 leader 自己的 HW,foloower 在更新完自己的 LEO 之后会将自己的 LEO 值和 leader 的 HW 值进行比较,取最小值来设置自己的 HW 值

  • leader

leader 更新 HW 有两个场景:

1、producer 写入新的消息后,leader 更新自己的 LEO 并尝试更新 HW

2、leader 从日志中读取了数据并发送给 follower后尝试更新 HW

以上两个场景都是尝试更新,而不是一定更新,因为更新原则是比较 leader 的 LEO 和其保存的所有 follower 的 LEO 值,小的那个就是 leader 的 HW 值

例如初始状态下(leader LEO 和 HW 分别为 0,follower 的 LEO 和 HW 也为0)如果写入了一条消息,那么 leader 的 LEO 进行了更新变成了1,但此时 follower 的 LEO 为 0(因为消息还没同步)比较 leader 的 LEO 和其保存的所有 follower 的 LEO 值,取最小值是 0,所以 leader 的 HW 也是 0,故不需要更新

(上述机制由于有时间差问题导致Follower需要进行两轮拉取才能完成HW的更新,所以会出现数据丢失情况,所以在0.11版本中引入了Leader Epoch机制来解决)

如何知道 leader 和 follower 之间数据不同步?

0.9版本之前是按照消息个数来做的,0.9之后是时间,默认是10秒,如果一个 Follower 落后Leader 的时间持续超过 10 秒则该 Follower 被认为不是同步的

这篇文章主要是Kafka入门,由于Kafka 的知识体系有点庞大,还涉及到了别的概念,后面我会逐步跟大家分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/57389.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python中numpy数组形状和计算

1. numpy数组形状 数组可以理解为是矩阵,所以会涉及几行几列 import numpy as np import randomt1 np.array([[1,2,3],[4,5,6]]) print(t1) print(t1.shape)在这段逻辑里,t1是个数组,输出结果后 (2, 3)表示的就是这个数组是一个2行3列的矩…

计算机系统基础实验——数据的机器级表示(计算浮点数 f 的绝对值[f])

题目要求: 这个函数计算浮点数f的绝对值[f]。如果f是NaN,函数应该简单的返回f。 Unsigned float_abs (unsiged f) { /**************/ return/*******/; } 先分析题目,题目有两个要求: 1.判断f是否是NAN类型,如果是返…

文件管理,给文件名称插入纯数字详细步骤

在日常办公过程中,我们经常会需要对文件名称进行重命名,如何给文件插入纯数字呢?一两个文件还好可以自定义重命名,面对大量文件的时候,怎么在文件名称中插入纯数字呢?一起来看看吧! 第一步&…

这 5 本数据分析书籍,都是经典中的经典

下面要推荐的 5 本数据分析书籍对于数据分析领域而言,经典、经典、还是经典。 强烈建议先收藏,再观看。 《深入浅出数据分析》 数据分析入门第一本。 本书构思跌宕起伏,行文妙趣横生,无论是职场老手,还是业界新人&…

S2SH小区物业管理理系统计算机毕业论文Java项目源码下载

💖💖更多项目资源,最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 计算机毕业设计java毕设之S2SH小区物业系统_哔哩哔哩_bilibili计算机毕业设计java毕设之S2SH小区物业系统共计2条视频,包括&#xff1…

香农-范诺编码(Shannon–Fano Coding)

香农-范诺编码香农-范诺编码简介算法示例香农-范诺编码 简介 香农-范诺编码(Shannon–Fano Coding)是一种基于一组符号集及其出现的或然率(估量或测量所得),从而构建前缀码的技术。 一般过程:符号从最大可…

太强了!GitHub上白嫖的SpringCloud微服务进阶宝典,啃完感觉能吊锤面试官!

自 2014 年起,微服务技术一直火热至今。随着越来越完善的微服务技术栈的发布,以及越来越多的微服务项目实际的落地和上线,使用 Java 技术栈的企业应该都在尝试或者已经落地了各自的微服务项目。同时,通过招聘网站的信息和每次面试…

正确理解线程WAITING状态

正确理解线程WAITING状态 今天来学习下,Java的线程状态,重点讨论下thread.state.WAITING。讨论下线程如何进入此状态,以及它们之间的区别。最后,我们进一步了解java.util.concurrent.locks.LockSupport,它提供了几种用…

【分布式能源的选址与定容】基于非支配排序多目标遗传优化算法求解分布式能源的选址与定容(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

AOP通知获取数据

之前说到了AOP可以对原始方法进行增强,那么AOP是否可以获取到原始方法的数据并对原始方法的数据利用增强方法进行处理呢?我们将从获取参数、获取返回值和获取异常三个方面来研究。 首先,我们可以知道,所有的通知类型都可以获取参数…

微服务框架 SpringCloud微服务架构 10 使用Docker 10.6 容器命令练习

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构10 使用Docker10.6 容器命令练习10.6.1 直接开干10 使用Docker 10.6 容器…

阿里“重推”的Spring+Boot+MVC+CloudAlibaba学习手册,开源下载

Spring框架自诞生以来一直备受开发者青睐,有人亲切的称之为:Spring 全家桶。Spring更是避免了重复造轮子的工作并跟随着互联网行业的发展做出不断的更新,很多研发人员把spring看作心目中最好的Java项目,没有之一。 可以毫不夸张的…

VS Code 扩展开发如何保持用户视觉体验一致

本文介绍如何在 VS Code 插件的 webview 中加载本地的资源文件,并如何使用 VS Code 自身的 UI 来实现用户视觉体验的一致。 背景 最近想做一个 VS Code 的插件用来简便我使用 VS Code 来编辑 Markdown 博客的体验,在设计插件的过程中,因为需…

计算机毕业论文Java项目源码下载S2SH智慧社区管理系统[包运行成功]

💖💖更多项目资源,最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 《基于S2SH实现的智慧社区管理系统》该项目采用技术jsp、strust2、Spring、hibernate、tomcat服务器、mysql数据库 ,项目含有源码、答…

力扣hot100——第6天:32最长有效括号、33搜索旋转排序数组、34在排序数组中查找元素的第一个和最后一个位置

文章目录1.32最长有效括号1.1.题目1.2.解答2.33搜索旋转排序数组2.1.题目2.2.解答3.34在排序数组中查找元素的第一个和最后一个位置【代码随想录已刷】1.32最长有效括号 参考:力扣题目链接;题解1,题解2 1.1.题目 1.2.解答 这道题目官方的题…

FAT12文件系统

简介 FAT12文件系统是指:在磁盘上规定一种特定的存储格式,这种存储格式高效方便,功能强大,因此形成了统一的规定。 基础知识 具体来说FAT12文件系统为1.44M的软盘设计。1.44M的软盘有2880个扇区,一个扇区有512个字节&…

大数据下一代变革之必研究数据湖技术Hudi原理实战双管齐下-后续

文章目录集成Flink编程示例打包运行CDC入湖概述MySQL 启用 binlog初始化MySQL 源数据表准备Jar包依赖flink读取mysql binlog写入kafkaflink读取kafka数据并写入hudi数据湖调优MemoryParallelismCompaction集成Hive集成步骤Flink同步HiveHive Catalog集成Flink 编程示例 本节通…

[附源码]计算机毕业设计springboot右脑开发教育课程管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

微服务框架 SpringCloud微服务架构 10 使用Docker 10.4 容器命令案例1

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构10 使用Docker10.4 容器命令案例110.4.1 直接开干10.4.2 总结10 使用Docke…

03_openstack之项目及用户管理

目录 一、环境准备 二、项目管理 1、项目介绍 2、创建项目 三、用户管理 1、用户介绍 2、创建用户 一、环境准备 部署openstack私有云环境,步骤:02_openstack私有云部署_桂安俊kylinOS的博客-CSDN博客 以下操作均基于上述环境 二、项目管理 1、…