Kafka_04_Topic和日志

Kafka_04_Topic和日志

  • Topic/Partition
    • Topic
    • Partition
  • 日志存储
    • 存储格式
    • 日志清理
      • 删除
      • 压缩

Topic/Partition

Topic/Partition: Kafka中消息管理的基础单位

  1. Topic和Partition并不实际存在(仅逻辑上的概念)

如: Topic和Partition关系

image

// 每个日志文件可对应多个日志分段, 其还可分为索引、日志存储和快照等


Topic

Topic(主题): Kafka中消息归类单位

  1. Topic管理本质: 管理Topic对应的日志存储(文件)
  2. 日志存储随机分步于各个Broker以提搞Topic容灾性
  3. 日志存储数量 = Partition数量 * Replica数量
  4. 存储文件格式: Topic名-Partition名-序列号

// 可通过Kafka自带kafka-topics.sh脚本完成Topic相关管理


Topic名称组成: 大小写字母、数字、点号、连接线、下划线

  1. Topic名称必须含有点号或下划线(metrics命名时会将前者替换为后者)
  2. 不建议使用双下划线作为前缀(其常为内部Topic格式)
  3. 创建Topic的本质(交由控制器异步完成)

// ZooKeeper的/brokers/topics//config/topics/下创建子节点并写入Partition分配方案和配置信息


管理Topic须知:

  1. 创建Topic时Broker需统一是否配置机架信息, 否则会创建失败
  2. Topic创建后仅能增加Partition数量(Partition不能被删除)
  3. Partition数量变化会影响Key的计算(影响消息顺序)

Partition

Partition(分区): 组成Topic的单位(实际存储消息)

  1. Partition可有多个副本(leader和follower), 每个副本对应个日志文件
  2. leader提供读写服务, follower副本仅和leader进行数据同步
  3. leader恢复后重新加入, 则只能为新的follower

优先副本: AR集合中首个副本

  1. 理想情况下优先副本应是Partition的leader
  2. Kafka会确保所有Topic的优先副本在集群中均匀分布
  3. Partition平衡: 通过选举策略使优先副本选举为leader副本

// 优先副本选举的元数据存储于ZooKeeper的/admin/preferred_replica_election


Partition重分配: Partition重新进行合理的分配

  1. 当Partition所处的Broker节点下线, Kafka不会自动进行故障转移
  2. Kafka集群中增加新Broker节点时, 该节仅能分配到新创建的Partition
  3. 本质:部分Partition增加新副本, 并从剩余Partition的副本中拷贝数据
  4. Partition重复配过程中需保证有足够的空间(完成后自动删除原有数据)

// 建议分为多个小批次执行Partition重分配, 并重启预下线的Broker


Partition数量与吞吐量关系:: 限定范围内增加Partition数量可增加吞吐量

  1. 若无休止增加Partition数量, 超出限定范围后吞吐量反而下降
  2. Partition数量有上限(过多会导致Kafka进程崩溃)
  3. Partition也是最小的并行操作单位

日志存储

日志(Log): Partition对应的物理存储

  1. 日志以目录方式存储多个LogSegment
  2. 日志的目录命名格式: Topic名称-Partition名称
  3. 数据均以追加方式写入日志, 且以特定顺序进行追加

如: 日志存储关系

image

// LogSegment还包含.deleted.cleaned.swap等后缀文件


LogSegment(日志分段): 组成日志的基础单位

  1. 每个LogSement必须有个日志文件和两个索引文件
  2. 日志的最后个LogSegment才可执行写入, 其他仅存储数据
  3. BaseOffset(基准偏移量): 每个LogSegment中首个消息的偏移量
  4. 文件均以BaseOffset格式进行命名(固定为20位数字, 用0填充多余位)

// BaseOffset是64位长整型数据, 其可得知前个LogSegment的数据量


日志索引: 稀疏索引实现消息的快速检索

  1. 稀疏索引达到指定大小后才建立索引(不保证Record均有对应的索引项)
  2. 稀疏索引通过MappedByteBuffer将索引文件映射到内层中
  3. 通过二分定位小于指定偏移量的最大偏移量
  4. 各索引均严格单调递增

存储格式

存储格式: 日志存储在硬盘的格式

  1. 日志的存储格式决定其占用空间大小和检索速率
  2. 日志的存储格式演进为3个版本: v0(0.10.0)、v1(0.11.0)、v2

如: 日志存储格式

image

// Varints(变长整型): 使用任意多个字节序列化记录整数(特定范围减少空间)


消息压缩: 将RecordBatch压缩成单个Record

  1. 压缩生成的消息记为外层消息(反者为内层消息)
  2. 外层消息的key为null, 而value为内层消息(偏移量查找)
  3. 内层消息的偏移量均从0开始(使用时Broker会进行转换计算)

如: 外层消息和内层消息的偏移量

image

// 外层消息存储的是内层消息中最后条消息的绝对位移(相对于Partition而言)


日志清理

日志清理: Kafka对日志的维护

  1. 日志清理策略分为: 删除、压缩
  2. 日志清理的粒度最细可为Topic级别
  3. 可同时指定删除和压缩为日志清理的策略

删除

删除(Delete): 删除不符合特定条件的LogSegment

  1. 删除依据分为: 时间、文件大小、日志的起始偏移量
  2. Broker启动时会同时启动个线程周期性检测并删除特定LogSegment
  3. 删除线程会基于依据选择出可被删除的LogSegment(deletableSegment)

日志删除的大致流程:

  1. 从日志对象中所维护的LogSegment跳跃表中移除待删除的LogSegment
  2. 将所有待删除的文件添加.deleted后缀(包括索引文件)
  3. 统一交由延迟删除线程处理(默认1m)

基于时间删除: 每个LogSegment拥有过期时间

  1. 根据LogSegment的最大时间戳(最后条消息)
  2. 若最后条消息的时间戳字段小于0, 则根据最近修改时间
  3. 若所有LogSegment均满足删除条件, 则在删除前创建activeSegment

如: 基于时间的日志删除(只要最大时间戳未过期就不会被删除)

image


基于文件大小: 每个LogSegment的限定大小

  1. 基于文件大小又可分为:日志大小、LogSegment大小
  2. 若基于日志大小, 则超出限定时默认从头开始删除LogSegment

如:基于大小的日志删除

image


基于日志的起始偏移量: 下个LogSegment的BaseOffset是否小/等于起始偏移量

  1. 删除线程会逐个遍历LogSegment以判断BaseOffset是否满足
  2. 日志起始偏移量常为首个LogSegment的BaseOffset

如: 基于日志的起始偏移量(假设起始偏移量为25)

image


压缩

压缩(Compact): 将具有相同Key的消息仅保留最后个版本的Value

  1. 压缩后生成新的LogSegment, 消息的物理位置不会改变
  2. 压缩后的偏移量不再连续(不影响日志的检索)
  3. 压缩前后的消息可分为: clean和dirty
  4. activeLogSegment不参与压缩

如:日志压缩时其构成部分

image

// 日志的cleaner-offset-checkpoint文件记录每个Partition的已清理偏移量


日志压缩时大致流程:

  1. 日志的污浊率触发压缩操作
  2. 压缩线程遍历两次日志(获取Key和判断)
  3. 对于压缩LogSegment的进行分组(防止过多小文件)
  4. 将LogSegment组中需保留消息存储于.clean后缀的临时文件
  5. 对日志进行压缩, 在压缩完成后将.clean临时文件后缀改为.swap
  6. 删除被压缩的LogSegment, 并将.swap后缀去除(变为可用LogSegment)

// LogSegment组的大小不可超过LogSegment的限定大小


如: 多次压缩的日志文件

image

// ActiveSegment(活跃的日志分段): 可执行写入操作的LogSegment


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

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

相关文章

缓存篇—缓存击穿

在很多场景下,我们的业务通常会有几个数据会被频繁地访问,比如秒杀活动,这类被频地访问的数据被称为热点数据。 如果缓存中的某个热点数据过期了,此时大量的请求访问了该热点数据,就无法从缓存中读取,直接…

《UE5_C++多人TPS完整教程》学习笔记22 ——《P23 记录加入的玩家(Couting Incoming Players)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P23 记录加入的玩家(Couting Incoming Players)》 的学习笔记,该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版,UP主&#xff…

如何使用Docker部署MongoDB并结合内网穿透实现远程访问本地数据库

文章目录 前言1. 安装Docker2. 使用Docker拉取MongoDB镜像3. 创建并启动MongoDB容器4. 本地连接测试5. 公网远程访问本地MongoDB容器5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 正文开始前给大家推荐个网站,前些天发现了一个巨牛的 …

2024最佳住宅代理IP服务商有哪些?

跨境出海已成为了近几年的最热趋势,大批量的企业开始开拓海外市场,而海外电商领域则是最受欢迎的切入口。新兴的tiktok、Temu,老牌的Amazon、Ebay,热门的Etsy、Mecari等等都是蓝海一片。跨境入门并不难,前期的准备中不…

Spring Boot打war包部署到Tomcat,访问页面404 !!!

水善利万物而不争,处众人之所恶,故几于道💦 文章目录 Spring Boot打war包部署到Tomcat,访问页面404 !!!解决办法:检查Tomcat版本和Jdk的对应关系,我的Tomcat是6.x&#x…

Sping基础篇----掌握Sping的控制反转/依赖注入的概念【实战案例总结】

作为一名对技术充满热情的学习者,我一直以来都深刻地体会到知识的广度和深度。在这个不断演变的数字时代,我远非专家,而是一位不断追求进步的旅行者。通过这篇博客,我想分享我在某个领域的学习经验,与大家共同探讨、共…

KVM虚拟机的克隆方式

话不多说,直接上操作 首先确定我们要克隆的模板机器,这样可以方便我们后续克隆许多机器 IP获取最好就是dhcp模式,这样克隆出来的机器就不需要自己再去改ip了 确定需要克隆的模板机以后,先关机再执行克隆操作 virsh shutdown ser…

【SiamFC】《Fully-Convolutional Siamese Networks for Object Tracking》

ECCV 2016 Workshops 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Datasets and Metrics5.2 The OTB-13 benchmark5.3 The VOT benchmarks5.4 Dataset size 6 Conclusion(own)/ Future wo…

Android系统启动流程

android的启动流程是从底层开始进行的,具体如下所示: Android是基于Linux内核的系统,Android的启动过程主要分为两个阶段,首先是Linux内核的启动,然后是Android框架的启动。 可以将Andorid系统的启动流程分为以下五个…

【QT 5 +Linux下软件桌面快捷方式+qt生成软件创建桌面图标+学习他人文章+第二篇:编写桌面文件.desktop】

【QT 5 Linux下软件桌面快捷方式qt生成软件创建桌面图标学习他人文章第二篇:编写桌面文件.desktop】 1、前言2、实验环境3、自我学习总结-本篇总结1、新手的疑问,做这件事目的2、了解.desktop3、三个关键目录以及文件编写1、目录:/opt/2、目录…

【鸿蒙 HarmonyOS 4.0】开发工具安装

一、准备开发环境 1.1、安装IDE 鸿蒙应用开发需要使用配套的IDE——HUAWEI DevEco Studio。 DevEco Studio基于IntelliJ IDEA Community(IDEA社区版)构建,为鸿蒙应用提供了一站式开发环境,集成了开发、运行、调试以及发布应用的…

Stable Diffusion 模型分享:AstrAnime(Astr动画)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五 下载地址 模型介绍 AstrAnime 是一个动漫模型,画风色彩鲜明,擅长绘制漂亮的小姐姐。 条目内容类型大模型…

fastjson解析自定义get方法导致空指针问题

背景 为了在日志中把出入参打印出来,以便验证链路和排查问题,在日志中将入参用fastjson格式化成字符串输出,结果遇到了NPE。 问题复现 示例代码 public static void main(String[] args) {OrganizationId orgId new OrganizationId();N…

【Java多线程】分析线程加锁导致的死锁问题以及解决方案

目录 1、线程加锁 2、死锁问题的三种经典场景 2.1、一个线程一把锁 2.2、两个线程两把锁 2.3、N个线程M把锁(哲学家就餐问题) 3、解决死锁问题 1、线程加锁 其中 locker 可以是任意对象,进入 synchronized 修饰的代码块, 相当于加锁&…

⭐北邮复试刷题LCR 052. 递增顺序搜索树__DFS (力扣119经典题变种挑战)

LCR 052. 递增顺序搜索树 给你一棵二叉搜索树,请 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。 示例 1: 输入:root [5,…

DataX - 全量数据同步工具

前言 今天是2024-2-21,农历正月十二,相信今天开始是新的阶段,尽管它不是新的周一、某月一日、某年第一天,尽管我是一个很讲究仪式感的人。新年刚过去 12 天,再过 3 天就开学咯,开学之后我的大学时光就进入了…

TypeScript01:安装TypeScript

一、TypeScript 官方网站:https://www.tslang.cn/docs/index.html 练习场:https://www.typescriptlang.org/zh/play 好处: 强类型语言,对JS弱类型的一个良好补充;TS利于大型项目团队合作,可以一定程度…

ChatGPT实战100例 - (17) 用ChatGPT实现音频长度测量和音量调整

文章目录 ChatGPT实战100例 - (17) 用ChatGPT实现音频长度测量和音量调整获取音频长度pydub获取音频长度获取时长精确到秒格式设定 mutagen获取音频长度 调整音量视频音量调整注意事项 ChatGPT实战100例 - (17) 用ChatGPT实现音频长度测量和音量调整 老王媳妇说上次那个pip挺好…

《VitePress 简易速速上手小册》第7章 高级功能与动态内容(2024 最新版)

文章目录 7.1 动态路由与 API 集成7.1.1 基础知识点解析7.1.2 重点案例:技术博客7.1.3 拓展案例 1:电商网站7.1.4 拓展案例 2:事件管理网站 7.2 状态管理与 Vuex 使用7.2.1 基础知识点解析7.2.2 重点案例:用户认证系统7.2.3 拓展案…

力扣精选算法100道——Z字形变换(模拟专题)

目录 🎈了解题意 🎈算法原理 🚩先处理第一行和最后一行 🚩再处理中间行 🎈实现代码 🎈了解题意 大家看到这个题目的时候肯定是很迷茫的,包括我自己也是搞不清楚题目什么意思,我…