【Kafka】深入了解Kafka
集群的成员关系
Kafka使用Zookeeper维护集群的成员信息。
- 每一个
broker都有一个唯一的标识,这个标识可以在配置文件中指定,也可以自动生成。 - 当
broker在启动时通过创建Zookeeper的临时节点把自己的ID注册到Zookeeper中。broker、控制器和其他一些动态系统工具会订阅Zookeeper的/brokers/ids路径;当有broker加入或退出集群时,会收到通知。 - 当试图启动另一个具有相同ID的
broker时,会收到错误信息。
控制器
控制器也是一个
broker,除了提供一般broker功能外,还负责选举分区首领。
创建控制器
- 集群中第一个启动的broker会通过Zookeeper创建一个
/controller的临时节点让自己成为控制器; - Zookeeper会为控制器分配一个
epoch。 - 其他
broker在启动时,也会尝试创建,但是因为已经存在他们会收到”节点已存在“异常; - 然后在控制器节点上创建
Zookeeper watch,这样就可以接收这个节点的变更通知。通过这样的方式来保证节点只有一个控制器。

变更控制器
- 控制器关闭或者与Zookeeper断开连接,这个临时节点会消失;
- 当其他节点收到控制器节点消失的通知时,会尝试创建
/controller的临时节点成为控制节点; - 其他未创建成功的broker会在新的控制节点上创建
Zookeeper watch, - 新的控制器节点由Zookeeper分配一个数值更大的
epoch。这样做的目的是为了杜绝之前离线的控制器重新上线,并且发送消息,如果broker接收到消息的epoch小于监听的则会忽略当前消息。

新控制器 KRaft
用基于
Raft的控制器替换基于Zookeeper的控制器。
集群即可以使用基于Zookeeper的传统控制器,也可以使用KRaft。
为什么替换控制器
- 元数据是同步写入Zookeeper的,但是异步发送给
broker的,Zookeeper的接收更新也是异步的,会导致broker、控制器和Zookeeper之间元数据不一致的情况 - 控制器在重新启动时需要从Zookeeper读取所有的broker和分区元数据,再将他们发给所有broker,随着分区和broker的争夺,重启控制器会变慢。
- 元数据所有权架构不够好,有些操作通过控制器、有些通过broker、有些通过Zookeeper来完成
- 使用Kafka需要对Zookeeper有一定了解,学习成本较高
Zookeeper主要功能
- 用于选举控制器
- 保存集群元数据(broker、配置、主题、分区和副本)
KRaft
-
新架构中控制器节点形成了一个
Raft仲裁,管理元数据事件日志,这个日志包含了集群元数据的每一个变更,原先保存在Zookeeper中的所有东西(主题、分区、ISR、配置等)都保存在这个日志中。 -
涉及直接与Zookeeper通信的客户端和broker操作都通过控制器来路由,以达到无缝迁移。
-
使用
Raft算法,控制节点可以在不依赖外部系统情况下选举首领,首领节点被称为主控制器,负责处理来自所有broker的RPC的调用,跟随者控制器从主控制器复制数据,并会作为主控制器的热备, -
其他broker通过API从主控制器获取更新,而不是等待通知。broker将自己注册到控制器仲裁上,在注销前会一直保持注册状态。
复制
复制是Kafka架构核心的一部分,之所以这么重要,是因为他可以在个别节点失效时仍能保证Kafka的可用性和持久性。
Kafka中每个主题有若干分区,每个分区可以有多个副本,副本均匀的分布在多个broker中。
副本有两种类型
- 首领副本:每个分区都有一个首领副本,为了保证一致性,所有生产者的请求都会经过这个副本。客户端可以从首领副本或者跟随者副本读取数据
- 跟随者副本:除了首领副本以外都是跟随者副本。没特别指定,跟随者副本不处理来自客户端的请求,主要任务是从首领副本复制消息,保持与首领一致的状态。
请求的处理
客户端持有集群的元数据缓存,元数据中包含了客户端感兴趣的主题清单以及主题包含的分区、副本、首领等,一般情况下客户端会直接向目标broker发送生产请求和获取请求。
请求分类
- 生产请求
- 获取请求
- 管理请求
生产请求
生产者发送的请求,包含客户端要写入broker的消息
borker在接收到生产请求时会做一些验证
- 发送数据的用户是否有写入权限
- 请求中
acks参数是否有效 - 如果
acks=all是否足够多的同步副本保证消息已经写入
消息写入分区首领后,broker会检查acks参数,等到所有的都完成后,会返回响应给客户端。
获取请求
消费者和跟随者副本发送的请求,用于从broker读取消息。
broker接收到获取请求时会做一些校验
- 请求指定的偏移量是否存在
客户端读取消息时,Kafka使用零复制技术向客户端发送消息。也就是说Kafka会直接把消息从文件里发送到网路通道,不经过任何缓冲区。
客户端能读取的消息是已经被写入所有同步副本的消息;部分没有完全同步给所有副本的消息是不会发送给消费者的。
管理请求
管理客户端发送的请求,用于执行元数据操作,比如创建和删除topic
存储
分层存储
- 本次存储:与当前存储一致,保存在broker机器上
- 优势:响应快
- 劣势:成本高、数据保留时间短
- 远程存储:利用HDFS、S3等存储系统来存储日志信息
- 优势:成本低于本地存储、数据可保留较长时间
- 劣势:响应较慢
文件管理
数据保留是Kafka的一个重要概念
- Kafka中一个分区会分为若干片段,
- 默认每个片段包含1GB或者1周的数据,触发任意上限,会关闭当前文件,重新打开一个文件
- 正在写入的片段叫做活动片段,活动片段不会被删除。
压实
保留每个键的最新有效数据,同时清理历史冗余的数据。
- 保留最新值:对于每条消息,如果指定了 Key,Kafka 会为每个 Key 保留最后一个写入的 Value(最新状态)。
- 删除冗余记录:所有旧版本的 Key-Value 对会被标记为可删除(逻辑删除),但物理删除会在后台异步完成。
- 非键消息的保留:没有 Key 的消息(或 Key 为 null 的消息)不会被压实,仍然遵循基于时间或大小的保留策略(例如 7 天后删除)。
什么时候压实主题
- 通过
log.cleaner.enabled参数启动压实线程,线程会选择浑浊率最高的分区来压实。 - 默认情况下会在主题中有50%数据包含脏记录时进行压实。
- 每个日志片段分为两个部分
- 干净的部分:被压实过的消息,每个键只有一个对应得值,是上一次压实保留下来得
- 浑浊部分:上一次压实之后写入得

相关文章:
【Kafka】深入了解Kafka
集群的成员关系 Kafka使用Zookeeper维护集群的成员信息。 每一个broker都有一个唯一的标识,这个标识可以在配置文件中指定,也可以自动生成。当broker在启动时通过创建Zookeeper的临时节点把自己的ID注册到Zookeeper中。broker、控制器和其他一些动态系…...
C++特性——RAII、智能指针
RAII 就像new一个需要delete,fopen之后需要fclose,但这样会有隐形问题(忘记释放)。RAII即用对象把这个过程给包起来,对象构造的时候,new或者fopen,析构的时候delete. 为什么需要智能指针 对于…...
C++异常处理时的异常类型抛出选择
在 C 中选择抛出哪种异常类型,主要取决于错误的性质以及希望传达的语义信息。以下是一些指导原则,帮助在可能发生异常的地方选择合适的异常类型进行抛出: 1. std::exception 适用场景:作为所有标准异常的基类,std::e…...
elsticsearch 通过reindex修改shards
elasticsearch reindex 索引。 背景: 索引test1 reindex到test2 修改sharding数量 程序是通过别名test1_alias访问索引 1、创建目标索引test2 索引需要手动提前创建自动创建可能会有mapping 不一致性的风险。 The destination should be configured as wanted …...
CentOS系类普通挂载磁盘挂载命令
检查磁盘是否有分区 lsblk如果 vdb 下面没有分区(比如 vdb1),你需要先创建分区。 创建分区(如果需要) fdisk /dev/vdb然后在 fdisk 交互界面: 输入 n 创建新分区 选择 p 创建主分区 默认分区号和大小 输…...
Kafka自定义分区机制
文章目录 1.如何自定义分区机制2.示例 1.如何自定义分区机制 若需要使用自定义分区机制,需要完成两件事: 1)在 producer 程序中创建一个类,实现 org.apache.kafka.clients.producer.Partitioner 接口主要分区逻辑在 Partitioner.partition中…...
【HarmonyOS NEXT】关键资产存储开发案例
在 iOS 开发中 Keychain 是一个非常安全的存储系统,用于保存敏感信息,如密码、证书、密钥等。与文件系统不同,Keychain 提供了更高的安全性,因为它对数据进行了加密,并且只有经过授权的应用程序才能访问存储的数据。那…...
强化学习(赵世钰版)-学习笔记(9.策略梯度法)
本章是课程的导数第二章,旨在讲解策略的函数化形式。 之前的方法,描述一个策略都是用表格的形式,每一行代表一个状态,每一列代表一个行为,表格中的元素对应相关状态下执行相关行为的概率。 函数化的策略表征形式是指&a…...
ModuleNotFoundError: No module named ‘flask‘ 错误
要解决 ModuleNotFoundError: No module named ‘flask’ 错误,需确保已正确安装 Flask 库。以下是详细步骤: 1. 安装 Flask 在终端或命令行中执行以下命令(注意权限问题): 使用 pip 安装 pip install flask 若…...
【c++】【STL】unordered_set 底层实现(简略版)
【c】【STL】unordered_set 底层实现(简略版) ps:这个是我自己看的不保证正确,觉得太长的后面会总结整个调用逻辑 unordered_set 内部实现 template <class _Kty, class _Hasher hash<_Kty>, class _Keyeq equal_to<_Kty>…...
【Zephyr】【一】学习笔记
Zephyr RTOS 示例代码集 1. 基础示例 1.0 基础配置 每个示例都需要一个 prj.conf 文件来配置项目。以下是各个示例所需的配置: 基础示例 prj.conf # 控制台输出 CONFIG_PRINTKy CONFIG_SERIALy CONFIG_UART_CONSOLEy# 日志系统 CONFIG_LOGy CONFIG_LOG_DEFAULT…...
网络安全设备配置与管理-实验4-防火墙AAA服务配置
实验4-p118防火墙AAA服务配置 从这个实验开始,每一个实验都是长篇大论😓 不过有好兄弟会替我出手 注意:1. gns3.exe必须以管理员身份打开,否则ping不通虚拟机。 win10虚拟机无法做本次实验,必须用学校给的虚拟机。首…...
后端框架模块化
后端框架的模块化设计旨在简化开发流程、提高可维护性,并通过分层解耦降低复杂性。以下是常见的后端模块及其在不同语言(Node.js、Java、Python)中的实现方式: 目录 1. 路由(Routing)2. 中间件(…...
【论文阅读】Contrastive Clustering Learning for Multi-Behavior Recommendation
论文地址:Contrastive Clustering Learning for Multi-Behavior Recommendation | ACM Transactions on Information Systems 摘要 近年来,多行为推荐模型取得了显著成功。然而,许多模型未充分考虑不同行为之间的共性与差异性,以…...
视频转音频, 音频转文字
Ubuntu 24 环境准备 # 系统级依赖 sudo apt update && sudo apt install -y ffmpeg python3-venv git build-essential python3-dev# Python虚拟环境 python3 -m venv ~/ai_summary source ~/ai_summary/bin/activate核心工具链 工具用途安装命令Whisper语音识别pip …...
基于协同过滤推荐算法的景点票务数据系统(python-计算机毕设)
摘 要 I ABSTRACT II 第 1 章 引言 1 研究背景及意义 1 研究背景 1研究意义 1 国内外研究现状 2 智慧旅游 3旅游大数据 3 研究内容 4本章小结 4 第 2 章 相关技术概述 5 基于内容的推荐算法 5 基于内容的推荐算法原理 5基于内容的推荐算法实现 5 协同过滤推荐算法 6 协同过…...
QT学习笔记1
** Qt Creator开发环境配置** 安装流程(Windows平台) 下载与安装 : 访问Qt官网,下载在线安装工具Qt Online Installer。登录或注册Qt账号,选择开源版本(需勾选“接受协议”)。勾选组件ÿ…...
Ubuntu 24 常用命令方法
文章目录 环境说明1、账号管理1.1、启用 root 2、包管理工具 apt & dpkg2.1、apt 简介 & 阿里源配置2.2、dpkg 简介2.3、apt 和 dpkg 两者之间的关系2.4、常用命令 3、启用 ssh 服务4、防火墙5、开启远程登录6、关闭交换分区7、build-essential(编译和开发软…...
Flask多参数模版使用
需要建立目录templates; 把建好的html文件放到templates目录里面; 约定好参数名字,单个名字可以直接使用;多参数使用字典传递; 样例: from flask import render_template # 模板 (Templates) #Flask 使用…...
torcharrow gflags版本问题
问题描述 其实仍然是很简单的编译问题,但是又弄了一整个下午加几乎整个晚上,进度缓慢,又吸取了教训,因而还是来记录一下。 在试图使用torcharrow进行推荐系统模拟的时候,撰写的python程序报错:ERROR: flag…...
自然语言处理|深入解析 PEGASUS:从原理到实践
一、引言 在信息爆炸的时代,互联网上的文本数据以极快的速度增长。无论是新闻资讯、学术论文、社交媒体动态,还是各类报告文档,我们每天接触到的文字信息量巨大。如何快速、准确地提取关键内容成为一项重要任务。文本摘要技术通过将长篇文本…...
Spring AI Alibaba快速使用
AI 时代,Java 程序员也需要与时俱进,这两个框架必须掌握。 一个是 Spring AI一个是 Spring Alibaba AI。 Spring AI 是一个AI工程领域的应用程序框架,它的目标是将 Spring生态系统的设计原则应用于人工智能领域。 但是, Spring…...
socks 协议介绍
SOCKS协议详解 一、基本定义与核心功能 SOCKS(Socket Secure)是一种网络传输协议,主要用于通过代理服务器转发客户端与目标服务器之间的通信请求。其核心功能包括隐藏用户真实IP地址、穿透防火墙限制以及支持多种网络协议(如TCP…...
Linux --centos安装显卡驱动
显卡下载页面 https://www.nvidia.com/en-us/drivers/unix/ 随便下载一个即可 安装过程 查看当前设备的显卡信息 lspci | grep -i vga安装gcc相关依赖 yum update -y yum update gcc yum install build-essential yum install gcc-multilibdkms yum groupinstall "Dev…...
【软件工程】简答题
真题 2024-10 26.需求验证应验证需求规格说明书中每一单一需求是否满足5个性质,这5个性质是什么? 27.简述RUP和UML的关系。 28.简述五种常见的模块间耦合类型。 29.螺旋模型在笛卡尔坐标的4个象限上,分别表达了哪4个方面的活动? 30.为了表达概念模型和软件模型,UML提供了13…...
统信UOS中使用Vscode编程
写在前面:统信UOS其实就是套壳的Linux系统,所以有问题如果搜不到解决方法,可以参考Linux下的解决方法。 1.环境配置 Vscode : 1.85.0 Vscode就直接下载安装就行,然后安装插件:Volar、中文汉化包 node:18…...
K8s认证(CKA/CKAD/CKS)哪家强?主流证书对比
2024年Kubernetes认证全解析:选对证书,薪资翻倍! (附CKA/CKAD/CKS最新考试攻略) 一、K8s认证哪家强?主流证书对比 认证名称颁发机构考试特点适合人群考试费用CKA(认证K8s管理员)CN…...
HTTP1.0、HTTP1.1、HTTP2.0对比
HTTP 1.0、HTTP 1.1 和 HTTP 2.0 是 HTTP 协议演进中的三个重要版本,每个版本都针对前一代的不足进行了优化和改进。以下是它们的核心区别和关键特性对比: 1. HTTP 1.0(1996年) 非持久连接 每个请求/响应对都需要单独建立和关闭 T…...
docker安装向量数据库Milvus及可视化工具 Attu
前置条件 1.安装了docker 2.服务器网络正常,可以连接到容器下载地址 3.服务器磁盘空间正常,docker磁盘占用过大,请参考docker容量占用过大解决办法 一、下载yml文件 可在文章资源下载或者自行下载:下载yml 下载这个单机版本的…...
A l密码学(Deepseek)
我:qwertyuiopasdfghjklzxcvbnm deepseek:深度思考中. Okay, lets see. The user input is "qwertyuiopasdfghjklzxcvbnm". At first glance, it looks like a jumbled sequence of letters with some spaces or maybe other characters in …...
