kafka架构与原理

本文详细介绍了Kafka的核心概念,包括Broker、主题与分区、消息持久化策略、数据可靠性与一致性机制,以及生产者和消费者的工作方式。Kafka提供高吞吐量、容错性强的消息传递,支持消息的顺序消费与并行处理。同时,文章对比了Kafka与ActiveMQ的差异,突显了Kafka在存储结构、吞吐量和使用场景上的优势。
摘要由CSDN通过智能技术生成

1 简介

它可以让你发布和订阅记录流。在这方面,它类似于一个消息队列或企业消息系统。

它可以让你持久化收到的记录流,从而具有容错能力。

首先,明确几个概念:

  • Kafka运行在一个或多个服务器上。
  • Kafka集群分类存储的记录流被称为主题(Topics)。
  • 每个消息记录包含一个键,一个值和时间戳。

Kafka有四个核心API:

  • 生产者 API 允许应用程序发布记录流至一个或多个Kafka的话题(Topics)。
  • 消费者API 允许应用程序订阅一个或多个主题,并处理这些主题接收到的记录流。
  • Streams API 允许应用程序充当流处理器(stream processor,从一个或多个主题获取输入流,并生产一个输出流至一个或多个的主题,能够有效地变换输入流为输出流。
  • Connector API 允许构建和运行可重用的生产者或消费者,能够把 Kafka主题连接到现有的应用程序或数据系统。例如,一个连接到关系数据库的连接器(connector)可能会获取每个表的变化。

Kafka的客户端和服务器之间的通信是靠一个简单的,高性能的,与语言无关的TCP协议完成的。这个协议有不同的版本,并保持向前兼容旧版本。Kafka不光提供了一个Java客户端,还有许多语言版本的客户端。


2 架构

2.1 Broker

每个kafka server称为一个Broker,多个borker组成kafka cluster。一个机器上可以部署一个或者多个Broker,这多个Broker连接到相同的ZooKeeper就组成了Kafka集群。

这里写图片描述


2.2 主题Topic

让我们先来了解Kafka的核心抽象概念记录流 – 主题。主题是一种分类或发布的一系列记录的名义上的名字。Kafka的主题始终是支持多用户订阅的; 也就是说,一个主题可以有零个,一个或多个消费者订阅写入的数据。

Topic 与broker

一个Broker上可以创建一个或者多个Topic。同一个topic可以在同一集群下的多个Broker中分布。

这里写图片描述

当然,Topic只是一个名义上的组件,真正在Broker间分布式的Partition。


2.3 分区与日志

一个主题对应多个分区,一个分区对应一个日志

Kafka会为每个topic维护了多个分区(partition),每个分区会映射到一个逻辑的日志(log)文件。每个分区是一个有序的,不可变的消息序列,新的消息不断追加到这个有组织的有保证的日志上。分区会给每个消息记录分配一个顺序ID号 – 偏移量, 能够唯一地标识该分区中的每个记录。

日志分区是分布式的存在于一个kafka集群的多个broker上。每个partition会被复制多份存在于不同的broker上。这样做是为了容灾。具体会复制几份,会复制到哪些broker上,都是可以配置的。经过相关的复制策略后,每个topic在每个broker上会驻留一到多个partition:

这里写图片描述


2.4 保留策略与Offset

Kafka集群保留所有发布的记录,不管这个记录有没有被消费过,Kafka提供可配置的保留策略去删除旧数据(还有一种策略根据分区大小删除数据)。例如,如果将保留策略设置为两天,在记录公布后两天内,它可用于消费,之后它将被丢弃以腾出空间。Kafka的性能跟存储的数据量的大小无关, 所以将数据存储很长一段时间是没有问题的。

这里写图片描述

事实上,保留在每个消费者元数据中的最基础的数据就是消费者正在处理的当前记录的偏移量(offset)或位置(position)。这种偏移是由消费者控制:通常偏移会随着消费者读取记录线性前进,但事实上,因为其位置是由消费者进行控制,消费者可以在任何它喜欢的位置读取记录。例如,消费者可以恢复到旧的偏移量对过去的数据再加工或者直接跳到最新的记录,并消费从“现在”开始的新的记录

这些功能的结合意味着,实现Kafka的消费者的代价都是很小的,他们可以增加或者减少而不会对集群或其他消费者有太大影响。例如,你可以使用我们的命令行工具去追随任何主题,而且不会改变任何现有的消费者消费的记录。


2.5 Leader与Followers

一个Topic可能有很多分区,以便它能够支持海量的的数据,更重要的意义是分区是进行并行处理的基础单元。日志的分区会跨服务器的分布在Kafka集群中,每个分区可以配置一定数量的副本分区提供容错能力。为了保证较高的处理效率,消息的读写都是在固定的一个副本上完成。这个副本就是所谓的Leader,而其他副本则是Follower,而Follower则会定期地到Leader上同步数据

(1)leader处理所有的读取和写入分区的请求,而followers被动的从领导者拷贝数据。

(2)如果leader失败了,followers之一将自动成为新的领导者。

(3)每个服务器可能充当一些分区的leader和其他分区的follower,这样的负载就会在集群内很好的均衡分配。

(4)一个分区在同一时刻只能有一个消费者实例进行消费。

举例:

这里写图片描述

可以看见我们一共有3个分区分别是0,1,2, replica 有2个:

  • partition 0 的leader在broker1, follower在broker2
  • partition 1 的leader在broker2, follower在broker0
  • partition 2 的leader在broker0, follower在brokder1

一个broker中不会出现两个一样的Partition,replica会被均匀的分布在各个kafka server(broker)上 。Kafka并不允许replicas 数设置大于 broker数,因为在一个broker上如果有2个replica其实是没有意义的,因为再多的replica同时在一台broker上,随着该broker的crash,一起不可用。

(1)Leader选举与ISR

如果某个分区所在的服务器除了问题,不可用,kafka会从该分区的其他的副本中选择一个作为新的Leader。之后所有的读写就会转移到这个新的Leader上。现在的问题是应当选择哪个作为新的Lea

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值