当前位置: 首页 > news >正文

Kafka之Broker原理

1. 日志数据的存储

1.1 Partition

1. 为了实现横向扩展,把不同的数据存放在不同的 Broker 上,同时降低单台服务器的访问压力,我们把一个Topic 中的数据分隔成多个 Partition
2. 每个 Partition 中的消息是有序的,顺序写入,但是全局不一定有序
3. 在服务器上,每个 Partition 都有一个物理目录( TopicN )后面的数字代表分区

 

1.2 Replica副本

1. 为了提高分区的可靠性, Kafka 设计了副本机制
2. 副本数必须小于等于节点数,而不能大于 Broker 的数量
3. Leader 对外提供读写服务, Follower 唯一的任务就是从 Leader 异步拉取数据

 

1.3 Segment段

1. 为了防止Log不断追加导致文件过大,导致检索消息效率变低,一个Partition又 被划分成多个Segment来组织数据.

在这里会有3个配置,也就是log的阈值配置。什么时候下进行分段

  • log.segment.bytes :根据日志文件大小
  • log.roll.hours log.roll.ms :根据时间戳差值

    log.index.size.max.bytes:根据索引文件大小

每一个segment都是由一个log文件和2个index文件组成的,其中时间戳索引的创建方式可以自定义的执行createTime或LogAppendTime.默认是creareTime

 1.4 Sparse Index(稀疏索引)

索引文件的查看可以通过以下命令进行查看

 kfaka索引文件中记录的Offset不是连续的,而是采用了稀疏索引。根据配置的大小,稀疏索引记录的是从Log中的哪个位置开始检索,比如配置的是4kb,则当log文件中向下存储的数据达到4kb的话,就会记录一个索引值

 1.5 分区副本在Broker上的分布

创建一个topic

./kafka-topics.sh--bootstrap-server192.168.61.101:9092--create--topic3p3r--partitions3--replication-factor3

 假设配置的是3p3r,则我们看下服务器上的存储

查看Topic信息

./kafka-topics.sh--bootstrap-server192.168.61.101:9092--describe--topic3p3r

 其中 Partition是分区,Leader后面代表的是在哪台服务器上,Replicas就是副本信息,ISR是个副本队列

 假设配置的是4p2r,则物品们查看topic信息如图所示

创建、查看topic

./kafka-topics.sh --bootstrap-server 192.168.61.101:9092 --create --topic 4p2r --partitions 4 --replication-factor 2
./kafka-topics.sh --bootstrap-server 192.168.61.101:9092 --describe --topic 4p2r

 假设我们配置的是6p2r

由以上我们可以看出,副本分配的两个基本原则和规律

1、副本会被平均分布在所有的Broker之上

2 partition 的多个副本应该分配在不同的 Broker

基于上面的规则,分区副本最终落入哪个节点,还会收到两个随机数的影响

1、第一个随机数:startIndex,决定了第一个分区的第一个副本的放置位置

2 、第二个随机数: nextReplicaShift ,决定了分区中,副本跟副本的间距nextReplicaShift%(BrokerSize-1)

这样设计的目的在于提高Broker服务器的容灾能力 

2. 消息保留与清理机制

对于一些太久的日志,我们需要一定的清理策略。

当开启清理策略后,有两种方式提供开发者选择

log.cleanup.policy=delete (默认项) // 删除策略
log.cleanup.policy=compact    // 压缩策略

 2.1 删除策略(delete)

kafka可以通过定时任务实现日志数据的删除,默认5分钟执行一次

log.retention.check.interval.ms=300000

那么要删除什么样的数据呢?kafka提供了两个纬度以及对应不同的配置

时间纬度

log.retention.hours(默认值是168个小时,时间戳超过的数据会被删除)

log.retention.minutes (默认值是空,优先级比小时高)
log.retention.ms (默认值是空,优先级比分钟高)

若产生消息的速度不均匀,有时多、有时少,就可以根据日志大小删除

log.retention.bytes (表示所有日志文件的总大小,默认值是 -1 ,代表不限制大小)
log.segment.bytes (对单个 Segment 文件大小进行限制,默认值 1G

 2.2 压缩策略(compact)

若设置为压缩策略compact,则表示不清楚日志,只对日志数据进行压缩处理

思考问题: 如果同一个key重复写入多次,是会存储多次?还是会更新?

kafka中是存储多次的,如: _ _consumer_offsets

那么压缩策略是怎么做的呢?(将相同的key进行去重压缩)

3. Broker高可用架构

高可用,无非就是选举机制、数据的一致性也就是主从同步,以及对于故障的处理,由于kafka是直接数据存储在磁盘中的,因此无需考虑持久化,Broker的高可用 涉及到一系列的动作 

  • 选举出一个Controller
  • 从分区中选举出Leader角色
  • 主从同步
  • Replica故障处理

3.1 选举机制

3.1.1 Controller选举

Controller其实就是一个Broker,由它来负责选举出新的Leader,那么Controller是怎么选举出来的呢

 3.1.2 分区副本Leader的选举

在讲解Leader选举前,我们先复习以下博客Kafka之Producer原理-CSDN博客中提到的ISR机制的几个概念

AR Assigned-Replicas ),一个分区所有的副本
ISR In-Sync Replicas ),在 AR 中,跟 Leader 保持积极同步数据的副本
OSR Out-Sync-Replicas ),在 AR 中,跟 Leader 同步滞后的副本
AR = ISR + OSR
  •  当Leader副本发生故障时,只有在ISR中的副本才能参与新Leader的选举
    • 问题:如果ISR为空呢? unclean.leader.election.enable配置为false OSR也可以进行选举
  • Kafka采用了类似于继位传嫡的选举协议,选择ISR中位置靠前的节点成为新的Leader.

3.2 主从同步

从节点和主节点的同步过程如下:

1 、首先, Follower 节点向 Leader 发送一个 fetch 请求
2 、然后, Leader Follower 发送数据
3 、接着, Follower 接收到数据响应后,依次写入消息、并更新 LEO
4 、最后, Leader 更新 HW ISR 最小的 LEO
5 、循环上述过程,直至所有 Follower 完成数据同步

 整体流程图如下所示:

 

 

 Kafka设计的ISR复制,既可以在保障数据一致性,又可以提供高吞吐量(ISR队列中清除响应不积极的Follower节点)

3.3 Replica故障处理

  • Follower发生故障,会被先提出ISR,Follower恢复之后,从HW开始同步数据
  • Leader发生故障,会先选举出一个新的Leader,其它的Follower将高于HW的消息截取掉,然后从新的Leader同步数据

4. 总结

        本文介绍Broker服务器,主要讲了Broker中日志的存储,从大到小依次为Partition、Segment,副本机制的具体存储形式,是怎么进行负载均衡和容灾保障的,在Segment中我们直到了Segment是由一个Log文件和两个索引文件组成的,索引文件主要起的是一个提升查询效率的作用。随后当kafka中log文件过大的时候,kagka中提供了两种维度上的删除策略以及相同key去重压缩的compact策略。最后,kafka高可用中的选举机制是先到先得选举Controller,再根据ISR副本队列嫡长子继位的算法进行Leader的选举;以及Kafka中的主从同步是以高水位HW为界限,不断的同步数据,直到LEO值相等完成数据的同步。最后讲到了副本故障的处理,针对follwe节点故障,则直接踢出ISR队列,Leader故障,就会触发选举机制,选举出一个新的Leader,最后数据从LEO处以上的开始同步,高于HW的消息全部截断。

相关文章:

  • 8.3 Go 包的组织结构
  • 轻松搞定阿里云域名DNS解析
  • cpp--lua--cpp执行lua
  • Qt/C++音视频开发76-获取本地有哪些摄像头名称/ffmpeg内置函数方式
  • 深度解读ChatGPT基本原理
  • QT Udp广播实现设备发现
  • Camtasia Studio怎么自动加字幕呢,Camtasia Studio有什么功能呢
  • 中介子方程七
  • 【西瓜书】4.决策树
  • 开发指南028-生成二维码
  • python : map list 切片 推导式
  • 【讲解下ECMAScript和JavaScript之间有何区别?】
  • 力扣 41.缺少的第一个正整数
  • 解决 There is no getter for property named ‘null‘ in ‘class 报错
  • HTML静态网页成品作业(HTML+CSS)—— 家乡南宁介绍网页(2个页面)
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • Android交互
  • nodejs调试方法
  • SpringBoot几种定时任务的实现方式
  • webgl (原生)基础入门指南【一】
  • 彻底搞懂浏览器Event-loop
  • 电商搜索引擎的架构设计和性能优化
  • 分布式任务队列Celery
  • 面试总结JavaScript篇
  • 少走弯路,给Java 1~5 年程序员的建议
  • 深度学习中的信息论知识详解
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 一个SAP顾问在美国的这些年
  • 用element的upload组件实现多图片上传和压缩
  • 用mpvue开发微信小程序
  • 字符串匹配基础上
  • HanLP分词命名实体提取详解
  • Hibernate主键生成策略及选择
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​VRRP 虚拟路由冗余协议(华为)
  • !!java web学习笔记(一到五)
  • # 安徽锐锋科技IDMS系统简介
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • #Spring-boot高级
  • (floyd+补集) poj 3275
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (四)c52学习之旅-流水LED灯
  • (一)项目实践-利用Appdesigner制作目标跟踪仿真软件
  • (转)socket Aio demo
  • ***通过什么方式***网吧
  • *1 计算机基础和操作系统基础及几大协议
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .net dataexcel winform控件 更新 日志
  • .NET NPOI导出Excel详解
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)