Kafka第一篇——内部组件概念架构启动服务器zookeeper选举以及底层原理

news2024/11/28 0:38:36

目录

引入 ——为什么分布式系统需要用第三方软件?

JMS 

对比 

组件

架构推演——备份实现安全可靠 ,

Zookeeper 

controller的选举

 controller和broker底层通信原理

BROKER内部组件 

​编辑 topic创建


引入 ——为什么分布式系统需要用第三方软件?

 这里会讨论线程与线程之间的通信以及进程与进程之间的通信。

  • 1.线程与线程之间通信,每个线程都有自己的栈空间,共享堆完全可以,通过共享内存来实现消息共享,如下图。

存在的问题:但是如果一个线程t1给堆内存发布数据比较快,接收数据的t2线程接收比较慢,就会导致每秒20条数据被积压来不及处理,积压数据就会导致内存不够用(对吞吐量造成影响,导致系统不稳定,严重情况会导致系统不可用),内存溢出,然后引入磁盘文件,虽然磁盘文件存储的数据比内存多,但也有上限。

  • 2.进程和进程之间通过socket(网络数据流)来通信 ,两个不同的进程申请到的内存是不一样的,所以不能像线程那样去共用内存,

存在问题:第一个进程用于生产数据,第二个进程和第三个进程用来接收数据,如果进程1的数据要同时发给进程二和进程3,那进程1就要同时发送两份数据.如果是进程一发送不同的数据给进程2和进程3,就会增加进程1的逻辑处理难度,会增加系统响应的时间,消耗更多的系统资源,耦合性也高·。如果数据重复发送,也会对系统吞吐量造成影响,最根本还是系统资源不太够。这里谈到的问题也就是进程之间直接交互造成的问题,即耦合性高。

所以就引入中间缓冲区——第三方软件,又称为消息中间件,缓冲区的目的就是中转和临时存储,从而降低系统之间的耦合性。解耦合,负载均衡,削峰填谷。

JMS 

kafka没有完全遵循jms思想,但是借鉴了jms思想。

JMS(Java Message Service)是Java平台上用于消息传递的API标准。它定义了一种用于创建、发送、接收和读取消息的方式,使得不同应用程序之间可以通过消息进行通信。JMS的核心思想包括以下几个方面:

  1. 消息模型:JMS定义了两种基本消息模型,即点对点模型(Point-to-Point)和 发布/订阅模型(Publish/Subscribe)。点对点模型中,消息被发送到特定的队列,只有一个消费者可以接收并处理消息。发布/订阅模型中,消息被发送到主题(Topic),多个消费者可以订阅主题并接收消息。

  2. 消息生产者:负责创建并发送消息到消息中间件。消息生产者将消息发送到指定的队列或主题,并且可能会设置消息的属性、头信息等。

  3. 消息消费者:负责从消息中间件接收并处理消息。消息消费者可以根据需要从特定队列或主题中订阅消息,并在消息到达时进行处理。

  4. 消息中间件:提供消息传递的基础设施,负责存储、路由和传递消息。消息中间件通常是一个独立的服务器,它提供了可靠的消息传递机制,以及高效的消息路由和处理能力。暂时存储和中转。

Kafka借鉴了JMS的一些思想,比如消息模型中的发布/订阅模型,以及消息的生产者和消费者模式。但Kafka与JMS也有一些不同之处,比如Kafka更加注重持久化和水平扩展等方面的设计。因此,虽然Kafka没有完全遵循JMS的思想,但在某些方面受到了JMS的启发和借鉴。

各类消息中间件对比 

 

 在 单机吞吐量 方面,activemq,rabbitmq要比rocketmq,kafka第一个数量级,rocketmq和Kafka都是十万级吞吐量,支持高吞吐。

在 消息可靠性 方面,rocketmq和Kafka可以通过参数优化配置,做到0丢失。rabbitmq基本不丢失,activemq有较低的概率丢失数据。

在 时效性 方面,rabbitmq可以达到微秒级别,其他都是毫秒级别。

在 topic主题分区数量对吞吐量的影响 方面上,对于rocketmq,topic数量可以达到几百/几千量级,但是对于Kafka,topic数量可以达到几百,如果再多的话,吞吐量会大幅度下降。

在 可用性 方面,rocketmq和Kafka的可用性非常高,支持分布式架构,rabbitmq和activemq的可用性高,支持分布式架构,

 功能支持 方面以及其他方面。

rocketmq是阿里开发,社区活跃度不高,mq功能较为完整,分布式,扩展性好。

Kafka是开源的,社区活跃度极高,高吞吐量,只是借鉴了jms规范,并没有完全的遵守,所以只支持简单的mq功能,在大数据领域应用广泛。、

rabbitmq开源稳定,社区活跃度高,并发能力强,延时低,性能极好。

通过上面各种消息中间件的对比,大概可以了解,在大数据场景中我们主要采用 kafka 作为消息中间件,而在JaveEE开发中我们主要采用 ActiveMQ、RabbitMQ、RocketMQ作为消息中间件。如果将 JavaEE和大数据在项目中进行融合的话,那么 Kafka 其实是一个不错的选择。

组件

消息队列就是内存模型,为了数据存储更加可靠,就不能只存储在内存中,引入磁盘文件。这样既保证了数据的高效,也保证了安全可靠。为了不仅仅能存储数据,并且保证数据的顺序不会被打乱,引入了偏移量,方便数据的有序访问,就可以按照某个标记或者某种标记的顺序进行访问,

以下是 Kafka 的一些主要组件:将JMS中的message换成record。

  1. Broker:Kafka 集群中的每个节点都是一个 Kafka Broker。Broker 负责存储和管理数据,以及处理来自生产者和消费者的请求。

  2. Topic:在 Kafka 中,消息被发布到特定的主题(Topic)。每个主题都是一个逻辑的数据流,可以有一个或多个生产者向其发布消息,并且可以有一个或多个消费者从中读取消息。每个主题可以有多个分区,从而实现消息的水平扩展和并行处理。

  3. Producer:生产者是将消息发布到 Kafka 主题的应用程序。生产者负责将消息发送到 Kafka Broker。

  4. Consumer:消费者是从 Kafka 主题中读取消息的应用程序。消费者订阅一个或多个主题,并从中拉取消息。

  5. Consumer Group:消费者组是一组消费者的集合,它们共同消费一个或多个主题中的消息。Kafka 使用消费者组来实现消息的负载均衡和水平扩展。

  6. ZooKeeper:ZooKeeper 是 Kafka 集群的协调服务。它用于管理和协调 Kafka Broker 的状态、主题配置和消费者组的信息。

  7. Partition:每个主题可以分成多个分区,每个分区在物理上由一个或多个 Broker 托管。分区使得主题能够水平扩展,允许 Kafka 处理大规模数据流。

  8. Replication:Kafka 使用副本来提供容错性和高可用性。每个分区都有一个或多个副本,这些副本被分布在不同的 Broker 上,以防止数据丢失。

这些组件共同构成了 Kafka 的核心架构,使其成为一个高效、可靠的流处理平台。

bin/kafka-topics.sh --create --topic <topic_name> --bootstrap-server <bootstrap_server_address> --partitions <num_partitions> --replication-factor <replication_factor>

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

架构推演发展历程——备份实现安全可靠 

🤔1. 分析下图架构存在的问题:

当只有一个节点broker,当他宕机了,其他consumer就发从.log磁盘文件中获取数据了,甚至有可能数据还没存到文件中就丢失了。所以不行。引入横向扩展(增加集群)或者纵向扩展(增加系统资源配置,采用io效率更好的固态硬盘)。这里纵向扩展是解决不了问题的,采用横向扩展增加多个broker。这种可以在一定程度缓解io热点问题但不能解决,如下图:其实并没有解决,因为从同一个topic中进行获取。

🤔2.  所以引入对topic进行分区partition,并用不同的标记进行区分。此时consumer就可以订阅到相关主题中的所有数据如图1.2,

1.2
🤔3.    但是观察1.2图,相当于consumer发送了更多的请求,那这个还是不行呀,于是kafka 将多个消费者当作一个整体对主题进行消费,

🤔4.  当partition-1宕机,可以发现即使数据保存在文件中也不是完全可靠安全的,

所以进行交叉备份,kafka称之为副本,多个副本中只有一个可以进行读写,其他都是用来备份,

小结:

1.多个节点broker形成集群;

2.分区(编号);

3. 副本leader和follower

不能因为某个节点由于网络或者某些问题宕掉 而导致整个集群不可用,所以一般在所有broker中会选择一个管理者

在Kafka中,每个主题被分成一个或多个分区,每个分区可以有多个副本(leader,follower)。这些副本分布在不同的Kafka节点上,确保了数据的冗余和容错性。当主题中的消息被发布到一个分区时,这些消息会被复制到该分区的所有副本中。这意味着即使某个节点发生故障,仍然可以从其他节点的副本中获取数据,确保了系统的高可用性和持久性。

因此,在Kafka中,副本的概念实际上是一种备份机制,它确保了数据的可靠性和可恢复性。每个副本都可以提供数据的读写操作,这样就实现了数据的高可用性和负载均衡。

kafka中的broker(节点)相当于一台服务器,用于存储和管理生产者发送的消息以及消费者获取的消息。每个Broker都有一个唯一的ID,并且可以在集群中进行扩展和复制,以提供高可用性和容错性。存储处理负载均衡

 controller控制整个集群,某个节点出现问题对集群影响不大,但是如果controller出现问题就会影响很大,所以1.管理者备份,   2让节点都可能做管理者,zookeeper选举

Zookeeper ,Znode

 每个Kafka 的broker都会在Zookeeper中注册一个节点znode,用于存储broker的元数据信息,znode包含了broker的id信息,主机号,端口号,znode还扮演着协调集群的各种操作,如领导选举,分区分配,副本管理,Kafka集群中的broker们通过与ZooKeeper交互,可以实时感知集群的状态以及变化,从而协同工作并保持整个集群的稳定性和可靠性。

  1. 集群协调: Zookeeper 管理 Kafka 集群中的 broker 节点,并协调它们的工作。它负责选举 leader,维护集群的元数据以及监控 broker 的健康状态。

  2. Leader 选举: 在 Kafka 中,每个分区都有一个 leader broker 负责处理读写请求,而其他副本(replica)只是用来备份数据。Zookeeper 负责协调 leader 的选举过程,确保在 leader 失效时能够快速选举出新的 leader。

  3. 元数据管理: Kafka 集群的元数据包括 topic、partition、replica 等信息。Zookeeper 负责存储和维护这些元数据,以及通知 broker 有关元数据变更的消息。

  4. 消费者组管理: Zookeeper 也负责管理 Kafka 消费者组的状态。它跟踪每个消费者的偏移量(offset),确保每个消费者从正确的位置开始消费消息。

  5. 心跳检测: Zookeeper 监控 Kafka 集群中各个节点的健康状态,包括 broker 和消费者。它定期发送心跳消息,以确保集群中的各个节点都处于正常运行状态。

 kafka连接Zookeeper就会创建节点,kafka就可以进行数据的存储和访问,但是创建节点只能创建一次,持久性节点:kafka切断和zookepper之间的连接,节点自动被删除就是临时(黄色)节点,否则就是持久化节点。

znode节点有自动监听功能,连接超时数据变化,回调,从而对集群管理

controller的选举

,broker是kafka集群当中有很多broker,每个broker都有自己的id,对于broker启动zookeeper的时候就会出现一个黄色字体的controller_broker id=1,临时节点,关闭连接就会消失。多个集群节点的kafka会选择一个管理者,管理者作为controller,

当1挂掉,2,3都在对它建立连接请求,

对于kafka实现节点管理还用到zookeeper这样的软件,以后会根据kafka自身的算法实现集群管理从而提高性能降低耦合性。

 controller和broker底层通信原理

在 Apache Kafka 中,Controller 和 Broker 的通信是 Kafka 集群管理的核心部分。Kafka 集群由多个 brokers 组成,其中一个 broker 会被选举为 Controller。Controller 负责管理集群的元数据和各种关键的管理任务,如负载均衡、broker 故障处理、topic 分区的分配和复制等。

集群中有很多broker节点,第一个被创建的节点会被选举成为controller,

监听controller和brokers/ids不同。后者是监听子节点的变化。

 底层实现:

一部分是broker和zookeeper之间的通信,broker内部会有zookepper的客户端工具

controller与broker之间是进程之间的通信,

BROKER内部组件 

replication  Manager 副本管理器

Kafkacontroller

kafak接受数据的处理是由kafka的apis处理的 ,应用处理接口

所以我们来想一想broker到底有什么用吧!

  • 是kafka集群中的每个节点,节点就是服务器,可以用来处理生产者和消费者的请求, 存储分区 副本
  • 每个 Broker 可以存储一个或多个分区的副本,当生产者发送消息时,消息会被写入对应分区的 Leader 副本,然后通过副本同步机制复制到其他副本。
  • 生产者和消费者通过与 Broker 进行通信来发送和接收消息,Broker 之间也会进行数据的同步和复制,以保持数据的一致性和可用性。同步和复制就是副本同步机制,防止单个节点故障,提高整个机群的容错能力。

 topic创建

默认情况下,topic自动创建好,修改参数auto.create.topics.enaable,

  NewTopic newTopic = new NewTopic("my_topic", 1, (short) 1);

主题名称:._字母英文构成;

分区数量:int类型

副本因子·replicationcount:short类型 

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

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

相关文章

【知识图谱】基于neo4j开发的信息化文档分析系统(源码)

一、项目介绍 一款全源码&#xff0c;可二开&#xff0c;可基于云部署、私有部署的企业级知识库云平台&#xff0c;一款让企业知识变为实打实的数字财富的系统&#xff0c;应用在需要进行文档整理、分类、归集、检索、分析的场景。 为什么建立知识库平台&#xff1f; 助力企业…

R语言——数据与运算

练习基本运算&#xff1a; v <- c(2,4,6,9)t <- c(1,4,7,9)print(v>t)print(v < t)print(v t)print(v!t)print(v>t)print(v<t) v <- c(3,1,TRUE,23i)t <- c(4,1,FALSE,23i)print(v&t)print(v|t)print(!v)v <- c(3,0,TRUE,22i)t <- c(1,3,T…

O2OA的数据库数据库配置-使用不同用户访问Oracle时报错-表或视图不存在

在使用Oracle数据库时&#xff0c;多个O2OA服务器同一个Oracle实例中使用不同的用户启动时&#xff0c;可能会遇到数据库访问的错误。本篇阐述此类问题以及解决方案。 一、先决条件&#xff1a; 1、O2OA已经下载并且解压到指定的目录&#xff1b; 2、Oracle数据库已经完成安…

什么是 vCPU?有什么作用

vCPU 是物理 CPU 的虚拟化版本&#xff0c;是云计算的基本组成部分。这些虚拟化计算单元的一大优势是其良好的可扩展性&#xff0c;这也是它们在云托管中发挥重要作用的原因。 vCPU 有什么作用? vCPU(虚拟中央处理器)是物理CPU的虚拟化变体。换句话说&#xff0c;vCPU 是虚拟机…

数据库系统概念(第七周 第二堂)(E-R模型转关系模式)

前言 前一堂课我们深入研究了E-R模型的画法和要点&#xff0c;学习E-R模型肯定是为了给数据库表格设计提供帮助。数据库表格设计就是关系模式设计&#xff0c;数据库表就是关系模式的实例化。所以本堂课&#xff0c;我们来看E-R模型如何转为关系模式。 转化原则 转化步骤 转…

1 矢量分析与场论

目录 场就是函数 矢量函数 场的概念 矢量运算 矢量加法与矢量减法 矢量点乘 矢量叉乘 矢量混合积 场的分析方法 等值面 矢量线 场就是函数 矢量函数 场的概念 矢量运算 矢量加法与矢量减法 矢量点乘 矢量叉乘 矢量混合积 场的宏观分析 等值面 等值面之间不会…

python19 异常处理

python19 异常处理 代码 异常处理 result 0; try:num1 int(input(请输入一个整数:))num2 int(input(请输入一个整数:))result num1 / num2 except ZeroDivisionError:print(除数不能为0) except ValueError:print(不能将字符串转成整数) except BaseException:print(未知异…

远程问诊优劣势并存,满足医患需求更关键

随着互联网技术的快速发展&#xff0c;如今其已经融入到了这个社会的各个领域&#xff0c;就连医疗行业也不例外。尤其是近几年在国家政策的支持和疫情的推动下互联网医疗平台更是如雨后春笋般冒了出来&#xff0c;并且这些平台中有不少还开发了远程问诊功能&#xff0c;对于此…

CRMEB 多店商品详情页装修说明

一、功能介绍 商家可调整商品详情各板块样式&#xff0c;可根据不同的需求开启或关闭单独的板块 二、操作流程 装修 > 商品详情 三、功能说明 1、商品信息 可控制商品详情页面商品信息的显示与隐藏 2、会员信息&#xff0c;排行榜 控制商品详情页面会员信息及排行榜的…

编译原理-各章典型题型+思路求解

第2章文法和语言习题 基础知识&#xff1a; 思路&#xff1a; 基础知识&#xff1a; 思路&#xff1a; 基础知识&#xff1a; 编译原理之 短语&直接短语&句柄 定义与区分_编译原理短语,直接短语,句柄-CSDN博客 思路&#xff1a; 题目&#xff1a; 基础解释&#xff1a…

Javase.认识异常

认识异常 【本章目标】1. 异常的概念与体系结构1.1 异常的概念1.2 异常的体系结构1.3 异常的分类 2. 异常的处理2.1 防御式编程2.2 异常的抛出2.3 异常的捕获2.3.2 try-catch捕获并处理2.3.3 finally2.4 异常的处理流程 3. 自定义异常类 【本章目标】 异常概念与体系结构异常的…

04-echarts-立体柱状图扩展

柱状图扩展 一、前言二、思路1、新增面①、在drawShape方法中&#xff0c;新增一个实际左侧面&#xff0c;②、 在drawShape方法中&#xff0c;新增一个实际右侧面&#xff0c;③ 绘制 2、新增series对象① 添加实际值的左侧面和右侧面 三、效果图 一、前言 事情是这样子的&am…

java技术专家面试指南50问【java学习+面试宝典】(十)

ConcurrentHashMap实现原理 JDK1.7 : 【数组&#xff08;Segment&#xff09; 数组&#xff08;HashEntry&#xff09; 链表&#xff08;HashEntry节点&#xff09;】 ConcurrentHashMap&#xff08;分段锁&#xff09; 对整个桶数组进行了分割分段(Segment)&#xff0c;每一…

IDEA集成Docker实现快捷部署

本文已收录于专栏 《运维》 目录 背景介绍优势特点操作步骤一、修改Docker配置二、配置Docker插件三、编写Maven插件四、构建Docker镜像五、创建Docker容器 总结提升 背景介绍 在我们手动通过Docker部署项目的时候&#xff0c;都是通过把打包好的jar包放到服务器上并且在服务器…

AI穿戴设备是未来手机的终结者?中国AI商业化的未来预测

AI技术的发展正处于商业化应用的关键阶段&#xff0c;而中国在互联网时代已凭借商业化应用逆袭。AI算法大模型虽强大&#xff0c;但真正普惠民众需与设备深度结合。穿戴式智能设备就成为了新战场&#xff0c;AI算法与穿戴设备结合能释放更大工作效率。私人助理AI将成趋势&#…

南卡、漫步者和Oladance开放式哪家强?无广避坑测评!

现在市面上的开放式耳机种类非常多&#xff0c;在购买的时候大多数人都没有非常确定的目标&#xff0c;这主要是因为大多数人对开放式耳机的认识程度不够。 作为一个有着多年数码产品测评经验的测评员&#xff0c;我刚好对开放式耳机也有比较深刻的理解&#xff0c;也借着大家…

【Splitpanes】Vue.js 靠谱、简单并支持触摸的窗格分割器/调整器。

【Splitpanes】Vue.js 靠谱、简单并支持触摸的窗格分割器/调整器。 介绍安装使用示例与文档 介绍 Vue.js 靠谱、简单并支持触摸的窗格分割器/调整器。用于实现可调节窗口&#xff0c;支持Vue2、Vue3。 安装 Vue3 npm install splitpanesVue2 npm install splitpaneslegac…

一文读懂数据仓库ODS层

数据仓库一般分为三层&#xff0c;分别为数据贴源层&#xff08;ODS&#xff0c;Operation Data Store&#xff09;、数据公共层&#xff08;CDM&#xff0c;Common Data Model&#xff09;和数据应用层&#xff08;ADS&#xff0c;Application Data Service&#xff09;。其中…

小巧悦耳的百元耳机,也有纯净的音乐享受,西圣AVA2体验

无论是居家休闲还是出门在外&#xff0c;音乐成为了许多人生活中不可或缺的一部分。特别是在拥有一款既经济又好听的蓝牙耳机之后&#xff0c;我们就可以在通勤路上和办公室里&#xff0c;隔绝外界干扰&#xff0c;找回属于自己的天地&#xff0c;提升生活品质。目前我用的是一…

[巨详细]使用HBuilder-X新建uniapp项目教程

文章目录 安装HBuilder-X启动uniapp项目其他&#xff1a;下载预览浏览器下载终端插件想用uni-ui 安装HBuilder-X 详细步骤可看上文》》 启动uniapp项目 先打开HBuilder-X 点击新建项目 选择uniapp侧边栏&#xff0c;mian中的点击浏览 选择已经安装到本地的uniapp项目&#…