1.什么是kafka

根据kafka官网(http://kafka.apache.org/intro)的介绍:
Apache Kafka® is a distributed streaming platform(一个分布式流媒体平台)

##2. kafka的主要有三个功能:

1.发布和订阅记录流,类似于消息队列或企业消息传递系统。

2.以容错持久的方式存储记录流。

3.处理记录发生的流。

###3. 几种分布式系统消息系统的对比

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pTLj2XwQ-1577548390773)(https://i.imgur.com/KUMTlXT.png)]

###4. 基本组成
它的架构包括以下组件:

1、话题(Topic):是特定类型的消息流。消息是字节的有效负载(Payload),话题是消息的分类名或种子(Feed)名;

2、生产者(Producer):是能够发布消息到话题的任何对象;

3、服务代理(Broker):已发布的消息保存在一组服务器中,它们被称为代理(Broker)或Kafka集群;

4、消费者(Consumer):可以订阅一个或多个话题,并从Broker拉数据,从而消费这些已发布的消息;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0g6hTkq1-1577548390775)(https://i.imgur.com/gz6W6UE.png)]

###5. Kafka的特性:

高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consume操作。

  1. 可扩展性:kafka集群支持热扩展
  2. 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
  3. 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)
  4. 高并发:支持数千个客户端同时读写

###6. kafka的性能

对于每个主题,Kafka集群都维护一个分区日志,如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UKdXBvkv-1577548390776)(https://i.imgur.com/lz6UCEI.png)]

为了使得Kafka的吞吐率可以线性提高,物理上把Topic分成一个或多个Partition,每个Partition在物理上对应一个文件夹,该文件夹下存储这个Partition的所有消息和索引文件.每个分区都是有序的,不可变的记录序列,不断追加到结构化的提交日志中。分区中的记录每个分配一个连续的id号,称为offset(偏移量),用于唯一标识分区内的每条记录。

实际上,保留在每个消费者基础上的唯一元数据是该消费者在日志中的抵消或位置。这个偏移量是由消费者控制的:消费者通常会在读取记录时线性地推进其偏移量,但实际上,由于位置由消费者控制,因此它可以按任何喜欢的顺序消费记录。例如,消费者可以重置为较旧的offset(偏移量)以重新处理来自过去的数据,或者跳至最近的记录并从“now”开始消费。随你喜欢爱怎么读怎么读,而且这些操作对集群或其他消费者没有太大影响。

这样的操作也就说kafka不用考虑加锁的问题,不存在消费完就要删除信息的问题,有效的保证了高吞吐率,这样没有锁竞争,充分发挥了横向的扩展性,吞吐量极高。这也就形成了分布式消费的概念。.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-55nYMXeL-1577548390777)(https://i.imgur.com/bHEd1PY.png)]

这里要注意,因为Kafka读取特定消息的时间复杂度为O(1),即与文件大小无关,所以这里删除过期文件与提高Kafka性能无关,

当然kafka也提供了删除旧数据的策略:

1.时间,可以自己设置一个储存的最大时间.

2.partition大小,可以给分区设置最大储存值.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DEGfheuU-1577548390777)(https://i.imgur.com/aQZtvOE.png)]

p0=>p3三个partition,而partition中的每个message只能被组(Consumer group)中的一个consumer(consumer 线程)消费.也就说一个partition只能被一个消费者消费(一个消费者可以同时消费多个partition)

如果consumer从多个partition读到数据,不保证数据间的顺序性,kafka只保证在一个partition上数据是有序的,但多个partition,根据你读的顺序会有不同

#####前面都是说的是kafka被消费的性能,下面说一下kafka如何保证Producer是如何将message推入topic中的.

###6.1.Kakfa Broker Leader选举:
kafka集群是受zookeeper来管理的,这里需要将所有的kafka broker节点一起注册到zookeeper上,而这个过程中只有一个kafka broker能注册成功,在zookeeper上注册一个临时节点,这个kafka broker叫kafka broker Controller,其他的叫kafka broker follower,一旦这个kafka broker Controller发生宕机,临时节点会消失,其他的kafka broker follower会在竞争去zookeeper上注册,产生一个新Leader.(注:Kafka集群中broker之间的关系,不是主从关系,各个broker在集群中地位一样,我们可以随意的增加或删除任何一个broker节点。),还有一种情况是有Controller下的一个follower宕机了,这时Controller会去读取这个follower在zookeeper上所有的partition leader信息(host:port),并且找到这些partition的备份们,让他们选一个成为这个partition的leader.如果该partition的所有的备份都宕机了,则将新的leader设置为-1,等待恢复,等待任一个备份“活”过来,并且选它作为Leader.

###6.2.在Producer向kafka broker推送message

kafka在所有broker中产生一个controller,所有Partition的Leader选举都由controller决定。controller会将Leader的改变直接通过RPC的方式(比Zookeeper Queue的方式更高效)通知需为此作出响应的Broker。

每个partition(分区)都有一台服务器充当“leader”,零个或多个服务器充当“follower”。leader处理分区的所有读取和写入请求,而follower被动地复制leader。如果leader失败,其中一个follower将自动成为新leader。每个服务器都充当其中一些分区的leader和其他人的follower,因此负载在集群内平衡良好。

###6.3 举个栗子

消息生产者,就是向 kafka broker发消息的客户端。 Producer 采用异步 push 方式, 极大提高 Kafka 系统的吞吐率(可以通过参数控制是采用同步还是异步方式)。 producer 端 , 可以将消息 buffer 起来 , 当消息的条数达到一定阀值时 , 批量发送给 broker 。

小数据 IO 太多,会拖慢整体的网络延迟,批量延迟发送事实上提升了网络效率。不过 这也有一定的隐患,比如说当 producer 失效时,那些尚未发送的消息将会丢失。

producer将会和Topic下所有partition leader保持 socket 连接 ; 消息由 producer 直接 通过 socket 发送到 broker, 中间不会经过任何 " 路由层 ". 事实上 , 消息被路由到哪个 partition 上 , 由 producer 客户端决定。 partition leader的位置 (host:port)注册在 zookeeper 中 ,producer 作为 zookeeper client,已经注册了 watch 用来监听 partition leader的变更事件。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OhzGGCXV-1577548390779)(https://i.imgur.com/ZtUhTfV.png)]
如上图kafka集群有四个broker,一个topic有四个partition,并且每一个partition都有一个follower(其实就是备份);一个消息流输入之后会先储存一个topic在不同的partition leader中(并行写入),然后在由partition leader同步到各自的备份中.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F9X7b1YM-1577548390780)(https://i.imgur.com/TV6gCDd.png)]

我们加两个broker5,6,这个时候partition的变化

###6.4 partition(分区)机制的优势:

当Producer发送消息到broker时,会根据Paritition机制选择将其存储到哪一个Partition。也就是我们上面说的机制,所有消息可以均匀分布到不同的Partition里,这样就实现了负载均衡。如果一个Topic对应一个文件,那这个文件所在的机器I/O将会成为这个Topic的性能瓶颈,而有了Partition后,不同的消息可以并行写入不同broker的不同Partition里,极大的提高了吞吐率。**所以说kafka可以水平扩展,也就是扩展partition。**segment

一个partition可以实现跨服务器,可以一个分区占有一个服务器.

推荐:kafka原理详细讲解
更详细的地址

Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐