kafka 理论知识

1 首先要了解kafka是什么

Kafka是一个分布式的消息订阅系统

1.1  kafka存储消息的过程

消息被持久化到一个topic中,topic是按照“主题名-分区”存储的,一个topic可以分为多个partition,在parition(分区)内的每条消息都有一个有序的id号,这个id号被称为偏移(offset),记录消息的消息位置**

1.2  partition 不能不了解的知识

Partition是Kafka中数据分布的基本单位,里面的数据是储存在硬盘中的,追加式的,通过将数据分散到多个Partition上,多个partition可以并行处理数据,所以可以处理相当量的数据,可以实现数据的并行处理和负载均衡。同一个 Consumer Group 中,只有一个 Consumer 实例可消费某个 Partition 的消息; 每个Topic可以根据预期的数据量和处理需求设置适当数量的Partition

虽然分区机制可以提高系统的整体吞吐量,但它并不是为了实现负载均衡而设计的。相反,Kafka 更关注的是数据的持久性、可用性和容错能力

请注意,Partition的数量一旦确定后,一般情况下是不能直接更改的。因为更改Partition数量可能会影响数据的分布和处理,所以在设计Topic时需要仔细考虑预期的数据量、吞吐量以及系统的伸缩性需求。

1.3 partition和replica之间的暧昧关系

具体来说,Kafka 通过将主题(topic)分为多个分区(partition),并将每个分区复制到多个节点上来实现高可用性和扩展性。每个分区都有一个主节点(leader)和多个副本节点(replica)。主节点负责处理来自生产者的消息和消费者的读取请求,而副本节点则用于备份数据并提供冗余。如果主节点失效,Kafka 会自动选举一个副本节点作为新的主节点,以保持服务的连续性。**

这种设计确保了高可用性和数据冗余,但并不是所有节点都直接参与消息的处理。

2 kafka的相关名词

1.producer:
  消息生产者,发布消息到 kafka 集群的终端或服务。
2.broker:
  kafka 集群中包含的服务器。
3.topic:
  每条发布到 kafka 集群的消息属于的类别,即 kafka 是面向 topic 的。
4.partition:
  partition 是物理上的概念,每个 topic 包含一个或多个 partition。kafka 分配的单位是 partition。
5.consumer:
  从 kafka 集群中消费消息的终端或服务。
6.Consumer group:
  high-level consumer API 中,每个 consumer 都属于一个 consumer group,每条消息只能被 consumer group 中的一个 Consumer 消费,但可以被多个 consumer group 消费。
7.replica:
  partition 的副本,保障 partition 的高可用。
8.leader:
  replica 中的一个角色, producer 和 consumer 只跟 leader 交互。
9.follower:
  replica 中的一个角色,从 leader 中复制数据。
10.controller:
  kafka 集群中的其中一个服务器,用来进行 leader election 以及 各种 failover。
12.zookeeper:
  kafka 通过 zookeeper 来存储集群的 meta 信息

2.1 kafka的工作流程 

3 不能不知道的主角zk

在 Kafka 中,ZooKeeper(简称为ZK)并不用来直接存储消息数据,而是用于协调和管理 Kafka 集群的元数据和状态信息。ZooKeeper 在 Kafka 中扮演以下几个角色:

1. 保存 Kafka 集群的元数据:ZooKeeper 存储了关于 Kafka 集群的元数据,包括主题(topics)、分区(partitions)、副本(replicas)等信息。这些元数据描述了 Kafka 集群的整体结构和配置。
2. 管理消费者组的偏移量(offset):ZooKeeper 用于存储和管理消费者组的偏移量信息。消费者组在消费消息时,会将当前消费的偏移量保存在 ZooKeeper 中,以便后续继续消费。

3. 选举 Kafka 控制器(Controller):Kafka 集群中的一个节点会被选举为控制器,负责管理分区的分配和副本的重新分配。ZooKeeper 用于协调和选举控制器节点。
4. 监测集群成员状态:ZooKeeper 监测和报告 Kafka 集群中各个节点的状态,例如节点的上线和下线。

3.1 生产者往zk注册消息

消息发送者会在Zookeeper中注册相关信息,在Zookeeper中获取Broker以及Topic的信息,然后将消息数据写入到指定的Kafka Topic中。

3.2 消费者往zk注册

Kafka依托于Zookeeper来注册Broker的信息,消费者会在Zookeeper注册消费者信息,同时也是通过Zookeeper来发现Kafka中的Broker列表。

发送者和消费者都会在Zookeeper中注册信息,通过Zookeeper来获取要存储或者消费的Kafka Broker列表。

Kafka的消息数据都是存储在Topic中的,Kafka会将Topic的元数据(信息)存储在Zookeeper中,维护Topic和Broker的关系,只存储元数据不存储消息数据

3.3 你知道的元数据

(topic信息;topic有哪些分区,哪些副本,分别在哪台broker上,哪个是leader;consumer信息及读取消息后提交的偏移量数据等),元数据存储在zk中

3.4 被需要的zk

Kafka使用Zookeeper的原因:Kafka中会有若干个Broker,Broker需要通过分布式协调服务来维护,统一管理Broker的配置信息,客户端和消费者直接从配置中心获取Broker的信息,为Broker与Broker之间的请求建立安全协议,而这种分布式协调服务中Zookeeper是最可靠的

每个broker只存储消息体,不存储元数据

4、非常关键(副本)

高可用,数据持久化,数据备份

4.1 kafka副本的选举策略

其中:kafka分区中所有的副本统称未AR;副本leader的选举策略为:在isr中存活为前提,按照AR中排在前面的优先,例如AR[1,0,2] ,isr [1,0,2],那么leader就会按照1,0,2的顺序进行轮询

4.2 分区和副本数据一致性

  1. 分区领导者选举:每个分区都有一个 leader 和多个副本(replica)。在一个分区中,只有 leader 能够处理读写请求,而副本只负责复制数据以实现高可用性。当某个分区的 leader 发生故障或宕机时,Kafka 需要在副本中选择一个新的 leader。这个选举过程由 ZooKeeper 协助完成。ZooKeeper 负责跟踪每个分区的 leader 和副本状态,并在 leader 不可用时发起新的选举。

  2. ISR(In-Sync Replicas)机制:Kafka 引入了 ISR 机制来确保 leader 和 leader 副本之间的数据一致性。ISR 是指与 leader 处于同步状态的副本集合。在正常情况下,leader 和 ISR 中的副本具有相同的数据。当生产者发送消息时,只有写入 leader 并复制到 ISR 中的副本才被视为成功。这确保了所有可用的副本在给定时间点都具有相同的数据。

  3. 消息确认机制:生产者发送消息后,可以选择等待确认或异步发送。如果设置为等待确认,生产者将在消息成功写入 leader 和 ISR 中的所有副本之后,收到来自 Kafka 的确认。这种方式保证了消息的可靠性。

  4. 数据同步:Kafka 使用副本同步机制来保持 leader 和 follower 副本之间的数据一致性。当消息被写入 leader 时,leader 将消息发送给其 ISR 中的所有副本。副本收到消息后会回复确认,leader 在收到 ISR 中的大多数副本确认后才认为消息成功提交,然后将确认发送给生产者。这确保了所有 ISR 中的副本在给定时间点具有相同的数据。

5、producer发布消息

producer 采用 push 模式将消息发布到 broker,每条消息都被 append 到 patition 中,属于顺序写磁盘(顺序写磁盘效率比随机写内存要高,保障 kafka 吞吐率)。

5.1 是如何发布消息到分区的

producer 发送消息到 broker 时,会根据分区算法选择将其存储到哪一个 partition。

其路由机制为:

1. 指定了 patition,则直接使用;

2. 未指定 patition 但指定 key,通过对 key 的 value 进行hash 选出一个 patition

3. patition 和 key 都未指定,使用轮询选出一个 patition

5.2 流程说明:

 

1. producer 先从 zookeeper 的 "/brokers/.../state" 节点找到该 partition 的 leader

2. producer 将消息发送给该 leader

3. leader 将消息写入本地 log

4. followers 从 leader pull 消息,写入本地 log 后 leader 发送 ACK

5. leader 收到所有 ISR 中的 replica 的 ACK 后,增加 HW(high watermark,最后 commit 的 offset) 并向 producer 发送 ACK

5.3 发送消息topic分类

Producer即生产者,向Kafka集群发送消息,在发送消息之前,会对消息进行分类,即Topic,两个producer发送了分类为topic1的消息,另外一个发送了topic2的消息。 Topic即主题,通过对消息指定主题可以将消息分类,消费者可以只关注自己需要的Topic中的消息 Consumer即消费者,消费者通过与kafka集群建立长连接的方式,不断地从集群中拉取消息,然后可以对这些消息进行处理。 从上图中就可以看出同一个Topic下的消费者和生产者的数量并不是对应的

6 消费者消费消息

在消费者消费消息时,kafka使用offset来记录当前消费的位置 在kafka的设计中,可以有多个不同的group来同时消费同一个topic下的消息,有两个不同的group同时消费,他们的的消费的记录位置offset各不相同,不互相干扰。 对于一个group而言,消费者的数量不应该多余分区的数量,因为在一个group中,每个分区至多只能绑定到一个消费者上,即一个消费者可以消费多个分区,一个分区只能给一个消费者消费 因此,若一个group中的消费者数量大于分区数量的话,多余的消费者将不会收到任何消息。

7、broker存储消息周期分类

Kafka中的消息保留策略是通过配置参数进行配置的。一种常见的配置是使用时间保留策略,即设置一个保留时间,超过该时间的消息将被删除。另一种常见的策略是基于消息的大小来设置保留策略,即设置一个最大的消息保留容量,一旦超过这个容量,旧的消息将被删除。

因此,即使消息被消费完,它们可能在Kafka集群中保留一段时间,直到达到保留策略所定义的条件。这样可以确保消息在需要时可以重新消费或重新读取。但请注意,一旦消息达到保留策略的条件,它们将被永久删除,无法再次访问。

无论消息是否被消费,kafka 都会保留所有消息。有两种策略可以删除旧数据:

  1. 基于时间:log.retention.hours=168

  2. 基于大小:log.retention.bytes=1073741824 需要注意的是,因为Kafka读取特定消息的时间复杂度为O(1),即与文件大小无关,所以这里删除过期文件与提高 Kafka 性能无关

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【修正-高斯拉普拉斯滤波器-用于平滑和去噪】基于修正高斯滤波拉普拉斯地震到达时间自动检测研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

unraid docker桥接模式打不开页面,主机模式正常

unraid 80x86版filebrowser,一次掉电后,重启出现权限问题,而且filebrowser的核显驱动不支持amd的VA-API 因为用不上核显驱动,解压缩功能也用不上,官方版本的filebrowser还小巧一些,18m左右 安装的时候总是…

第三章 图论 No.3 flody之多源汇最短路,传递闭包,最小环与倍增

文章目录 多源汇最短路:1125. 牛的旅行传递闭包:343. 排序最小环:344. 观光之旅345. 牛站 flody的四个应用: 多源汇最短路传递闭包找最小环恰好经过k条边的最短路 倍增 多源汇最短路:1125. 牛的旅行 1125. 牛的旅行 …

数学建模—多元线性回归分析

第一部分:回归分析的介绍 定义:回归分析是数据分析中最基础也是最重要的分析工具,绝大多数的数据分析问题,都可以使用回归的思想来解决。回归分析的人数就是,通过研究自变量X和因变量Y的相关关系,尝试去解释…

医疗知识图谱问答 ——Neo4j 基本操作

前言 说到问答机器人,就不得不说一下 ChatGPT 啦。一个预训练的大预言模型,只要是人类范畴内的知识,似乎他回答得都井井有条,从写文章到写代码,再到解决零散琐碎的问题,不光震撼到我们普通人,就…

本地 shell无法连接centos 7 ?

1、首先检查是否安装ssh服务; yum list installed | grep openssh-server# 没有安装尝试安装下 yum install openssh-server 2、检查ssh服务是否开启 systemctl status sshd.service# 未开启,开启下 systemctl start sshd.service # 将sshd 服务添…

MySQL多表查询 (超详细)

一、多表关系 项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种: 一对多&#xff0…

类与对象【中】

欢迎来到Cefler的博客😁 🕌博客主页:那个传说中的man的主页 🏠个人专栏:题目解析 🌎推荐文章:题目大解析2 目录 👉🏻类的默认6个成员函数👉🏻构造…

常用HTML标签大全

🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 文章目录 一.HTML介绍二.HTML使用2.1.…

Ubuntu 23.04 作为系统盘的体验和使用感受

1.为啥主系统装了Ubuntu 由于公司发电脑了,我自己也有一台台式电脑,然后也想去折腾一下Ubuntu,就把自己的笔记本装成Ubuntu系统了, 我使用的是23.04的桌面版,带图形化界面的。我准备换回Windows 11了(因为…

64 # 实现一个 http-server

准备工作 上一节实现了通过 commander 的配置获取到用户的参数,下面完成借用 promise 写成类的方法一节没有完成的任务,实现一个 http-server,https://www.npmjs.com/package/http-server,http-server 是一个简单的零配置命令行静…

pycharm打开terminal报错

Pycharm打开终端报错如何解决?估计是终端启动conda不顺利,需要重新设置路径。参考以下文章的做法即可。 Windows下Pycharm中Terminal无法进入conda环境和Python Console 不能使用 给pycharm中Terminal 添加新的shell,才可以使用conda环境 W…

HDFS中的Federation联邦机制

HDFS中的Federation联邦机制 当前HDFS体系架构--简介局限性 联邦Federation架构简介好处配置示例 当前HDFS体系架构–简介 当前的HDFS结构有两个主要的层: 命名空间(namespace) 由文件,块和目录组成的统一抽象的目录树结构。由n…

2配置篇:基础功能配置

前言 在上一章节中,我们学习了 NestJS CLI 的用法,得到了一套基础的项目工程。最开始做项目对比的时候也提到过,NestJS 作为一款自定义程度较高的框架,CLI 直接提供的基础功能虽然并不完善,但同时也为开发者提供了非常多的内置或配套的功能例如高速缓存、日志拦截、过滤器…

SocialFi 的开发中如何利用 NFTScan API 获取 NFT 数据

SocialFi 作为社交媒体与 Web3 的创新融合,致力于构建更加开放去中心化的社交平台。它赋能用户拥有数据控制权、实现内容价值,并通过代币经济建立起激励与治理机制,这正是 Web3 社交的独特魅力所在。SocialFi 为我们描绘了一个更加用户驱动、…

回顾 OWASP 机器学习十大风险

日复一日,越来越多的机器学习 (ML) 模型正在开发中。机器学习模型用于查找训练数据中的模式,可以产生令人印象深刻的检测和分类能力。机器学习已经为人工智能的许多领域提供了动力,包括情感分析、图像分类、面部检测、威胁情报等。 数十亿美…

《零基础入门学习Python》第076讲:GUI的终极选择:Tkinter13

这节课我们来学习 Tkinter 的布局管理器,那什么是布局管理器呢?说白了,就是用于管理你的组件如何排列。Tkinter 提供了 3 大布局管理器:pack、grid 和 place。 pack 是按添加顺序排列组件grid 是按行/列形式排列组件place 则允许…

秋招算法备战第37天 | 738.单调递增的数字、968.监控二叉树、贪心算法总结

738. 单调递增的数字 - 力扣(LeetCode) 这个问题是关于找到一个小于或等于给定数字n的最大单调递增数字。 我们可以将数字n转换为字符数组,然后从左到右扫描,寻找第一个违反单调递增条件的位置。一旦找到这样的位置,…

uni-app:实现列表单选功能

效果图&#xff1a; 核心解析&#xff1a; 一、 <view class"item_all" v-for"(item, index) in info" :key"index"><view classposition parameter-info text-over :classitem.checked?"checked_parameter":""…

在java中操作redis_Data

1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 2.配置Redis数据源 redis:host: ${sky.redis.host}port: ${sky.redis.port}password: ${sk…