Kafka入门-Broker以及文件存储机制

Kafka Broker

Broker实际上就是kafka实例,每一个节点都是独立的Kafka服务器。

Zookeeper中存储的Kafka信息

在这里插入图片描述

节点的服役以及退役

服役

首先要重新建立一台全新的服务器105,并且在服务器中安装JDK、Zookeeper、以及Kafka。配置好基础的信息之后,再将节点加入到kafka集群之中。如果是直接拷贝配置好的主机一定要先修改主机的ip地址以及主机名,那么一定要移除kafka的broker.id并且要删除kafka安装目录下的datas以及logs下的所有文件,不然复制的主机和被复制的主机会产生冲突。

rm -rf datas/ logs/

将节点加入到kafka集群之中,只需要在105机器中的kafka安装目录下执行启动命令

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

启动之后,kafka就会将自己的broker.id注册到zookeeper中,这样就加入了kafka集群。此时虽然加入了集群,但是并没有跟101、102、103之间同步数据,相当于没有起到作用。此时需要执行负载均衡操作,让105能够和其他三台主机一起共同工作。

首先在安装目录下创建一个新文件(直接操作101主机即可)

vim topics-to-move.json
{"topics":[{"topic":"first"}],"version":1
}

执行生成负载均衡计划命令,为0,1,2,3生成负载均衡计划,系统会生产一个负载均衡计划

bin/kafka-reassign-partitions.sh --bootstrap-server 192.168.27.101:9092 --topics-to-move-json-file topics-to-move.json --broker-list "0,1,2,3" --generate

查看计划如果满足要求,那么复制计划,并新建一个文件将复制的计划粘贴到文件中

vim increase-replication-factor.json

执行副本存储计划

bin/kafka-reassign-partitions.sh --bootstrap-server 192.168.27.101:9092 --reassignment-json-file increase-replication-factor.json --execute

验证副本执行计划

bin/kafka-reassign-partitions.sh --bootstrap-server 192.168.27.101:9092 --reassignment-json-file increase-replication-factor.json --verify

此时105主机就承担了一部分的副本存储压力,此时才正式服役。

退役旧节点

退役一台节点时,直接再执行一次负载均衡计划,比如退役105主机,105的broker.id=3

首先创建文件

vim topics-to-move.json
{"topics":[{"topic":"first"}],"version":1
}

执行生成负载均衡计划命令,只为0,1,2生成负载均衡计划,系统会生产一个负载均衡计划

bin/kafka-reassign-partitions.sh --bootstrap-server 192.168.27.101:9092 --topics-to-move-json-file topics-to-move.json --broker-list "0,1,2" --generate

查看生成的计划,如果满足要求,那么复制计划,并将复制的计划粘贴到文件increase-replication-factor.json中

vim increase-replication-factor.json

执行副本存储计划

bin/kafka-reassign-partitions.sh --bootstrap-server 192.168.27.101:9092 --reassignment-json-file increase-replication-factor.json --execute

验证副本执行计划

bin/kafka-reassign-partitions.sh --bootstrap-server 192.168.27.101:9092 --reassignment-json-file increase-replication-factor.json --verify

此时105主机就可以直接停止进行退役。

副本

Kafka使用副本来提高数据可靠性,kafka默认使用一个副本,但是在生产环境中一般配置两个,保证数据可靠性。副本不是越多越好,会增加磁盘存储空间,增加网络中的数据传输,降低效率。

Kafka副本中分为Leader和Follower,Kafka生产者只会把数据发往Leader,然后Follower主动找Leader同步数据。

Kafka分区中的所有副本统称为AR(Assigned Repllicas)

AR=ISR+OSR

ISR:能够和Leader保持同步的Follower集合,ISR包含Leader本身,如果Follower长时间未向Leader发送通信请求或者同步数据,那么该Follower就会被踢出ISR。该时间阈值由replica.lag.time.max.ms参数设定,默认30s,Leader发生故障之后就会从ISR中选举新的Leader。

OSR:表示在Follower与Leader同步时,延迟过多的副本。

Leader的选举流程

在这里插入图片描述

如图所示,Leader的选举由AR中的顺序以及是否在ISR存活决定。

Follower故障处理

LEO:每个副本的最后一个offset,LEO其实就是最新的offset + 1。

HW:所有副本中最小的LEO

实际上HW就是记录一个消息的偏移量,在这个消息之前的所有消息是Leader以及所有正常的Follower都有的消息。

在这里插入图片描述

当Followers故障时:

  1. Followers会被临时踢出ISR
  2. 这个期间Leeder和Follower会继续接收数据
  3. 当Follower恢复之后,Follower会读取本地磁盘记录的上次HW,并且将文件高于HW的部分截取掉,然后从HW开始向Leader进行同步
  4. 当重新恢复的Follower的LEO大于等于该Partiton的HW时,就代表Follower已经基本同步了Leader的数据,可以重新加入ISR
Leader故障处理

故障处理也跟LEO、HW相关

当Leader故障时:

  1. 首先将Leader踢出ISR队列,并从ISR队列选出一个新的Leader
  2. 为了保证数据在各个副本中一致(数据可能会丢失或者重复),其余的Follower各自将高于HW的部分截掉,然后从新的Leader处同步数据。
分区副本分配

Kafka会为尽量均匀的分配副本在节点上,增强数据的安全性、可靠性。但是我们可以跟之前服役和退役一样,来手动设置分区副本的分配。

正常情况下,Kafka会自动把LeaderPartition均匀分散在各个机器上,来保证每台机器的读写吞吐量都是均匀的,但是如果因为某些Broker宕机,会导致Leader Partition过于集中在其他少部分几台的Brokers上。导致其他机器请求读写压力过高。而宕机的Leader重启之后就成了Follower Partition,读写请求很低,造成集群负载不均衡

文件存储机制

Topic是逻辑上的概念,而Partiton是物理上的概念,每个Partition对应一个log文件,该log文件中存储的是Producer生产的数据。Producer生产的数据会不断的追加到log文件末端,为防止log文件过大导致数据定位效率低下,因此Kafka采取了分片索引机制,将每个Partition分为多个Segment。每个Segment包括,“.index"偏移量索引文件、”.log"日志文件和".timeindex"时间戳索引文件等文件,这些文件位于一个以topic名称+分区序号为命名规则的文件夹下。

在这里插入图片描述

在这里插入图片描述

如果需要查看文件内容,那么可以通过kafka的命令进行查看。

[root@centos101 first-0]# kafka-run-class.sh kafka.tools.DumpLogSegments --files ./00000000000000000000.index
Dumping ./00000000000000000000.index
offset: 0 position: 0

index为稀疏索引,大约每往log文件写入4kb数据,会往index文件写入一条索引。参数log.index.interval.bytes默认为4kb

index文件中保存的offset为相对offset,这样能确保offset的值所占空间不会过大,因此能将offset的值控制在固定大小

Kafka文件清除策略

Kafka默认的日志保存时间为7天,可以调整以下参数修改保存时间

  1. log.retention.hour (最低优先级)小时,默认七天
  2. log.retention.minutes 分钟
  3. log.retention.ms (最高优先级)毫秒
  4. log.retention.check.interval.ms 负责设置检查周期,隔一段时间检测是否过期,默认5分钟

日志保存时间和检查周期要进行搭配配置,不然检查周期过长就起不到效果。

Kafka提供的日志清理策略log.cleanup.policy有两种:delete以及compact两种

Delete
  1. 基于时间:默认开启,以segment中所有记录的最大时间戳作为该文件的过期时间戳,也就是segment中最晚过期的记录过期,才会清除这个segment
  2. 基于大小:默认关闭,超过设置的所有日志总大小,删除最早的segment。log.retention.bytes,默认为-1,表示无穷大
Compact

compact日志压缩:对于相同的key的不同value值,只保留最后一个版本。开启该策略只需修改log.cleanup.policy = compact.

在这里插入图片描述

Kafka高效读写数据

  • Kafka本身是分布式集群,采用分区技术,并行度高

  • 读数据采用稀疏索引,可以快速定位要消费的数据

  • 顺序写磁盘,写入log文件时是一直追加到文件的末端,使用顺序写,减少了大量磁头寻址的时间

  • 页缓存+零拷贝技术

在这里插入图片描述

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

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

相关文章

dexcap升级版之DexWild——面向户外环境的灵巧手交互策略:人类和机器人演示协同训练(人类直接带上动捕手套采集数据)

前言 截止到25年6.6日,在没动我司『七月在线』南京、武汉团队的机器的前提下,长沙这边所需的前几个开发设备都已到齐——机械臂、宇树g1 edu、VR、吊架 ​长沙团队必须尽快追上南京步伐 加速前进 如上篇文章所说的, 为尽快 让近期新招的新同…

【基于阿里云搭建数据仓库(离线)】使用UDTF时出现报错“FlatEventUDTF cannot be resolved”

目录 问题: 可能的原因有: 解决方法: 问题: 已经将包含第三方依赖的jar包上传到dataworks,并且成功注册函数,但是还是报错:“FlatEventUDTF cannot be resolved”,如下&#xff1a…

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +

【LC实战派】小智固件编译

这篇写给立创吴总,是节前答应他配合git代码的说明;也给所有对小智感兴趣的小伙伴。 请多提意见,让这份文档更有价值 - 第一当然是拉取源码 - git clone https://github.com/78/xiaozhi-esp32.git 完成后,先查看固件中实际的…

有没有 MariaDB 5.5.56 对应 MySQL CONNECTION_CONTROL 插件

有没有 MariaDB 对应 MySQL CONNECTION_CONTROL 插件 背景 写这篇文章的目的是因为昨晚半夜突然被call起来,有一套系统的mysql数据库启动失败了。尝试了重启服务器也不行。让我协助排查一下问题出在哪。 分析过程 一开始拿到服务器IP地址,就去数据库…

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…

LLMs 系列科普文(11)

目前我们已经介绍了大语言模型训练的两个主要阶段。第一阶段被称为预训练阶段,主要是基于互联网文档进行训练。当你用互联网文档训练一个语言模型时,得到的就是所谓的 base 模型,它本质上就是一个互联网文档模拟器,我们发现这是个…

深度学习环境配置指南:基于Anaconda与PyCharm的全流程操作

一、环境搭建前的准备 1. 查看基础环境位置 conda env list 操作说明:通过该命令确认Anaconda默认环境(base)所在磁盘路径(如D盘),后续操作需跳转至该磁盘根目录。 二、创建与激活独立虚拟环境 1. 创…

【2D与3D SLAM中的扫描匹配算法全面解析】

引言 扫描匹配(Scan Matching)是同步定位与地图构建(SLAM)系统中的核心组件,它通过对齐连续的传感器观测数据来估计机器人的运动。本文将深入探讨2D和3D SLAM中的各种扫描匹配算法,包括数学原理、实现细节以及实际应用中的性能对比,特别关注…

力扣160.相交链表

题目描述 难度:简单 示例 思路 使用双指针 使用指针分别指向两个不同的链表进行比较 解题方法 1.首先进行非空判断 2.初始化指针分别指向两个链表 3.遍历链表 while (pA ! pB): 当pA和pB不相等时,继续循环。如果pA和pB相等,说明找…

本地项目push到git

cd /home/user/project git init 添加远程仓库地址 git remote add origin https://github.com/user/repo.git 创建并切换到新分支 git checkout -b swift 添加文件到暂存区 git add . git commit -m “swift训练评测” git push -u origin swift —force #首次 git push …

uni-app学习笔记二十九--数据缓存

uni.setStorageSync(KEY,DATA) 将 data 存储在本地缓存中指定的 key 中&#xff0c;如果有多个key相同&#xff0c;下面的会覆盖掉原上面的该 key 对应的内容&#xff0c;这是一个同步接口。数据可以是字符串&#xff0c;可以是数组。 <script setup>uni.setStorageSyn…

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…

NFC碰碰卡发视频源码搭建与写卡功能开发实践

在信息快速传播的时代&#xff0c;便捷的数据交互方式成为用户的迫切需求。“碰一碰发视频” 结合写卡功能&#xff0c;为视频分享提供了新颖高效的解决方案&#xff0c;在社交娱乐、商业推广等场景中展现出巨大潜力。本文将详细介绍碰一碰发视频源码搭建以及写卡功能开发的全过…

详解K8s 1.33原地扩缩容功能:原理、实践、局限与发展

你是否有过这样的经历&#xff1f; 精心配置了 Kubernetes 的 Pod&#xff0c;设置了“刚刚好”的 CPU 和内存&#xff08;至少你当时是这么想的&#xff09;&#xff0c;结果应用不是资源紧张喘不过气&#xff0c;就是像“双十一”抢购一样疯狂抢占资源。 过去&#xff0c;唯…

IOS 打包账号发布上传和IOS Xcode证书配置

xcode下载 https://developer.apple.com/download/all/ App发布 https://appstoreconnect.apple.com/ https://appstoreconnect.apple.com/teams/83ba877c-af24-4fa5-aaf2-e9b9b6066e82/apps/6473148620/testflight/groups/eb983352-b2e2-4c29-bbb7-071bf7287795 https://devel…

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…

Significant Location Change

一、Significant Location Change是什么 “Significant Location Change&#xff08;重大位置变化&#xff09;” 是苹果 iOS 系统中一项用于在应用未主动运行时&#xff0c;监测设备位置显著变化的功能。它主要通过基站、Wi-Fi 网络等信号来判断设备是否发生了有意义的位置移…