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

目录

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

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.mzph.cn/web/31602.shtml

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

相关文章

Java 面试题:对比 Hashtable、HashMap、TreeMap 有什么不同?

在 Java 集合框架中&#xff0c;理解 Hashtable、HashMap 和 TreeMap 之间的区别对于任何希望编写高效代码的开发者来说都是至关重要的。尽管这三个类都用于存储键值对&#xff0c;但它们在特性和使用场景上却有着显著的差异。 Hashtable 是最早实现的哈希表之一&#xff0c;提…

静电式油烟净化器:餐饮业油烟治理的革命性选择

我最近分析了餐饮市场的油烟净化器等产品报告&#xff0c;解决了餐饮业厨房油腻的难题&#xff0c;更加方便了在餐饮业和商业场所有需求的小伙伴们。 在餐饮业&#xff0c;油烟问题一直是业主们头疼的难题。如何有效治理油烟&#xff0c;不仅关乎厨房的清洁&#xff0c;更直接…

收费4980的AI批量混剪,素材技术方法工具配套,详细拆解!

前几天有朋友跟我讲&#xff0c;他说有做旅游卡的&#xff0c;他们收费4980元&#xff0c;给500张卡&#xff0c;送AI批量混剪技术&#xff0c;问我们有没有&#xff1f; 批量混剪技术&#xff0c;这个其他早在2022年的时候我们就已经使用了。有开通抖音企业号的朋友都知道&am…

编译chamfer3D报错

python setup.py install编译chamfer3D报错 出现nvcc fatal : Unsupported gpu architecture ‘compute_86‘的问题&#xff0c;是因为显卡与cuda版本支持的算力不匹配。 nvcc fatal : Unsupported gpu architecture ‘compute_86’ ninja: build stopped: subcommand failed. …

[leetcode 27移除元素]双指针

Problem: 27. 移除元素 文章目录 思路Code 思路 使用双指针 第一个指针,遍历整个数组 第二个指针,当第一个指针遍历到不等于val值时,将其赋给第一个指针所指的位置 并且每赋值一个,第二个指针向后移动一个 最后第二个指针的长度就是结果 Code class Solution {public int remo…

机器人里程计(Odometry)

机器人里程计&#xff08;Odometry&#xff09;是机器人定位和导航中的一个关键概念&#xff0c;它涉及到利用传感器数据来估计机器人在环境中的位置和姿态。里程计的基本原理是根据机器人自身动作的反馈来计算其相对于初始位置的位移。这通常包括机器人从一个已知位置开始&…

太牛了!AI换脸数字人,限制解除,免费用!

哈喽&#xff0c;各位小伙伴们好&#xff0c;我是给大家带来各类黑科技与前沿资讯的小武。 今天给大家安利一款美图公司出品的神器&#xff0c;功能限制完全解除&#xff0c;可以免费使用AI换脸数字人、AI提词器、AI脚本、AI抠图、AI清除、AI封面等超多超实用功能&#xff0c;…

抖音商城618好物节消费数据报告发布,带货成交额同比增长300%

6月21日&#xff0c;“抖音商城618好物节”消费数据报告发布&#xff0c;呈现618期间平台全域经营情况及大众消费趋势。 今年618大促活动中&#xff0c;抖音电商投入流量资源和消费券&#xff0c;鼓励商家、达人双向经营货架场景和内容场景&#xff0c;不断激活消费市场。 报…

SEGGER Embedded Studio IDE移植embOS

SEGGER Embedded Studio IDE移植embOS 一、背景介绍二、任务目标三、技术实现3.1 获得embOS3.2 创建SES工程3.2.1 创建初始Solution和Project3.2.2 制作项目文件结构3.2.3 移植embOS库和有关头文件3.2.3.1 头文件3.2.3.2 库文件3.2.3.3 创建RTOSInit.c源文件3.2.3.4 OS_Error.c…

Golang——channel

channel是Go在语言层面提供的协程间的通信方式。通过channel我们可以实现多个协程之间的通信&#xff0c;并对协程进行并发控制。 使用注意&#xff1a; 管道没有缓冲区时&#xff0c;从管道中读取数据会阻塞&#xff0c;直到有协程向管道中写入数据。类似地&#xff0c;向管道…

生产实习Day9 ---- Scala介绍

文章目录 Scala&#xff1a;融合面向对象与函数式编程的强大语言引言Scala与Java的互操作性Scala在大数据处理中的应用Scala的并发编程Scala的学习资源和社区结论 Scala&#xff1a;融合面向对象与函数式编程的强大语言 引言 Scala&#xff0c;全称Scalable Language&#xff…

创新案例|星巴克中国市场创新之路: 2025目标9000家店的挑战与策略

星巴克创始人霍华德舒尔茨&#xff1a;“为迎接中国市场的全面消费复苏&#xff0c;星巴克2025年推进9000家门店计划&#xff0c;将外卖、电商以及家享和外出场景咖啡业务纳入中国新一轮增长计划中。”在面临中国市场同店增长大幅下滑29%背景下&#xff0c;星巴克通过DTC用户体…

使用Java实现哈夫曼编码

前言 哈夫曼编码是一种经典的无损数据压缩算法&#xff0c;它通过赋予出现频率较高的字符较短的编码&#xff0c;出现频率较低的字符较长的编码&#xff0c;从而实现压缩效果。这篇博客将详细讲解如何使用Java实现哈夫曼编码&#xff0c;包括哈夫曼编码的原理、具体实现步骤以…

使用VLLM部署llama3量化版

1.首先去魔塔社区下载量化后的llama3模型 git clone https://www.modelscope.cn/huangjintao/Meta-Llama-3-8B-Instruct-AWQ.git 2.跑起来模型 1&#xff09;python -m vllm.entrypoints.openai.api_server --model /home/cxh/Meta-Llama-3-8B-Instruct-AWQ --dtype auto --…

【管理咨询宝藏134】麦肯锡咨询公司为DB物流公司价格体系优化设计方案

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏134】麦肯锡咨询公司为DB物流公司价格体系优化设计方案 【格式】PDF版本 【关键词】麦肯锡、物流、价格战略、定价体系 【核心观点】 - 与竞争对…

TrainingArguments、ModelArguments、DataArguments参数使用(@dataclass)

文章目录 前言一、@dataclass装饰器说明二、transformers.HfArgumentParser参数使用Demo三、field函数四、llava模型参数1、模型参数设置2、数据参数设置3、训练参数设置4、参数解析5、参数传递6、参数添加前言 理解llava相关参数传递方法,有利于我们对模型修改模块使用参数来…

【mysql 安装启动失败】 没有网下 libssl.so.10 not found 如何解决?

问题描述&#xff1a; libssl.so.10 > not found libcrypto.so.10 > not found [rootmysql tools]# ls -l /usr/sbin/mysqld -rwxr-xr-x. 1 root root 64290024 Sep 14 2022 /usr/sbin/mysqld [rootmysql tools]# ldd /usr/sbin/mysqldlinux-vdso.so.1 (0x00007fff97105…

拒绝零散碎片, 一文理清MySQL的各种锁

系列文章目录 学习MySQL先有全局观&#xff0c;细说其发展历程及特点 Mysql常用操作&#xff0c;谈谈排序与分页 拒绝零散碎片&#xff0c; 一文理清MySQL的各种锁&#xff08;收藏向&#xff09; 系列文章目录一、MySQL的锁指什么二、排他与共享三、全局锁&#xff08;Global…

USB学习——12、usb初始化和插拔驱动软件流程大致框架描述

usb初始化和插拔驱动软件流程大致框架描述&#xff1a; 当设备启动时&#xff0c;usb的主机控制器设备驱动&#xff08;HCD&#xff09;和 usb的root hub会先初始化&#xff1a; 1、xhci-plat.c主机控制器驱动那里&#xff0c;__usb_creat_hcd创建usb主机数据结构&#xff0c;m…

【C++】数据类型、函数、头文件、断点调试、输入输出、条件与分支、VS项目设置

四、基本概念 这部分和C语言重复的部分就简写速过&#xff0c;因为我之前写过一个C语言的系列&#xff0c;非常详细。C和C这些都是一样的&#xff0c;所以这里不再一遍遍重复码字了。感兴趣的同学可以翻看我之前的C语言系列文章。 1、数据类型 编程的本质就是操作数据。 操…