Kafka集群模式核心概念

news2024/11/15 23:03:54

文章目录

    • 1.Kafka集群模式下Broker|主题|分区|副本的概念
      • 1.1.Broker|主题|分区|副本的概念
      • 1.2.创建一个Topic指定3个副本数
      • 1.3.多副本的Topic详细信息描述
    • 2.集群模式下以消费者组消费Topic中各分区消息的概念
      • 2.1.分消费者组消费各分区的概念
      • 2.2.集群模式下消息的发送和消费
    • 3.Kafka集群中各组件的概念
      • 3.1.Controller组件
      • 3.2.Reblance机制
      • 3.3.HW和LEO的概念

1.Kafka集群模式下Broker|主题|分区|副本的概念

1.1.Broker|主题|分区|副本的概念

Broker、主题、分区在的概念我们已经全部都了解了,下面来详细描述一下副本的概念。

所谓的副本类似于备份,在创建Topic主题时,需要指定该Topic主题的副本数量,这个副本数量一般是按照集群中Broker的节点数量为依据的,如果集群中有三台节点,那么就存在3个Broker,创建Topic主题时,就指定副本数为3。

Topic副本数可以理解为是分区的备份,如下图所示,主题名称叫做my-rc-topic,指定的副本数为3个、分区数为3个,Topic创建成功后,Topic的三个分区会分别在集群中每个Broker中创建一份,并且会从所有副本分区中选举出一个Leader节点作为主分区,其余各副本分区为Follower节点,拥有Leader角色的副本分区会承担生产者和消费者的读写操作,Leader会定期将数据向各个Follower副本分区进行同步,一旦Leader副本分区挂掉后,Kafka会从剩余的Follower副本分区中进行选举,选举出新的Leader节点,承担发送者和消费者的读写操作。

副本其实就用于将Topic主题中的每个分区在不同的Broker中创建多个备份节点,选举一个副本为Leader节点,其余都是Follower节点,即使集群中某个Broker坏掉,也不会影响数据的读取。

下图可以非常清楚的说明在Kafka集群模式下,Broker、主题、分区和副本是怎样的一个概念。

在集群模式下,每一个Kafka节点充当一个Broker,Broker之间通过ID号进行区分,一个主题中的多个分区会在每一个Broker中创建出副本分区,保障数据的高可靠性。

image-20220318231101620

副本分区中各个角色的作用:

在副本分区中有三个重要角色。

  • Leader:承担发送者和消费者的读写操作,负责将消息数据定期同步到Follower副本分区中,当Leader挂掉,经过主从选举,从多个Follower节点中选举出新的Leader。
  • Follower:接收Leader节点同步的数据,当Leader挂掉后,进行投票选举,成为新的Leader节点。
  • Isr:将正在同步数据的副本和数据同步完成的副本节点都存放在Isr结合中,当某一个节点的性能较差时,会被踢出Isr集合,充分保障集群中的性能。

Broker、Topic、分区、副本连贯起来的概念:

集群模式下会有很多个Broker,创建Topic主题时可以指定主题的分区有多少个,将消息数据拆分到不同的分区中进行存储,增加读写的吞吐量,然后还可以将分区创建出多个副本节点,不同的副本节点存放在不同的Broker里,副本之间进行数据上的同步,保证消息数据的高可靠性。

1.2.创建一个Topic指定3个副本数

1.创建一个多副本的Topic
[root@kafka-1 ~]# /data/kafka/bin/kafka-topics.sh --create --zookeeper 192.168.20.10:2181 --replication-factor 3 --partitions 3 --topic my-rc-topic
Created topic my-rc-topic.
`--replication-factor 3`:指定副本数为3

2.查看Topic的详细信息
[root@kafka-1 ~]# /data/kafka/bin/kafka-topics.sh --describe --zookeeper 192.168.20.10:2181 --topic my-rc-topic
Topic: my-rc-topic	PartitionCount: 3	ReplicationFactor: 3	Configs: 
	Topic: my-rc-topic	Partition: 0	Leader: 1	Replicas: 1,2,0	Isr: 1,2,0
	Topic: my-rc-topic	Partition: 1	Leader: 2	Replicas: 2,0,1	Isr: 2,0,1
	Topic: my-rc-topic	Partition: 2	Leader: 0	Replicas: 0,1,2	Isr: 0,1,2

image-20220318233832288

1.3.多副本的Topic详细信息描述

Topic: my-rc-topic	PartitionCount: 3	ReplicationFactor: 3	Configs: 
	Topic: my-rc-topic	Partition: 0	Leader: 1	Replicas: 1,2,0	Isr: 1,2,0
	Topic: my-rc-topic	Partition: 1	Leader: 2	Replicas: 2,0,1	Isr: 2,0,1
	Topic: my-rc-topic	Partition: 2	Leader: 0	Replicas: 0,1,2	Isr: 0,1,2

PartitionCount: 3 分区的数量

ReplicationFactor: 3 副本的数量

Topic: my-rc-topic 主题的名称

指定多少个分区就会打印出多少行,每一行都是一个分区的信息。

Partition: 0 分区的名称,第一个分区为0。

Partition: 1 分区的名称,第二个分区为1。

Partition: 2 分区的名称,第三个分区为2。

Partition: 0 Leader: 1 Leader副本节点位于集群中的哪一个Broker上,这里的1表示第0分区的Leader节点在Broker-1上。

Partition: 1 Leader: 2 Leader副本节点位于集群中的哪一个Broker上,这里的2表示第1分区的Leader节点在Broker-2上。

Partition: 2 Leader: 0 Leader副本节点位于集群中的哪一个Broker上,这里的0表示第2分区的Leader节点在Broker-0上。

Replicas: 1,2,0 副本所在的Broker节点是谁,1表示Broker-1,2表示Broker-2,0表示Broker-0。

Isr: 1,2,0 Isr集合,包含同步的Broker节点和已经同步完成的Broker节点,1表示Broker-1,2表示Broker-2,0表示Broker-0,第一位是该副本分区中的Leader,第二位是Controller,第三位是同步没问题的Broker。

创建完多副本后,分区的副本会在每一个Kafka节点上都进行持久化存储。

image-20220318235113905

2.集群模式下以消费者组消费Topic中各分区消息的概念

2.1.分消费者组消费各分区的概念

单分区的Topic消费概念分为单播模式和多播模式,适合单节点模式,在集群模式下会有多副本和多分区的概念,接下来我们来看看多分区下消费者消费数据的概念。

如下图所示:

Topic划分了4个Partition分区,分别是Partition0、Partition1、Partition2、Partition3,消费方有两个消费者组,消费组A中有2个消费者,消费组B中有4个消费者,同一组下的每个消费者会对不同的分区进行消费,同一组下只能有一个消费者去消费Topic中的某一个分区,这点与单播的概念一致。

image-20220319100454959

多分区消费的概念:

  • Topic中一个Partition分区只能被一个消费者组中的某一个消费者进行消费,和单播概念一致。
  • 同一组中的每个消费者都可以同时消费不同的Topic分区,但是一个Topic只能被一个组中的某一个消费者进行消费。
    • 消费者一对多,分区一对一。
  • Partition分区的数量是可以决定消费组中消费者的数量,建议统一组中消费者的数量不要超过分区的数量,最好可以和分区数量保持一致,这样一来一个消费者就可以对一个分区进行消费,当然少几个也是没有问题的,一个消费者可以对多个分区进行消费,但是消费者不要超过分区的数量,多出来的消费者不会去消费数据,反而会影响性能。
  • 如果组中某一个消费者挂了,那么二舅会触发rebalance机制,让其他消费者来消费该分区。

为什么不让消费者组中多个消费者同时消费一个分区呢?

这样做的目的是为了保证消息消费的顺序性,如果多个一组中多个消费者同时消费该分区的数据,那么就会因为网络波动的原因,从而导致消息的错误消费,影响业务逻辑。

2.2.集群模式下消息的发送和消费

1)发生消息数据

[root@kafka-1 bin]# ./kafka-console-producer.sh --broker-list 192.168.20.10:9092,192.168.20.11:9092,192.168.20.12:9092 --topic my-rc-topic
>jiangxl nihao
>
>hahaha
>
>hello

2)消费消息数据

[root@kafka-1 bin]# ./kafka-console-consumer.sh --bootstrap-server 192.168.20.10:9092,192.168.20.11:9092,192.168.20.12:9092 --from-beginning --topic my-rc-topic

image-20220319104935686

3.Kafka集群中各组件的概念

在Kafka集群模式下有三个重要组件:Controller、Rabalance、HW。

3.1.Controller组件

每个Broker启动后会向Zookeeper集群中创建一个临时序号节点,获得序号最小的那个Broker将会成为集群中的Controller节点。

Controller节点的作用如下:

  • 当集群中Topic分区中Leader副本挂掉后,Controller节点会在集群中选举出一个新的Leader,选举规则是将Isr集合中最左边的Broker选举为Leader节点。

    • 如下图所示:Isr集合中最左侧的是Leader所在的Broker号,当Leader挂掉后,Controller会在Isr集合中将挂掉的Broker删除,此时就会剩下2个Broker,最左侧的那个Broker就会成为新的Leader,如篮框所示。

    • image-20220319112253932

  • 当集群中有Broker新增或者减少,Controller会同步信息到其他的Broker。

  • 当集群中有分区新增或者减少时,Controller会同步信息给其他Broker。

3.2.Reblance机制

当消费组中的消费者没有明确指明要消费的Topic分区,或者消费者正在消费某个分区时该消费者突然挂掉,这两种情况都会触发Reblance机制。

Reblance机制会在消费者和分区的关系发生变化后,重新调整消费者消费哪个分区。

在触发Rebalance机制之前,消费者消费哪个分区有三种策略:

  • range:根据公式计算得到每个消费者消费的分区列表。
    • 触发前的公式:分区总数量/消费者数量+1。
    • 触发后的公式:分区总数量/消费者数量。
  • 轮询:所有消费者轮流消费分区中的数据
  • sticky:粘合策略,触发了Rebalance机制后,会在之前分配的基础上在做调整,不会改变之前的分配情况,只会故障的消费者关联的分区,进行分配。
    • 粘合策略必须开启,如果不开始,触发Rebalance机制后,会将正常的分区与消费者都进行重新分配,损耗集群的性能。

3.3.HW和LEO的概念

HW俗称高水位,LEO是某个副本中最后一条消息的消息位置。

HW高水位线会位于所有副本分区中数据已经同步完成的位置,如下图所示,HW高水位线就会位于消息数据4下面,消息数据5已经写入到Leader副本分区中了,但是还没有同步到其他副本中,HW高水位线此时不会往下移动产生变化,只有当消息数据全部同步完成后,HW高水位线才会更新往下移动,这时消费者才可以去消费消息5,这样做的目的是防止消息数据会丢失。

image-20220319151752188

消费者最多只能消费到HW所在的位置。另外每个副本都有HW,leader和follower各自负责更新自己的HW的状态。对于leader新写入的消息,消费者不能立刻消费,leader会等待该消息被所有ISR中的副本同步后才会更新HW,此时消息才能被消费者消费。这样就保证了如果leader所在的broker失效,该消息仍然可以从新选举的leader中获取。

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

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

相关文章

Go 语言中 Context 的作用和使用方法详解

KDP(数据服务平台)是一款由 KaiwuDB 独立自主研发的数据服务产品,以 KaiwuDB 为核心,面向 AIoT 场景打造的一站式数据服务平台,满足工业物联网、数字能源、车联网、智慧产业等行业核心业务场景下数据采集、处理、计算、…

在Azure SQL DB/Azure托管实例里快速查询各数据库大小以及每个数据库下表的大小

目录 (一)前言 (二)正文 1. 环境: 2. 查看实例下每个数据库的空间大小 (1) SQL语法 (2)运行结果 3. 查看特定数据库下每张表的大小 (1)SQ…

一个sql中的一张表,最多只会走一个索引吗

目录 先给结论 做实验 1.根据时间范围查询 什么是key_len? 2.根据时间范围和 is_delete 查询 最左匹配原则 2.根据时间范围和 blog_type 查询 如果加上id会怎么样 并不是索引一定会走 1.IN子表数量过多 2.单次查询超过30% 先给结论 先说结论,…

设计模式第14讲——享元模式(Flyweight)

目录 一、什么是享元模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现 5.0 代码结构 5.1 Bike——抽象享元类(FlyWeight) 5.2 具体享元类(ConcreteFlyWeight) 5.3 BikeFactory——享元…

layui框架学习(28:穿梭框模块)

Layui模块中的穿梭框模块transfer主要支撑穿梭框组件的显示、交互等操作。所谓穿梭框是指左右各有一个复选框列表,可以将左侧选中的项目移动到右边,后者将右侧的选中项移回左边的控件,其样式类似下图所示(参考文献5-6)…

TI AM62x工业开发板规格书(单/双/四核ARM Cortex-A53 + 单核ARM Cortex-M4F,主频1.4GHz)

1 评估板简介 创龙科技TL62x-EVM是一款基于TI Sitara系列AM62x单/双/四核ARM Cortex-A53 单核ARM Cortex-M4F多核处理器设计的高性能低功耗工业评估板,由核心板和评估底板组成。处理器ARM Cortex-A53(64-bit)主处理单元主频高达1.4GHz,ARM Cortex-M4F实…

如何使用 Flink SQL 探索 GitHub 数据集|Flink-Learning 实战营

为进一步帮助开发者学习使用 Flink,Apache Flink 中文社区近期发起 Flink-Learning 实战营项目。本次实战营通过真实有趣的实战场景帮助开发者实操体验 Flink,课程包括实时数据接入、实时数据分析、实时数据应用的场景实。并结合小松鼠助教模式&#xff…

USR-C216 WIIF连接手机

复位后连接USR-C216无线 浏览器输入10.10.100.254 账号密码为admin 客户端模式服务器地址无效,默认就行 打开手机网络调试助手选择客户端模式,输入10.10.100.254,端口8899 可以透传了 关于AT指令,先发“”,然后3s内发…

【数据管理架构】什么是 OLTP?

OLTP(在线事务处理)支持在 ATM 和在线银行、收银机和电子商务以及我们每天与之交互的许多其他服务背后进行快速、准确的数据处理。 什么是 OLTP? OLTP 或在线事务处理允许大量人员(通常通过 Internet)实时执行大量数据…

基于Vue+Node.js的宠物领养网站的设计与开发-计算机毕设 附源码83352

基于VueNode.js的宠物领养网站的 摘 要 随着互联网大趋势的到来,社会的方方面面,各行各业都在考虑利用互联网作为媒介将自己的信息更及时有效地推广出去,而其中最好的方式就是建立网络管理系统,并对其进行信息管理。由于现在网络…

【国产FPGA应用】紫光Pango Design联合 Modelsim 仿真方法

Modelsim 是 FPGA 开发中重要的 EDA 设计仿真工具,主要用于验证数字电路设计是否正确。我们经常用Xilinx的ISE或者Vivado与Modelsim进行联合仿真,其实国产FPGA开发工具也可以与Modelsim进行联合仿真,对于设计比较复杂的应用还是非常方便的&am…

创邻科技与浪潮信息KOS完成澎湃技术认证

近日,浙江创邻科技有限公司(简称:创邻科技)自主研发的Galaxybase图数据库系统与浪潮信息服务器操作系统KOS V5完成澎湃技术认证。创邻科技作为国内首个成熟的商业图数据库供应商,在同类厂商中率先完成认证。测试结果显…

vue3通过render函数实现一个菜单下拉框

背景说明 鼠标移动到产品服务上时,出现标红的下拉框。 使用纯css的方案实现最简单,但是没什么技术含量,弃之;使用第三方组件库,样式定制麻烦弃之。因此,我们使用vue3直接在页面创建一个dom作为下拉框吧。…

【经验分享】Docker容器部署方法说明

前 言 本案例适用开发环境: Windows开发环境:Windows 7 64bit、Windows 10 64bit Linux开发环境:Ubuntu 18.04.4 64bit 虚拟机:VMware15.1.0 Docker是一个开源的应用容器引擎,让开发者可打包他们的应用以及依赖包…

rust持续学习 声明宏

学习记录,都是学自圣经,macrobook啥的 https://doc.rust-lang.org/reference/macros-by-example.html macro_rules! bar {(3) > {println!("3");};(4) > {println!("4");}; }这个是入门例子,有点像match 调用就是…

【Java|多线程与高并发】线程池详解

文章目录 1. 线程池简介2. 创建线程池3. 工厂模式简介4. 线程池的使用5. 实现线程池6. ThreadPoolExecutor的构造方法讲解7. 线程池的线程数量,如何确定? 1. 线程池简介 Java线程池是一种用于管理和重用线程的机制,它可以在需要执行任务时,从线程池中获…

二叉树遍历方法——前、中、后序遍历(java)

二叉树结构: static class TreeNode{public char val;public TreeNode left;public TreeNode right;public TreeNode(char val) {this.val val;}Overridepublic String toString() {return this.val"";}} 一、前序遍历 前序遍历是一种访问二叉树的每一…

【shell脚本】沐风晓月跟你聊聊shell脚本中的case实战

前言 前面我们已经介绍了while及for循环,结合if语句可以构建一些简单的控制面板及菜单脚本,今天我们来探讨下case语句。 case选择语句,主要用于对多个选择条件进行匹配输出,与if elif语句结构类似,通常用于脚本传递输…

阵列模式合成第 I 部分:清零、窗口化和细化(附源码)

一、前言 本示例说明如何使用相控阵系统工具箱解决一些阵列合成问题。在相控阵设计应用中,通常需要找到一种方法来逐渐减小晶片响应,以使最终的阵列阵列模式满足某些性能标准。典型的性能标准包括主瓣位置、零位置和旁瓣电平。 二、使用旁瓣消除器消除干…

两个进程定时通过共享内存进行通信

进程1-client #include <stdio.h> #include <stdlib.h> #include <sys/ipc.h> #include <sys/shm.h> #include <unistd.h> #include <string.h>#define SHM_SIZE 10 * 1024 * 1024 // 共享内存大小为10M #define WRITE_INTERVAL 1 …