Kafka---总结篇

kafka架构

主要概念

broker: 存储消息的机器

控制器controller

(1)使用zookeeper, 除了提供一般的broker功能之外,还负责选举分区首领。通过在zookeepr中创建一个名为 /controller的临时节点称为 controller。每个选出的controller都会有一个递增的epoch。

(2)使用 KRaft,通过Kraft来选举,所有的元数据都存储在 metadata.log.dir 目录下。通过pull从controller获取信息

主题

消息通过主题分类。类似数据库的表或文件系统的文件夹

分区

一个主题可以被分为若干个分区。消息无法在主题内保证有序,但可以在单个分区内有序。

副本

为了保证可靠性,一个分区可以有多个副本。其中分为leader副本和follower副本。所有副本统称为AR(assigned replicas),所有与leader副本保持一定程度同步的副本(包括leader)组成ISR(in-sync replicas)。follower滞后leader指定的时间时,则会退出 ISR。(不可读,只当做备份作用);就是从leader副本拉取消息,如果持续拉取速度慢于leader副本写入速度,慢于时间超过replica.lag.time.max.ms后,它就变成“非同步”副本,

HW

标识一个特定的消息偏移量,消费者只能拉取到这个offset之前的消息。比如HW=6, 只能拉取到 0~5的消息

LEO(Log End Offset)

标识当前日志文件中下一条待写入的消息的offset

Lag Kafka Lag

很多时候也会被称之为消息堆积量。 当事务是read-committed, Lag=LSO – ConsumerOffset, 否则等于 Lag=HW-ConsumerOffset

LSO

LSO 的值等于事务中第一条消息的位置(firstUnstableOffset,如上图所示),对已完成的事务而言,它的值同 HW 相同

消费组

Broker的controller协调者选举

(1) zookeeper模式,通过创建一个 /controller的临时节点来选举。

(2) KRaft模式,通过raft算法来选举。follower通过pull的方式拉取leader的日志。

副本的leader选举

首先选出broker的controller节点,然后节点会从分区的 ISR中选举第一个follower副本为leader副本。

事务

事务处理流程如下:

Transaction Coordinator的选举

根据transactionId的哈希值计算主题 _transaction_state中的分区编号,再找到此分区leader副本所在的broker节点。

事务隔离级别

(1)read_uncommitted。默认的事务级别。

(2)read_committed。

应用场景

“消--处理—生产”的模式。即从源主题读取消息,然后对消息进行一些处理,再将结果写入到另一个主题。

幂等性

启动了幂等生产者,每条消息都将包含生产者ID(PID)和序列号。在leader副本的broker会保存map<pid,分区>维护一个序列号。

幂等生产者只能防止由生产者内部重试逻辑引起的消息重复。

  • 每个生产者会被分配一个ProducerId(PID),SeqNumber

  • 然后生产者端和Broker端都有<PID,PartitionID> SeqNumber 的映射关系

  • 生产者每发送一条消息后就将对应的分区序列号加一

  • broker端会比较序列号,如果new Sq < old Sq+1,抛弃这条数据。说明它已经是过期的了如果new Sq > old sq +1,说明有消息丢失了。对生产者抛出异常

怎么保证PID相同的生产者干扰数据

在分配PID时,会分配epoch,新的生产者就会加1,如果出现了两个同样的生产者PID一样,取epoch最大的那个。

Producer过程

写入分区策略:

  • 轮询策略(默认分区策略)

  • 随机策略

  • 按键保存策略。

其中轮询策略是默认的分区策略,而随机策略则是较老版本的分区策略,不过由于其分配的均衡性不如轮询策略,故而后来改成了轮询策略为默认策略。

确定好消息的topic+partition后,直接发送给对应leader副本所在的broker。消息的可靠性主要通过acks参数来配置,主要有以下三种:

(1)acks=0, 生产者发送消息后不需要等待任务服务端的响应。吞吐性能最好,可靠性最差。

(2)acks=1, 只要分区的leader副本成功写入消息即可。消息的可靠性和吞吐量折中

(3)acks=-1或all,生产者在发送消息后,需要等待ISR中的所有副本都成功写入消息之后才能收到来自服务端的成功响应。但因为可能ISR中只有leader副本,也会导致消息不可靠。更高可靠性需要配置 min.insync.replicas,指定写入的最小ISR的数量,如果没有达到则会发送失败。

Comsumer过程

groupCoordinator和comsumerCoordinator之间的逻辑如下:

(1)每一个broker都有coordinator(辅助实现消费组的初始化和分区的分配),根据groupId进行哈希取模得到选举那个coordinator对消费组进行管理

(2)消费者向负载最小的节点请求获取到groupCoordinator, 然后连接到groupCoordinator节点并发送JoinGroup请求。

(3)groupCoordinator为消费组选举一个消费组的leader。如果没有消费组leader,则加入group的第一个消费者为leader。如果消费组leader挂了之后,会比较随意的选举一个。

(4)消费者leader从选举出的分区分配策略来实施具体的分区分配(逻辑下面会介绍)

(5)groupCoordinator发送SyncGroupRequest请求来同步分配方案给各个消费者。

(6)每个消费者都会和groupCoordinator保持心跳(默认3s),一旦超时(session.timeout.ms=45s),该消费者会被移除,并触发再平衡;或者消费者处理消息的时间过长(max.poll.interval.ms=5分钟),也会触发平衡

总结了一下:

(1)find_coordinator

(2)join_group

(3)sync_group

(4)hearbeat

分区策略:

1.RangeAssignor分配策略

    按照消费者总数和分区总数进行整除运算来获得一个跨度,然后将分区按照跨度进行平均分配,以保证分区尽可能均匀地分配给所有的消费者。

2.RoundRobinAssignor分配策略(默认的分区策略)

    将消费组内所有消费者及消费者订阅的所有主题的分区按照字典序排序,然后通过轮询方式逐个将分区依次分配给每个消费者。

3.StickyAssignor分配策略

    目的:(1)分区的分配尽可能均匀(2)分区的分配尽可能与上次分配的保持相同

4.自定义分区策略

选举分区分配策略:

(1)收集各个消费者支持的所有分配策略,组成候选集candidates

(2)每个消费者从candidates中找出第一个自身支持的策略,为这个策略投一票

(3)计算candidates中各个策略的选票数,选票数最多的策略即为当前消费者的分配策略

触发消费再均衡情况:

(1)有新的消费者加入消费组

(2)有消费者宕机下线。

(3)有消费者主动退出消费组

(4)消费组所对应的groupCoordinator节点发生了变更

(5)消费组内所订阅的任意主题或者主题的分区数量发生了变化

提交方式

(1)自动提交

(2)提交当前偏移量

(3)异步提交。api只管提交偏移量,无须等待broker做出响应。

(4)提交特定偏移量

底层存储数据

流式处理

kafka中使用的优化技巧

1.copy-zero(零拷贝)

linux操作系统 “零拷贝” 机制使用了sendfile方法, 允许操作系统将数据从Page Cache 直接发送到网络,只需要最后一步的copy操作将数据复制到 NIC 缓冲区, 这样避免重新复制数据 。示意图如下:

2. 页缓存技术 pagecache, 使用mmap来映射文件到程序内存中。

为了优化读写性能,Kafka利用了操作系统本身的Page Cache,就是利用操作系统自身的内存而不是JVM空间内存

3.顺序写

4.分区分段+索引

Kafka的message是按topic分类存储的,topic中的数据又是按照一个一个的partition即分区存储到不同broker节点。每个partition对应了操作系统上的一个文件夹,partition实际上又是按照segment分段存储的。这也非常符合分布式系统分区分桶的设计思想。

5.批量读写

Kafka数据读写也是批量的而不是单条的。

6.批量压缩

如果每个消息都压缩,但是压缩率相对很低,所以Kafka使用了批量压缩,即将多个消息一起压缩而不是单个消息压缩

性能压测:

数据不撒谎,Flink-Kafka性能压测全记录!

大概读写的QPS:

20W 

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

DCEP数字人民币:中国法定区块链中数字货币

一、背景 作为全球第二大经济体&#xff0c;中国在数字货币领域的发展一直备受关注。近年来&#xff0c;中国政府积极推动数字货币的研究和试点工作&#xff0c;逐步开放数字货币交易试点&#xff0c;并计划推出中国唯一合法数字货币——数字人民币&#xff08;RMB Coin&#…

3套Matplotlib主题

分享3套Matplotlib主题&#xff0c;让图表更好看 seaborn默认主题 import seaborn as sns import pandas as pd import matplotlib as mpltips pd.read_csv(./sns_data/tips.csv)sns.relplot(datatips,x"消费金额 ($)",y"小费金额 ($)",hue"客人性…

【Django学习笔记(九)】Flask + MySQL的结合案例

Flask MySQL结合案例 前言正文案例1&#xff1a;添加用户1.1 浏览器发送请求&#xff0c;返回页面main.pyhtml页面 1.2 新增用户并连接数据库main.pyhtml页面 案例2&#xff1a;查询所有用户2.1 main.py2.2 html2.3 bootstrap优化html 前言 在本文中&#xff0c;介绍如何将 F…

MySQL mydumper工具

目录 1. mydumper介绍 2. mydumper参数解释 3. 备份例子 3.1 备份全库(未包含其他) 3.2 备份全库(包含其他) 3.3 备份指定数据库(-B或--database) 3.4 导出指定表(-T或--tables-list) 3.5 只导出表结构&#xff0c;不导出表数据(-d或--no-data) 3.6 只导出表数据&#…

以gitee为例的git入门使用指北

安装git 在linux中我们首先需要使用 sudo apt install git来下载git 在windows中可以下载msysGit 链接&#xff1a;https://git-scm.com/download/win gitee准备 申请账号 建立仓库 ​ 点击新建仓库 这里一般是私有库&#xff0c;点击创建&#xff0c;这时你就拥有一个线上…

[开发|鸿蒙] DevEco Studio编译构建(笔记,持续更新)

构建体系 编译构建是将应用/服务的源代码、资源、第三方库等&#xff0c;通过编译工具转换为可直接在硬件设备上运行的二进制机器码&#xff0c;然后再将二进制机器码封装为HAP/APP软件包&#xff0c;并为HAP/APP包进行签名的过程。其中&#xff0c;HAP是可以直接运行在模拟器…

Kafka应用Demo:按主题订阅消费消息

安装环境 Kafka安装可参考官方网站的指导(https://kafka.apache.org/quickstart), 按步骤解压压缩包&#xff0c;修改配置。然后再启动zookeeper和kafka-server即可。 需要注意的一点&#xff1a;如果是在VMware虚拟机上启动的kafka, 需要修改一下server.properties配置文件&am…

cmake进阶:目录属性之 INCLUDE_DIRECTORIES说明二

一. 简介 前面几篇文章学习了 cmake的一些目录属性&#xff0c;主要有两个重要的目录属性INCLUDE_DIRECTORIES 属性、LINK_DIRECTORIES 属性。文章如下&#xff1a; cmake进阶&#xff1a;目录属性之 INCLUDE_DIRECTORIES-CSDN博客 本文学习 父目录的 INCLUDE_DIRECTORIES …

<网络安全>《79 概念讲解<第十二课 物联网常用协议-(远距离非蜂窝网络)-终端设备>》

协议简称全称名称内容说明ZigBee也称紫蜂低速短距离传输的无线通信协议一种高可靠的无线数传网络&#xff0c;主要特色有低速、低耗电、低成本、支持大量网上节点、支持多种网上拓扑、低复杂度、快速、可靠、安全。ZigBee技术是一种新型技术&#xff0c;主要是依靠无线网络进行…

JAVA IO/NIO 知识点总结

一、常见 IO 模型简介 1. 阻塞IO模型 最传统的一种IO模型&#xff0c;即在读写数据过程中会发生阻塞现象。当用户线程发出IO请求之后&#xff0c;内核会去查看数据是否就绪&#xff0c;如果没有就绪就会等待数据就绪&#xff0c;而用户线程就会处于阻塞状态&#xff0c;用户线…

Linux 命令查看服务器信息

1.查看 CPU 信息 lscpu2.查看内存信息 cat /proc/meminfo |grep MemTotal查看逻辑 CPU个数 cat /proc/cpuinfo | grep "processor"3.查看磁盘信息 df -hl

深入大模型量化技术,大模型端侧落地已Ready?

揭秘未来&#xff1a;大模型量化技术如何革新移动AI应用 ©作者|饮水机 来源|神州问学 前言 最近&#xff0c;苹果发布了OpenELM系列模型&#xff0c;参数规模分别为270M、450M、1.1B和3B。与此同时&#xff0c;微软也推出了Phi-3系列模型&#xff0c;其中mini版本的参数…

数字孪生技术在垃圾焚烧处理中的可视化应用

在迈向智慧城市的进程中&#xff0c;数字孪生技术在垃圾处理领域展现出了巨大潜力。特别是在垃圾焚烧过程的管理和优化上&#xff0c;数字孪生垃圾焚烧可视化技术已成为一项革命性的进步。 通过 HT 构建虚拟的垃圾焚烧模型&#xff0c;实时映射和模拟实际焚烧过程中的各项关键…

Android Studio查看xml文件的修改时间和记录

Android Studio查看xml文件的修改时间和记录 Android Studio里面如果是Java/Kotlin编写界面&#xff0c;可以点击函数开头上面的提交在直接&#xff0c;然后在编辑界面的左侧查看历史时间上的修改记录&#xff0c;但是xml文件里面没有直观的这样操作方式。 但xml里面可以通过快…

专业的保密网文件导入导出系统,让文件流转行为更可控安全

军工单位因其涉及国防安全和军事机密&#xff0c;对保密工作有极高的要求&#xff0c;通常会采取严格的网络隔离措施来保护敏感信息和提高网络安全性。常见的方式是通过物理隔离将网络彻底分隔开来&#xff0c;比如保密网和非保密网。网络隔离后&#xff0c;仍有数据交换的需求…

怎么在家访问公司内网?

在当前的疫情情况下&#xff0c;越来越多的公司开始允许员工在家办公&#xff0c;这就需要解决一个问题&#xff1a;如何在家访问公司的内网资源呢&#xff1f;今天我将介绍一种解决方案——使用【天联】组网&#xff0c;它具有许多优势。 【天联】组网的优势 无网络限制&#…

Pytorch 实现情感分析

情感分析 情感分析是 NLP 一种应用场景&#xff0c;模型判断输入语句是积极的还是消极的&#xff0c;实际应用适用于评论、客服等多场景。情感分析通过 transformer 架构中的 encoder 层再加上情感分类层进行实现。 安装依赖 需要安装 Poytorch NLP 相关依赖 pip install t…

迅为RK3568开发板资料说明4750+页专属文档专为3568编写

iTOP-3568开发板采用瑞芯微RK3568处理器&#xff0c;内部集成了四核64位Cortex-A55处理器。主频高达2.0Ghz&#xff0c;RK809动态调频。集成了双核心架构GPU&#xff0c;ARM G52 2EE、支持OpenGLES1.1/2.0/3.2、OpenCL2.0、Vulkan1.1、内嵌高性能2D加速硬件。 内置独立NPU,算力…

探索希尔排序算法:优雅而高效的增量排序

在计算机科学领域&#xff0c;排序算法是一项至关重要的技术&#xff0c;在各种应用场景中都扮演着重要角色。而希尔排序算法作为一种增量排序方法&#xff0c;在实际应用中展现了其优雅而高效的特性。本文将深入探讨希尔排序算法的原理、实现细节以及优化方法&#xff0c;带您…

YOLOv8改进 | 主干篇 | 2024.5全新的移动端网络MobileNetV4改进YOLOv8(含MobileNetV4全部版本改进)

一、本文介绍 本文给大家带来的改进机制是MobileNetV4&#xff0c;其发布时间是2024.5月。MobileNetV4是一种高度优化的神经网络架构&#xff0c;专为移动设备设计。它最新的改动总结主要有两点&#xff0c;采用了通用反向瓶颈&#xff08;UIB&#xff09;和针对移动加速器优化…