kafka教程

Kafka 中,Producer采用push模型,而Consumer采用pull模型。

Topic

Topic(主题)是消息的逻辑分类或通道。它是Kafka中用于组织和存储消息的基本单元。一个Topic可以被看作是一个消息发布的地方,生产者将消息发布到一个特定的Topic,而消费者则订阅一个或多个Topic以接收消息。

Consumer group

Consumer Group(消费者组): 为了扩展消费者并实现并行处理,多个消费者可以组成一个消费者组。每个分区只能由消费者组内的一个消费者处理,这样可以确保消息在每个分区内的有序处理。

每个消费者组都有一个组id!同一个消费组者的消费者可以消费同一topic下不同分区的数据,但是不会组内多个消费者消费同一分区的数据。
在这里插入图片描述
在实际的应用中,建议消费者组的consumer的数量与partition的数量一致

Partition

每个topic可以有多个分区,每个分区中的消息是有序的。
生产者将消息发布到topic时,Kafka会根据一定的策略将消息分配到不同的分区。
消费者可以订阅整个topic,也可以选择订阅topic的特定partition。
每个topic可以划分为一个或多个partition,分区是Kafka中的基本存储单元。
分区允许水平扩展,每个分区可以独立地分布在不同的机器上,提高了Kafka的伸缩性和性能。

那么当Producer将消息发送给broker,

分区的原因

  • 提高吞吐量: 分区允许Kafka集群并行处理消息。每个分区都是一个独立的有序队列,多个分区可以同时进行读写操作,使得整个系统能够更有效地处理大量的消息。这种并行性是Kafka实现高吞吐量的关键。

  • 实现水平扩展: 通过将消息分布在多个分区上,Kafka可以轻松地在集群中添加更多的Broker来实现水平扩展。每个Broker只需要负责一部分分区,从而有效地分担了负载。这种扩展性使得Kafka能够适应不断增长的数据量和流量。

  • 容错性: 每个分区的数据都可以有多个副本(Replica)在集群的不同Broker上存储。如果某个Broker或分区发生故障,其他副本依然可用。这种冗余机制提高了系统的容错性,确保了数据的可用性和持久性。

  • 有序性: 分区内的消息是有序的,而分区间的消息不做有序保证。这使得Kafka在保持消息的有序性的同时,可以在不同的分区上实现并行处理,使系统更加灵活。

  • 提供灵活的消息处理模型: 分区允许消费者以消费者组的形式协同处理消息。每个分区只能被同一个消费者

Parition的副本replice

为了提高可靠性和容错性,每个分区可以有多个副本(replica)。这些副本分布在不同的Broker上,确保即使其中一个Broker失效,仍然有其他副本可用。

在这里插入图片描述

Broker

Broker是一个独立的Kafka服务器实例,负责处理消息的生产和消费。

  • 存储: Broker存储了消息的持久化副本,以确保消息的持久性。每个Topic的分区被分布在不同的Broker上,以实现分布式存储和水平扩展。

  • Leader和Follower: 对于每个Topic的分区,一个Broker被选举为Leader,其余的为Follower。Leader负责处理读写请求,而Follower则同步Leader的数据,以提供容错和冗余。

  • 消息的生产和消费: 生产者将消息发送到Topic,而消费者从Topic中消费消息。Broker协调这两个过程,确保消息被正确地传递给订阅了相应Topic的消费者。

  • Broker负责存储和管理所有Topic的Partition数据,并协调Partition之间的数据同步和复制。

Producer

将消息发送给broker的过程:

  1. 选择 Topic: 生产者选择一个或多个目标 Topic。

  2. 选择分区: 如果生产者选择将消息发送到特定的分区,它可以指定分区,否则,Kafka 会使用一种策略(例如轮询或哈希)来决定将消息发送到哪个分区。

  3. 构造消息: 生产者构造要发送的消息,这可以是文本、二进制数据等。

  4. 发送消息: 生产者将消息发送给 Kafka 集群中的 Broker。生产者需要知道 Broker 的地址(通常至少提供一个 Broker 的地址),然后将消息发送给指定的 Topic 和分区。

Producer选择发送的分区过程

  1. partition在写入的时候可以指定需要写入的partition,如果有指定,则写入对应的partition。
  2. 如果没有指定partition,但是设置了数据的key,则会根据key的值hash出一个partition。
  3. 如果既没指定partition,又没有设置key,则会轮询选出一个partition。

Kafka将数据顺序存储在磁盘上

Kafka既将数据写入磁盘,也在内存中进行一些操作。Kafka的设计目标之一是提供持久性和高吞吐量。因此,它会将消息写入磁盘以确保数据的持久性,这使得即使在Broker重启后,数据仍然可用。

具体来说,Kafka使用了一种称为写入日志(write-ahead log)的机制。当消息被生产者发布到一个Topic时,Kafka首先将消息追加到该Topic的日志文件中。这些日志文件通常位于磁盘上。写入日志的方式使得消息的添加成为原子操作,并且消息按顺序写入。

同时,Kafka还利用内存来提高性能。在Broker内,Kafka会维护一个称为Page Cache的内存区域,用于缓存最近使用的数据块。这使得在读取数据时,可以在内存中快速获取,提高读取性能。

日志段

Partition在服务器上的表现形式就是一个一个的文件夹存储在磁盘上,每个partition的文件夹下面会有多组segment文件,每个segment文件中又包含.index文件、.log文件、.timeindex文件三个文件。

每个日志段包含三个主要文件:

.log 文件: 这个文件是实际存储消息的地方。消息以追加的方式写入这个文件,并且按顺序存储。这种追加写入的方式使得写入操作是高效的,同时也有助于提高读取性能。

.index 文件: 这个文件是索引文件,用于快速定位消息。它包含消息的物理偏移(offset)和消息的逻辑偏移(相对于分区的偏移)之间的映射。索引文件的存在使得 Kafka 能够更有效地执行消息的检索操作,而不必扫描整个日志文件。

.timeindex 文件: 这个文件是时间索引文件,在某些版本的 Kafka 中引入。它提供了消息时间戳和物理偏移之间的映射,以支持按时间范围检索消息。

每个分区由多个这样的日志段组成。当一个日志段达到一定的大小或者时间限制时,Kafka会创建一个新的日志段。这种机制有助于管理磁盘空间,同时也有利于日志的压缩和维护。

查找消息的时候是怎么利用segment+offset配合查找的呢?假如现在需要查找一个offset为368801的message是什么样的过程呢?我们先看看下面的图:

在这里插入图片描述

1、 先找到offset的368801message所在的segment文件(利用二分法查找),这里找到的就是在第二个segment文件。
  2、 打开找到的segment中的.index文件(也就是368796.index文件,该文件起始偏移量为368796+1,我们要查找的offset为368801的message在该index内的偏移量为368796+5=368801,所以这里要查找的相对offset为5)。由于该文件采用的是稀疏索引的方式存储着相对offset及对应message物理偏移量的关系,所以直接找相对offset为5的索引找不到,这里同样利用二分法查找相对offset小于或者等于指定的相对offset的索引条目中最大的那个相对offset,所以找到的是相对offset为4的这个索引。
  3、 根据找到的相对offset为4的索引确定message存储的物理偏移位置为256。打开数据文件,从位置为256的那个地方开始顺序扫描直到找到offset为368801的那条Message。
  
这套机制是建立在offset为有序的基础上,利用segment+有序offset+稀疏索引+二分查找+顺序查找等多种手段来高效的查找数据!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Axios设置token到请求头的三种方式

1、为什么要携带token? 用户登录时,后端会返回一个token,并且保存到浏览器的localstorage中,可以根据localstorage中的token判断用户是否登录,登录后才有权限访问相关的页面,所以当发送请求时,都要携带to…

ubuntu彻底卸载cuda 重新安装cuda

sudo apt-get --purge remove "*cublas*" "*cufft*" "*curand*" \"*cusolver*" "*cusparse*" "*npp*" "*nvjpeg*" "cuda*" "nsight*" cuda10以上 cd /usr/local/cuda-xx.x/bin/ s…

fast.ai 机器学习笔记(四)

机器学习 1:第 11 课 原文:medium.com/hiromi_suenaga/machine-learning-1-lesson-11-7564c3c18bbb 译者:飞龙 协议:CC BY-NC-SA 4.0 来自机器学习课程的个人笔记。随着我继续复习课程以“真正”理解它,这些笔记将继续…

idea自带的HttpClient使用

1. 全局变量配置 {"local":{"baseUrl": "http://localhost:9001/"},"test": {"baseUrl": "http://localhost:9002/"} }2. 登录并将结果设置到全局变量 PostMapping("/login")public JSONObject login(H…

华为机考入门python3--(9)牛客9-提取不重复的整数

分类:列表 知识点: 从右往左遍历每一个字符 my_str[::-1] 题目来自【牛客】 def reverse_unique(n): # 将输入的整数转换为字符串,这样可以从右向左遍历每一位 str_n str(n) # 创建一个空列表来保存不重复的数字 unique_digits []…

【C++】STL之string 超详解

目录 1.string概述 2.string使用 1.构造初始化 2.成员函数 1.迭代器 2.容量操作 1.size和length 返回字符串长度 2.resize 调整字符串大小 3.capacity 获得字符串容量 4.reserve 调整容量 5.clear 清除 6.empty 判空 3.string插入、追加 、拼接 1.运算…

16 亚稳态原理和解决方案

1. 亚稳态原理 亚稳态是指触发器无法在某个规定的时间段内到达一个可以确认的状态。在同步系统中,输入总是与时钟同步,因此寄存器的setup time和hold time是满足的,一般情况下是不会发生亚稳态情况的。在异步信号采集中,由于异步…

寒假9-蓝桥杯训练

//轨道炮 #include<iostream> using namespace std; #include<algorithm> int logs[100010]; int main() {int n;cin >> n;for (int i 1;i < n;i){cin >> logs[i];}sort(logs 1, logs n 1);int ans 1000000000;for (int i 2;i < n;i){if (…

【数学建模】【2024年】【第40届】【MCM/ICM】【F题 减少非法野生动物贸易】【解题思路】

一、题目 &#xff08;一&#xff09; 赛题原文 2024 ICM Problem F: Reducing Illegal Wildlife Trade Illegal wildlife trade negatively impacts our environment and threatens global biodiversity. It is estimated to involve up to 26.5 billion US dollars per y…

分布式系统架构介绍

1、为什么需要分布式架构&#xff1f; 增大系统容量&#xff1a;单台系统的性能瓶颈&#xff0c;多台机器才能应对大规模的应用场景&#xff0c;所以就需要我们的应用支撑平台具备分布式架构。 加强系统的可用&#xff1a;为了满足业务的SLA要求&#xff0c;需要通过分布式架构…

深度学习(13)--PyTorch搭建神经网络进行气温预测

一.搭建神经网络进行气温预测流程详解 1.1.导入所需的工具包 import numpy as np # 矩阵计算 import pandas as pd # 数据读取 import matplotlib.pyplot as plt # 画图处理 import torch # 构建神经网络 import torch.optim as optim # 设置优化器 1.2.读取并处理数据…

第五篇:MySQL常见数据类型

MySQL中的数据类型有很多&#xff0c;主要分为三类:数值类型、字符串类型、日期时间类型 三个表格都在此网盘中&#xff0c;需要者可移步自取&#xff0c;如果觉得有帮助希望点个赞~ MySQL常见数据类型表 数值类型 &#xff08;注&#xff1a;decimal类型举例&#xff0c;如1…

DevOps:CI、CD、CB、CT、CD

目录 一、软件开发流程演化快速回顾 &#xff08;一&#xff09;瀑布模型 &#xff08;二&#xff09;原型模型 &#xff08;三&#xff09;螺旋模型 &#xff08;四&#xff09;增量模型 &#xff08;五&#xff09;敏捷开发 &#xff08;六&#xff09;DevOps 二、走…

【开源】SpringBoot框架开发天沐瑜伽馆管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 瑜伽课程模块2.3 课程预约模块2.4 系统公告模块2.5 课程评价模块2.6 瑜伽器械模块 三、系统设计3.1 实体类设计3.1.1 瑜伽课程3.1.2 瑜伽课程预约3.1.3 系统公告3.1.4 瑜伽课程评价 3.2 数据库设计3.2.…

【Kubernetes】kubectl top pod 异常?

目录 前言一、表象二、解决方法1、导入镜像包2、编辑yaml文件3、解决问题 三、优化改造1.修改配置文件2.检查api-server服务是否正常3.测试验证 总结 前言 各位老铁大家好&#xff0c;好久不见&#xff0c;卑微涛目前从事kubernetes相关容器工作&#xff0c;感兴趣的小伙伴相互…

【Kubernetes】在k8s1.24及以上版本基于containerd容器运行时测试pod从harbor拉取镜像

基于containerd容器运行时测试pod从harbor拉取镜像 1、安装高版本containerd2、安装docker3、登录harbor上传镜像4、从harbor拉取镜像 1、安装高版本containerd 集群中各个节点都要操作 yum remove containerd.io -y yum install containerd.io-1.6.22* -y cd /etc/containe…

《UE5_C++多人TPS完整教程》学习笔记2 ——《P3 多人游戏概念(Multiplayer Concept)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P3 多人游戏概念&#xff08;Multiplayer Concept&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译…

数据结构:并查集讲解

并查集 1.并查集原理2.并查集实现3.并查集应用4.并查集的路径压缩 1.并查集原理 在一些应用问题中&#xff0c;需要将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个单元素集合&#xff0c;然后按一定的规律将归于同一组元素的集合合并。在此过程中…

分享88个鼠标特效,总有一款适合您

分享88个鼠标特效&#xff0c;总有一款适合您 88个鼠标特效下载链接&#xff1a;https://pan.baidu.com/s/1ljcxwgXGpw7baiufUGJjZA?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不…

5G NR 频率计算

5G中引入了频率栅格的概念&#xff0c;也就是小区中心频点和SSB的频域位置不能随意配置&#xff0c;必须满足一定规律&#xff0c;主要目的是为了UE能快速的搜索小区&#xff1b;其中三个最重要的概念是Channel raster 、synchronization raster和pointA。 1、Channel raster …