首页 > 其他分享 >kafka02 kafka术语和架构简介

kafka02 kafka术语和架构简介

时间:2023-06-25 14:46:22浏览次数:36  
标签:简介 partition broker Kafka topic 消息 kafka Consumer kafka02

1 Kafka中的术语解释概述

  在深入理解Kafka之前,先介绍一下Kafka中的术语。

 

1.1 图示

  上图中一个topic配置了3个partition。

  Partition1有两个offset:0和1。Partition2有4个offset。Partition3有1个offset。副本的id和副本所在的机器的id恰好相同。

  如果一个topic的副本数为3,那么Kafka将在集群中为每个partition创建3个相同的副本。集群中的每个broker存储一个或多个partition。多个producer和consumer可同时生产和消费数据。

 

1.2 broker

  Kafka 集群包含一个或多个服务器,服务器节点称为broker。
  broker存储topic的数据。如果某topic有N个partition,集群有N个broker,那么每个broker存储该topic的一个partition。
  如果某topic有N个partition,集群有(N+M)个broker,那么其中有N个broker存储该topic的一个partition,剩下的M个broker不存储该topic的partition数据。
  如果某topic有N个partition,集群中broker数目少于N个,那么一个broker存储该topic的一个或多个partition。在实际生产环境中,尽量避免这种情况的发生,这种情况容易导致Kafka集群数据不均衡。

 

1.3 Topic

  每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic,这是逻辑上的分类。

 

1.4 Partition

  topic中的数据分割为一个或多个partition(实际物理上存储消息的地方)。

  每个topic至少有一个partition。每个partition中的数据使用多个segment文件存储。

  partition中的数据是有序的,不同partition间的数据顺序无法保证。

  如果topic有多个partition,消费数据时就不能保证数据的顺序。在需要严格保证消息的消费顺序的场景下,需要将partition数目设为1。

 

1.5 Producer

  生产者即数据的发布者,该角色将消息发布到Kafka的topic中。broker接收到生产者发送的消息后,broker将该消息追加到当前用于追加数据的segment文件中。生产者发送的消息,存储到一个partition中,生产者也可以指定数据存储的partition。

 

1.6 Consumer

  消费者可以从broker中读取数据。

  一个消费者可以消费多个topic中的数据。

  一个消费者可消费多个partion的消息

  

1.7 Consumer Group

  每个Consumer属于一个特定的Consumer Group

  可为每个Consumer指定group name,若不指定group name则属于默认的group。

  一条消息只能被同一个组中的一个消费者消费。

  一条消息可被不同组的消费者消费。

  

1.8 Leader

  每个partition有多个副本,其中有且仅有一个作为Leader,Leader是当前负责数据的读写的partition。其它partion仅仅作为备份

 

1.9 Follower

  Follower跟随Leader,所有写请求都通过Leader路由,数据变更会广播给所有Follower,Follower与Leader保持数据同步。如果Leader失效,则从Follower中选举出一个新的Leader。当Follower与Leader挂掉、卡住或者同步太慢,leader会把这个follower从“in sync replicas”(ISR)列表中删除,重新创建一个Follower。

 

2 架构图示

  如上图所示,一个典型的Kafka集群中包含若干Producer(可以是web前端产生的Page View,或者是服务器日志,系统CPU、Memory等),若干broker(Kafka支持水平扩展,一般broker数量越多,集群吞吐率越高),若干Consumer Group,以及一个Zookeeper集群。

  Kafka通过Zookeeper管理集群配置,选举leader,以及在Consumer Group发生变化时进行rebalance。

  Producer使用push模式将消息发布到broker,Consumer使用pull模式从broker订阅并消费消息

 

3 Topics和Partition

3.1 简介

  Topic在逻辑上可以被认为是一个queue,每条消费都必须指定它的Topic,可以简单理解为必须指明把这条消息放进哪个queue里。

  为了使得Kafka的吞吐率可以线性提高,物理上把Topic分成一个或多个Partition,每个Partition在物理上对应一个文件夹,该文件夹下存储这个Partition的所有消息和索引文件。

  创建一个topic时,同时可以指定分区数目,分区数越多,其吞吐量也越大,但是需要的资源也越多,同时也会导致更高的不可用性

  kafka在接收到生产者发送的消息之后,会根据均衡策略将消息存储到不同的分区中。

  因为每条消息都被append到该Partition中,属于顺序写磁盘,因此效率非常高(经验证,顺序写磁盘效率比随机写内存还要高,这是Kafka高吞吐率的一个很重要的保证)

 

3.2 删除旧数据策略

  对于传统的message queue而言,一般会删除已经被消费的消息,而Kafka集群会保留所有的消息,无论其被消费与否。

  当然,因为磁盘限制,不可能永久保留所有数据(实际上也没必要),因此Kafka提供两种策略删除旧数据。

  一是基于时间,二是基于Partition文件大小。

  例如可以通过配置$KAFKA_HOME/config/server.properties,让Kafka删除一周前的数据,也可在Partition文件超过1GB时删除旧数据,配置如下所示

# 符合删除条件的日志文件的最小时间
log.retention.hours=168
# 日志段文件的最大大小。当达到这个大小时,将创建一个新的日志段。
log.segment.bytes=1073741824
# 检查日志段的时间间隔,以确定它们是否可以根据保留策略被删除
log.retention.check.interval.ms=300000
# 如果设置了log.cleaner.enable =true,则清理器将被启用,然后可以为日志压缩标记单个日志。
log.cleaner.enable=false

  

3.3 offset的维护

  因为Kafka读取特定消息的时间复杂度为O(1),即与文件大小无关,所以这里删除过期文件与提高Kafka性能无关。选择怎样的删除策略只与磁盘以及具体的需求有关。

  另外,Kafka会为每一个Consumer Group保留一些metadata信息——当前消费的消息的position,也即offset。这个offset由Consumer控制。正常情况下Consumer会在消费完一条消息后递增该offset。当然,Consumer也可将offset设成一个较小的值,重新消费一些消息。

  因为offset由Consumer控制,所以Kafka broker是无状态的,它不需要标记哪些消息被哪些消费过,也不需要通过broker去保证同一个Consumer Group只有一个Consumer能消费某一条消息,因此也就不需要锁机制,这也为Kafka的高吞吐率提供了有力保障

4 Producer消息路由


  Producer发送消息到broker时,会根据Paritition机制选择将其存储到哪一个Partition。如果Partition机制设置合理,所有消息可以均匀分布到不同的Partition里,这样就实现了负载均衡。

  如果一个Topic对应一个文件,那这个文件所在的机器I/O将会成为这个Topic的性能瓶颈,而有了Partition后,不同的消息可以并行写入不同broker的不同Partition里,极大的提高了吞吐率。

  可以在$KAFKA_HOME/config/server.properties中通过配置项num.partitions来指定新建Topic的默认Partition数量,也可在创建Topic时通过参数指定,同时也可以在Topic创建之后通过Kafka提供的工具修改。

  在发送一条消息时,可以指定这条消息的key,Producer根据这个key和Partition机制来判断应该将这条消息发送到哪个Partition。

  Paritition机制可以通过指定Producer的paritition.class这一参数来指定,该class必须实现kafka.producer.Partitioner接口

5 Consumer Group

  使用Consumer high level API时,同一Topic的一条消息只能被同一个Consumer Group内的一个Consumer消费,但多个Consumer Group可同时消费这一消息。

  这是Kafka用来实现一个Topic消息的广播(发给所有的Consumer)和单播(发给某一个Consumer)的手段。一个Topic可以对应多个Consumer Group。如果需要实现广播,只要每个Consumer有一个独立的Group就可以了。要实现单播只要所有的Consumer在同一个Group里。用Consumer Group还可以将Consumer进行自由的分组而不需要多次发送消息到不同的Topic。

 

6 Push与Pull消费模式

  作为一个消息系统,Kafka遵循了传统的方式,选择由Producer向broker push消息并由Consumer从broker pull消息。

  一些logging-centric system,比如Facebook的Scribe和Cloudera的Flume,采用push模式。事实上,push模式和pull模式各有优劣。

  push模式很难适应消费速率不同的消费者,因为消息发送速率是由broker决定的。push模式的目标是尽可能以最快速度传递消息,但是这样很容易造成Consumer来不及处理消息,典型的表现就是拒绝服务以及网络拥塞。而pull模式则可以根据Consumer的消费能力以适当的速率消费消息。

  对于Kafka而言,pull模式更合适。pull模式可简化broker的设计,Consumer可自主控制消费消息的速率,同时Consumer可以自己控制消费方式——即可批量消费也可逐条消费,同时还能选择不同的提交方式从而实现不同的传输语义

标签:简介,partition,broker,Kafka,topic,消息,kafka,Consumer,kafka02
From: https://www.cnblogs.com/jthr/p/17502890.html

相关文章

  • kafka01 kafka及消息队列简介
     1Kafka是什么Kafka是一种高吞吐量的分布式发布订阅消息系统(消息引擎系统)。 2消息系统简介一个消息系统负责将数据从一个应用传递到另外一个应用,应用只需关注于数据,无需关注数据在两个或多个应用间是如何传递的。分布式消息传递基于可靠的消息队列,在客户端应用和......
  • 大端模式与小端模式简介
    转载文章:《数据在内存中存储的方式:大端模式与小端模式》什么是大端模式,什么是小端模式?所谓的大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低......
  • 【linux命令】“最强大的编辑器”vim用法简介(基础篇)
    vim编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器。它主要分为命令令行模式、插入模式和底行模式这三种,下面主要介绍一下这三种模式最简单常用的用法。一.命令行模式1.移动光标左移:h光标右移:l光标上移:k光标下移:j光标向右移动一个单词:w(联......
  • JAVA编程开发之 新蜂商城 --- 简介
    开源商城学习项目https://github.com/newbee-ltd/newbee-mallhttps://gitee.com/newbee-ltd/newbee-mallhttps://edu.csdn.net/course/detail/26258https://juejin.cn/book/6844733814074245133?suid=3808363978174302&source=pc新蜂商城虽然不能作为真实企业级项目,但是是优......
  • kafka stream
       ......
  • kafka学习之五_多个磁盘的性能验证
    kafka学习之五_多个磁盘的性能验证背景周末在家学习kafka上午验证了grafana+kafka_exporter的监控下午想着验证一把性能相关.kafka学习之三里面,有成套的脚本.我这边想起来之前还有一个机器,是四个单盘HDD,我可以直接进行使用和验证.测试思路计划创建四个partitio......
  • Maven 入门实战(1)--简介及安装
    Maven是一种软件项目管理和理解工具;它基于项目对象模型(POM),从中央位置管理项目的构建、报告和文档,并帮助开发人员轻松管理依赖项并自动化构建过程。1、简介1.1、项目目录Maven使用约定优于配置的原则,提倡使用一个共同的标准目录结构。目录说明${basedir}项目根目录,存......
  • Kafka部署指南:详细步骤解析
    引言:Kafka是一个高性能、分布式的消息队列系统,被广泛应用于大数据和实时数据处理场景。本文将详细介绍如何在Linux系统上部署和配置Kafka,以便您能够快速开始使用这个强大的消息传递平台。步骤1:准备工作确保您已经安装了JavaDevelopmentKit(JDK),并设置了JAVA_HOME环境变量。......
  • 通过Maxwell同步mysql数据至kafka
    实验环境本地虚拟机maraidb10.8.8kafka2.12-3.3.1maxwell由容器部署1mariadb1.1配置log_bin配置文件中加入如下内容server-id=111log_bin=mysql-binbinlog_format=ROWexpire_logs_days=1重启服务systemctlrestartmariadb查询命令SHOWVARIABLESLI......
  • debezium同步mysql数据至kafka(未完待续)
    实验环境全部部署于本地虚拟机1mysql参考官方文档和根据官方示例镜像(debezium/example-mysql,mysql版本为8.0.32)1.1创建用户官方镜像里一共有三个账号debezium:connect用户mysqluser:普通用户replicator:用于主从?设置命令createuser'debezium'@'%'identifiedby"db......