Kafka 分区机制详解

ClickHouse Kafka表引擎使用详解 前言 项目采用Flink、Kafka、Clickhouse的实时数仓架构,数据由Kafka接入,经过Flink处理,写入Clickhouse。 初期直接由Flink写入Clickhouse,经常会出现分区太多合并不来等意外情况,效果不是很好。而且数据也需要共享到其他地方,故直接写入CK对我们来说不是很好的选择。 于是先将数据写入Kafka,之后由Kafka对数据进行分发。 从Kafka写入CK有很多种方法: 使用Flink Connector 使用github上开源的kafka ck组件 使用CK的Kaf 阅读详情

一、前言

由于负责产品的性质原因,我需要大量接触 Kafka,因此对 Kafka 的使用和原理都有一定的了解!

这一期来聊聊 Kafka 非常非常重要的分区机制:

  • 主题与分区之间的关系 ✅
  • 分区工作的原理流程 ✅
  • 如何创建一个多分区的主题 ✅

二、主题与分区

在第一期的时候聊过,Kafka 是基于发布-订阅模型而构建,生产者向主题发送消息,而消费者则通过订阅主题来消费消息。

而主题里面又可以创建多个分区,新建的主题默认只有一个分区。

我们来看看 Kafka 的基础架构:

一个 Kafka 集群内有若干个「实例」,当我们创建一个「主题」时,会默认在「主题」内创建一个「分区」,我们的消息就是发往这个「分区」中。

但一个「主题」内可不可以创建多个「分区」呢?

当然可以,我们可以通过修改配置文件去控制「主题」创建时创建的「分区数」,也可以在创建「主题」的时候,指定「分区数」。多个「分区」可以分布在不同的「实例」中,但「分区」本身是不可分割的,同一个「分区」不可能出现在两个「实例」中。

到这里就很清楚了,一个主题内可以有多个分区,而不同的分区可以分布在不同的实例,生产端和消费端可以指定主题,也可以指定主题中的若干个分区来工作。

四、分区的多副本机制

Kafka 为了提高消息存储的安全性和容灾能力,引入了多副本机制。

多副本机制是针对 Partition 设计的,可以这么理解,Kafka 为 Partition 拷贝了多份,并且这个份数是可以指定的,多份 Partition 中属于主从关系,只有一个 Leader,其他叫 Follower,当 Leader 不行了,挂了,会从所有Follower中挑一个合格的上位,与 Leader 同步程度达不到要求的都是不够资格的小弟,不参加 Leader 选举。

我们平时其实只跟 Leader 打交道,发送的消息都在 Leader 中,消息提交到 Leader 后其他 Follower 会自动从 Leader 中拉取同步。

1. Leader 选举原理

我们先来了解一个概念:ISR(In-sync Replicas)同步的副本集合,在这个集合内的副本被认为是完全同步的,包括 Leader 也存在于这个集合中。

Broker 有一个参数叫 replica.lag.time.max.ms,用于控制 Follower 能落后 Leader 多少时间,落后不超过这个时间的副本 Kafka 就认为它是同步的,落后超过这个时间该 Follower 会从 ISR 中踢出。

若是 Leader 挂了,集合也空了,这个分区就不可用了,因此,生产环境中,合理的配置副本也是非常重要的一项。

2. 选举规则

  1. ISR 不为空,直接从 ISR 中选举
  2. ISR 为空,Kafka 也可以从不在 ISR 中的存活副本中选举,这个过程称为 Unclean 领导者选举

对于第二个选项,可以通过 Broker 端的 unclean.leader.election.enable 参数来控制。

开启 Unclean 领导者选举可能会造成数据丢失,但好处是,它使得分区 Leader 副本一直存在,不至于停止对外提供服务,因此提升了高可用性,不推荐,毕竟可用性可以通过其他手段来提升。

反之,禁止 Unclean 领导者选举的好处在于维护了数据的一致性,避免了消息丢失,但牺牲了高可用性。

三、分区的工作流程

生产者分区器根据参数来区分数据要发往的分区:

  1. 有 Partition:直接将数据存入对应的分区
  2. 没有 Partition 有 Key:将通过 Key的Hash值 % 主题的分区数 来得到一个 Partition 值
  3. 没有 Partition 没有 Key:采用 Sticky Partition(粘性分区器),会随机选择一个分区,并尽可能的一直使用这个分区,待该分区的 ProducerBatch 满了或者已完成,再随机选择其他的分区(不会重复使用上一次的分区)

消费者可以用两种方式消费分区里面的数据:

  1. 指定主题,不指定分区:该主题下的所有分区的数据,订阅该主题的消费者都能消费到,但需要注意的是,不同分区之间的数据是不能保证消费顺序的
  2. 指定主题,指定分区:可以指定任意分区进行消费

五、实战:创建一个多分区的主题

1. 使用命令行创建

以 Windows 脚本为例,从官网获取安装包,跟需要操作的 Kafka 版本对上即可。

使用 Kafka 安装包中自带的命令行脚本创建主题:

# 创建一个名为「test1」 的主题,其拥有五个分区,每个分区拥有一个副本
.\kafka-topics.bat --bootstrap-server localhost:9092 --create --topic test1 --partitions 5 --replication-factor 1
​
# 查看主题「test1」的详情
.\kafka-topics.bat --bootstrap-server localhost:9092 --describe --topic test1
​
Topic: test1    PartitionCount: 5       ReplicationFactor: 1    Configs: segment.bytes=1073741824,max.message.bytes=157286400,delete.retention.ms=1800000
        Topic: test1    Partition: 0    Leader: 0       Replicas: 0     Isr: 0
        Topic: test1    Partition: 1    Leader: 0       Replicas: 0     Isr: 0
        Topic: test1    Partition: 2    Leader: 0       Replicas: 0     Isr: 0
        Topic: test1    Partition: 3    Leader: 0       Replicas: 0     Isr: 0
        Topic: test1    Partition: 4    Leader: 0       Replicas: 0     Isr: 0

2. 使用 API 创建

引入依赖:

<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka-clients</artifactId>
    <version>3.2.0</version>
</dependency>

使用 AdminClient 创建一个名为「test2」 的主题,其拥有五个分区,每个分区拥有一个副本:

import java.util.Collections;
import java.util.Properties;
public class Test {
    public static void main(String[] args)  {
        Properties properties = new Properties();
        properties.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "10.0.0.110:9092");
        // 创建 AdminClient 对象
        AdminClient adminClient = AdminClient.create(properties);
        adminClient.createTopics(Collections.singletonList(new NewTopic("test2", 5, (short) 1)));
        // 关闭资源
        adminClient.close();
    }
}

查看主题详情:

.\kafka-topics.bat --bootstrap-server 10.0.0.110:9092 --describe --topic test2
​
Topic: test2    PartitionCount: 5       ReplicationFactor: 1    Configs: segment.bytes=1073741824,max.message.bytes=157286400,delete.retention.ms=1800000
        Topic: test2    Partition: 0    Leader: 0       Replicas: 0     Isr: 0
        Topic: test2    Partition: 1    Leader: 0       Replicas: 0     Isr: 0
        Topic: test2    Partition: 2    Leader: 0       Replicas: 0     Isr: 0
        Topic: test2    Partition: 3    Leader: 0       Replicas: 0     Isr: 0
        Topic: test2    Partition: 4    Leader: 0       Replicas: 0     Isr: 0
【kafka】Kafka消费者分区分配策略详解 Kafka Consumer用来从Kafka集群拉取数据,通过允许多个进程共同分担消费/处理数据的工作,这些进程可以运行在一台机器或者多台机器。默认常见的消费原理如下Consumer Group (CG):消费者组,由多个consumer组成。形成一个消费者组的条件,是所有消费者的 groupid 相同。消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费。消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。 阅读详情

相关推荐

Kafka整理-分区(Partition)机制

Kafka的分区机制为其高性能、高吞吐量和高伸缩性提供了基础,同时也支持了复杂的消费者模式和数据处理策略。每个分区在物理上是一个有序、不可变的消息序列,存储为一系列连续的、有序的日志文件。在Kafka中,分区是主题(Topic)的子集,每个主题可以被分割成多个分区。Kafka支持不同的分区分配策略,如轮询分配或按照消费者的数量均匀分配分区。分区数量的选择取决于多种因素,包括预期的吞吐量、Broker的数量和性能。分区使得多个消费者可以同时从不同的分区读取数据,从而实现数据的并行处理。

不务正业的猿 526

kafka的分区详解

kafka的分区副本机制分区Leader选举☆分区重新分配☆创建集群和主题查看主题详情再添加一个分区再添加一个节点重新分配修改副本因子分区策略RangeAssignor分配策略RoundRobinAssignor分配策略StickyAssignor自定义分配策略 主要内容 : kafka分区的管理 ; 分区重新分配 Kafka可以将主题划分为多个分区(Partition),会根据分区规则选择把消息存储到哪个分区中,只要 如果分区规则设置的合理,那么所有的消息将会被均匀的分布到不同的分区中,这样就实

学无止境 2万+

LCD驱动芯片——BL55072A驱动程序

初始化子程序: START 0x7C; I2C子地址 0xEA;ICSET,软件复位芯片 0xC0;MODSET,关显示 0xF0;BLKCTL,关闪烁 0xA3;DISCTL,80Hz Line inversion,High Power mode 0xE8;ICSET,清复位bit1 STOP 显示刷新子程序: START 0x7C;I2C子地址 0xF0;BLKCTL,关闪烁 0xA3;DISCTL,80Hz Line inversion,High Power mode 0xE8或0xEC;ICSE

love421的博客 3176

Kafka分区

一、分区的概念规则 1、每个topic(逻辑名称)由一个或多个分区组成,分区是topic物理上的分组,在创建topic时被指定 2、一个partition只对应一个Broke,一个Broke可以管理多个partition 3、由消息在顺序写入,在同一个分区内的消息是有序的,在不同的分区间,kafka并不保证消息的顺序(所以kafka消息是支持跨分区的) 3.1 同一个主题下,不同分区所包含的内容是不同的,每个消息被添加到分区当中时,会被 分配一个偏移量(Offset),它是消息在分区当中的唯一编号,kafk

m0_52831800的博客 6414

Silvaco Atlas从头开始(四)——定义材料参数和模型

这部分是关于定义材料参数和模型。

qsz1425AWD2121的博客 4652

conda环境的复制、备份操作

请确保将 source_env 替换为你要复制的现有环境的名称,并将 target_env 替换为你要创建的新环境的名称。要备份一个Conda虚拟环境,你需要将环境的配置信息和依赖包列表保存起来,以便在需要的时候能够重新创建相同的环境。要将现有的 conda 环境复制为其他环境,可以使用 conda create 命令并克隆已存在的环境。

Dollhan的博客 3774

kafka分区机制详解

本文来说下SpringBoot整合kafka之kafka分区实战 文章目录概述 概述

wh柒八九的博客 1971

新鲜出炉,ECCV2024.9.25 首次提出基于 YOLO 目标检测的无源域自适应

本文提出了首次使用YOLO系列单发探测器的SFDA方法。本文方法采用了一个带有学习的、目标领域特定的增强和一种新的通信机制的师生框架来稳定训练,减少了对模型选择中带注释的目标数据的依赖,这对现实世界的应用至关重要。SF-YOLO 优于所有基于Faster R-CNN的SFDA方法,甚至一些使用源数据的基于UDA yolo的方法。

m0_63294504的博客 2676

详解Kafka分区机制原理|Kafka 系列 二

Kafka 系列第二篇,详解分区机制原理。为了不错过更新,请大家将本号“设为星标”。点击上方“后端开发技术”,选择“设为星标” ,优质资源及时送达上一篇文章介绍了 Kafka 的基本概念和术语,里面有个概念是 分区(Partition)。kafka 将 一个Topic 中的消息分成多份,分别存储在不同的 Broker 里,这每一段消息被 kafka 称为分区,其中每条消息只会保存在一个分区中。如果...

Daniel的博客 3039

100天精通Oracle-实战系列(第33天)RHEL 7 安装 Oracle 12CR2 RAC 数据库

100天精通Oracle-实战系列(第33天)RHEL 7 安装 Oracle 12CR2 RAC 数据库

LuciferLiu_DBA 3452

【机器视觉】基于深度学习的托盘PCB识别与计数(有无、正反)

工业机器视觉是指在制造业和工业环境中使用计算机视觉技术来执行检测、测量、识别和控制任务。它结合了硬件(如相机、镜头、光源)与软件(图像处理算法)来自动完成传统上需要人工视觉的任务,从而提高生产效率、产品质量以及工作安全性。工业机器视觉系统通常具有高精度、高速度和高可靠性,能够适应恶劣的工作环境。

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 1万+

详解Kafka通过幂等性实现分区消息不重复的机制

详解Kafka通过幂等性实现分区消息不重复的机制

m0_66220639的博客 954

Ceph入门到精通-更换osd、扩容osd

【代码】Ceph入门到精通-更换osd、扩容osd。

隔壁老瓦的专栏 1548

Kafka的分区和副本机制详解

1

LBJ_小松鼠的博客 668

​​光流结合深度学习实现物体运动方向判断

光流计算:提取每一帧视频中像素的运动信息,生成光流图。光流特征提取:通过特定的预处理,将光流图转换为深度学习模型可用的输入格式。深度学习模型设计:构建一个卷积神经网络(CNN)或其他适合的深度学习架构,利用光流特征进行运动方向分类。模型训练与推理:对网络进行训练并使用训练好的模型判断运动方向。光流与深度学习结合的运动方向判断技术在多个领域具有广泛的应用前景。通过光流提取像素级动态信息,并利用深度学习模型学习高层次特征,可以实现高精度的运动检测与方向判断。

matlab_python22的博客 322

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

kafka架构:分区机制详解

消息是通过topic为单位进行管理; 分区机制可以打破单机存储容量的限制,理论上可以存储海量的数据; 分区数越大,并发写入的性能就越高。这也是kafka适合用于高并发和大数据领域的关键; 每个topic对应一组日志分区数据; 每一组日志分区是一个有序的不可变的日志序列,分区中的每一个record都被分配了唯一的序列编号称为是offset; kafka会持久化所有发布到topic中的record信息,record的默认有效期是7天; kafka会定期检查日志文件,将过期的数据从log中移除; kafka...

学亮编程手记 856

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

详解kafka消息分区机制原理

背景 kafka如何支撑海量消息的集中写入? 答案就是消息分区。 核心思想是:负载均衡,采用合适的分区策略把消息写到不同的broker上的分区中; 其它的产品中有类似的思想。 比如monogodb, es 里面叫做 shard; hbase叫region, cassdra叫vnode; 消息的三层结构 如下图: 即 topic -> partition -> m...

weixin_46864437的博客 649

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Kafka分区机制详解:原理、策略与应用

Kafka分区机制详解:原理、策略与应用

虽非技冠群英首,愿与同道共长歌; 大鹏一日同风起,扶摇直上九万里; 1437

Kafka的Rebalance机制与分区分配策略详解

Kafka 中的 Rebalance(重平衡)机制是在消费者组的成员发生变化时,重新分配分区以确保每个消费者都能处理适当数量的分区。这种机制对于保证数据消费的平衡性和系统的高可用性至关重要。有新的消费者加入消费者组时,需要重新分配分区,以便新的消费者也能接收到数据。消费者退出或崩溃时,组内的分区需要重新分配给剩余的消费者。主题的分区数量增加或减少时,也会触发 Rebalance。如果消费者组的协调器发生变化,也会触发 Rebalance。

RLCRAFT的博客 1511

Kafka分区机制详解:从高并发原理到生产实践

消息队列是分布式系统解耦与削峰的核心组件,而Kafka之所以能在高吞吐场景下稳定支撑海量数据流转,关键就在于其分区(Partition)机制。分区将Topic拆分为多个独立有序的日志段,让生产者可以并行写入、消费者可以并发拉取,从而突破单机性能瓶颈,实现水平扩展。理解分区不仅要看存储与偏移量的底层设计,还要掌握生产者分区器如何高效分流、消费者组如何与分区匹配,以及副本机制如何保障高可用。深入剖析分区的分配策略、Rebalance触发条件、分区数估算方法和常见运维坑点,对构建可靠的大数据管道至关重要。无论是应

weixin_34079177的博客 210

【Kafka系列 08】生产者消息分区机制详解

我们在使用 Apache Kafka 生产和消费消息的时候,肯定是希望能够将数据均匀地分配到所有服务器上。比如很多公司使用 Kafka 收集应用服务器的日志数据,这种数据都是很多的,特别是对于那种大批量机器组成的集群环境,每分钟产生的日志量都能以 GB 数,因此如何将这么大的数据量均匀地分配到 Kafka 的各个 Broker 上,就成为一个非常重要的问题。

Hyatt的博客 1197

大数据面试必备:Kafka分区副本机制详解:原理与配置指南

Kafka中的分区副本机制主要通过在每个主题(Topic)的分区(Partition)上维护多个副本(Replica)来实现数据的高可用性和容错性。每个分区会有一个领导者副本(Leader),负责处理该分区的所有读写请求,另外还有若干个跟随者副本(Follower),它们会从领导者副本中异步复制数据。如果领导者副本出现故障,Kafka会自动从跟随者副本中选举出一个新的领导者,从而保证系统的高可用性。

qq_58299462的博客 1351

Kafka分区机制详解:从并发模型到性能调优

消息队列是实现系统解耦与流量削峰的核心组件,而并发吞吐与数据有序性往往难以兼得。Kafka 通过分区机制巧妙化解这一矛盾:Topic 是逻辑分类,分区才是物理载体,每个分区独立追加写日志,将单一数据流拆分成多份并行通道。生产端按路由策略将消息分散到多个分区,消费端由消费者组均匀分配分区,实现多线程并行读写,从而支撑百万级消息吞吐。同时,同一分区内严格有序,通过业务键路由可保证局部顺序,兼顾用户体验与横向扩展。分区数设计、副本同步、消费者分配策略以及常见数据倾斜、Rebalance 问题,都是实际工程中影响性

weixin_29056701的博客 121

Kafka核心概念详解:Broker、分区与消费组机制

消息队列是分布式系统实现异步解耦、流量削峰和可靠投递的核心组件。作为业界主流的分布式消息系统,Kafka凭借其高吞吐、低延迟和可回溯性,成为海量数据流场景的事实标准。其底层原理围绕Broker、Topic、Partition与Consumer Group展开:消息按主题分类,每个主题被切分为多个有序分区以支撑水平扩展;消费组通过Rebalance机制动态协调消费者与分区的绑定关系,实现负载均衡和故障转移。凭借Offset与ISR副本机制,Kafka既支持数据的重复消费与回溯订正,又能在节点故障时保障高可用。

weixin_29062255的博客 165

Kafka日志存储模型详解:分区、Segment与索引机制

在高吞吐消息队列与分布式系统中,数据如何可靠高效地落盘并快速读取,是设计存储引擎的核心命题。Kafka采用了一种简洁而强大的日志存储模型:每个分区对应一个目录,目录内由多个Segment日志段文件组成,消息以追加写入方式顺序落盘,从而大幅提升磁盘IO效率。通过稀疏偏移量索引与时间戳索引,消费者能够快速定位消息位置,无需全量扫描。同时,Kafka借助操作系统页缓存实现读写加速,并配合delete与compact两种日志清理策略管理数据生命周期。无论是解决消息积压、消费延迟,还是优化集群磁盘利用率,理解这套模型

weixin_29064009的博客 274
上一篇: 百万年薪架构师谈:掌握这【6+2】学习路线 进BAT拿月薪40k真不难
下一篇: RocketMQ源码分析:延迟消息
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值