Kafka基本概念

文章目录

概要

Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多生产者、多订阅者,基于

zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等。

主要应用场景是:日志收集系统和消息系统。

Kafka主要设计目标如下:

  • 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访
    问性能。
  • 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输。
  • 支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输。同时支持离线数据处理和实时数据处理。

本文主要是介绍kafka整体框架上的一些基本概念

整体架构

消息传递模式只要有两种:点对点传递模式、发布-订阅模式。

大部分的消息系统选用发布-订阅模式。Kafka就是一种发布-订阅模式。

对于消息中间件,消息分推拉两种模式。Kafka只有消息的拉取,没有推送,消费者端通过轮询从broker端获取数据

服务端(brokers)和客户端(producer、consumer)之间通信通过TCP协议来完成。

Broker

  • 一个独立的Kafka服务器称为broker。一个或者多个broker可以组成kafka集群
  • broker接收来自生产者的消息,为消息设置偏移量,并提交消息到磁盘保存。
  • broker为消费者提供服务,对读取分区的请求做出响应,返回已经提交到磁盘上的消息。

Topic

  • Kafka根据topic对消息进行归类,发布到Kafka集群的每条消息都需要指定一个topic
  • 主题可比是数据库的表或者文件系统里的文件夹。
  • 主题可以被分为若干分区,一个主题通过分区分布于Kafka集群中,提供了横向扩展的能力

Partition

  • 主题可以被分为若干个分区,一个分区就是一个提交日志。
  • 消息以追加的方式写入分区,然后以先入先出的顺序读取。
  • Kafka 通过分区来实现数据冗余和伸缩性。

Replicas

  • Kafka 使用主题来组织数据,每个主题被分为若干个分区,每个分区有多个副本。
  • 副本被保存在broker 上,每个broker 可以保存成百上千个属于不同主题和分区的副本。
  • 副本有以下两种类型:
    首领副本:每个分区都有一个首领副本。为了保证一致性,所有生产者请求和消费者请求都会经过这个副本。
    跟随者副本:首领以外的副本都是跟随者副本。跟随者副本不处理来自客户端的请求,它们唯一的任务就是从首领那里复制消息,保持与首领一致的状态。如果首领发生崩溃,其中的一个跟随者会被提升为新首领。

Producer

消息生产者,向Broker发送消息的客户端

Consumer

消息消费者,从Broker读取消息的客户端

Consumer Group

每个Consumer属于一个特定的ConsumerGroup,一条消息可以被多个不同的

Consumer Group消费,但是一个Consumer Group中只能有一个Consumer能够消费同一条消息

broker和集群

一个独立的Kafka服务器称为broker

每个集群都有一个broker是集群控制器(从集群的活跃成员中选举出来)

控制器负责管理工作:

  • 将分区分配给broker
  • 监控broker
  • 当某个分区的leader副本出现故障时,由控制器负责为该分区选举新的leader副本。
  • 当检测到某个分区的ISR集合发生变化时,由控制器负责通知所有broker更新其元数据信息。

Producer

  • producer采用push模式将消息发布到broker,每条消息都被append到patition中,属于顺序写磁盘(顺序写磁盘效率比随机写内存要高,保障kafka吞吐率)。
  • producer 发送消息到 broker 时,会根据分区算法选择将其存储到哪一个 partition。其路由机制为:
    1. 指定了 patition,则直接使用;
    2. 未指定 patition 但指定 key,通过对 key 的 value 进行hash 选出一个 patition
    3. patition 和 key 都未指定,使用轮询选出一个 patition。
    4. 默认使用轮询的方式

Consumer和消费者组

从broker端读取消息的客户端,称为消费者;具有相同group.id的消费者,属于同一个消费组。一般来说,项目中用到的消费者都是以消费者组的形式存在的;一个消费者组含义一个或者多个消费者,抽象出组的概念对已broker端来说大有益处,broker端不需要关心有多少个消费者,始终以群组为单位来记录消费的位移信息

分区与消费者之间的关系大致存在以下图中几种:

这里需要注意:

  • 消费组均衡地给消费者分配分区,每个分区只由消费组中一个消费者消费
  • 如果消费者比分区多,就会出现闲置的现象
  • 组与组之间的消费互不影响

小结

本文主要从大方面总结了kafka各个主要概念;消费者如何消费,生产者发送消息流程是怎么样,位移是如何管理的,这些细节内容会在后面的文章中进行补充。

相关推荐
Mephisto.java1 小时前
【大数据学习 | Spark】Spark的改变分区的算子
大数据·elasticsearch·oracle·spark·kafka·memcache
KevinAha8 小时前
Kafka 3.5 源码导读
kafka
求积分不加C8 小时前
-bash: ./kafka-topics.sh: No such file or directory--解决方案
分布式·kafka
nathan05298 小时前
javaer快速上手kafka
分布式·kafka
激流丶11 小时前
【Kafka 实战】Kafka 如何保证消息的顺序性?
java·后端·kafka
天冬忘忧17 小时前
Kafka 工作流程解析:从 Broker 工作原理、节点的服役、退役、副本的生成到数据存储与读写优化
大数据·分布式·kafka
工业甲酰苯胺19 小时前
Python脚本消费多个Kafka topic
开发语言·python·kafka
B站计算机毕业设计超人21 小时前
计算机毕业设计SparkStreaming+Kafka新能源汽车推荐系统 汽车数据分析可视化大屏 新能源汽车推荐系统 汽车爬虫 汽车大数据 机器学习
数据仓库·爬虫·python·数据分析·kafka·数据可视化·推荐算法
谷大羽21 小时前
Kafka Stream实战教程
spring boot·后端·中间件·kafka·stream
求积分不加C1 天前
Kafka怎么发送JAVA对象并在消费者端解析出JAVA对象--示例
java·分布式·kafka·linq