暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

简单说一下Kafka

不高兴就喝水 2021-09-06
400

前言

由于 RabbitMq 有一个明显的缺陷,就是它的 master queue 只能单节点处理消息,而不能多个 master 同时处理消息。虽然它使用了 Erlang 语言去提高性能,但是始终摆脱不了这个架构设计带来的致命缺陷。

相比之下 Kafka 就没有这个缺陷, 它有着更高的吞吐量并且支持分布式、高可用、高扩展性,底层采用消息的批量处理以及零拷贝(zero-copy)机制,数据的存储和获取是按本地磁盘物理顺序批量操作,具有O(1)的复杂度,即使对TB级以上数据也能保证常数时间复杂度的访问性能,消息处理的效率更高。

Kafka基本结构

Kafka基本概念

1.主题(Topic)

主题其实就是对消息的分类和分组,一个主题就代表一类或者一组消息,相当于 Rabbitmq 中 quene 的概念。生产者将消息发送到某个主题,消费者订阅该主题进行消费。主题的元数据信息注册在 zookeeper 相应的节点中,对主题的操作实质上是对 zookeeper 中记录的主题元数据信息进行操作。

2.分区(Partition)和副本

一个主题可以分成一个或多个分区(Partition)。每个分区都是一个有序队列,由一系列有序且不可变的消息组成。每个分区可以分布到不同的机器上,这样一来,从服务端来说,分区可以实现高伸缩性、以及负载均衡、动态调节的能力。当然多分区就意味着每条消息都难以按照顺序存储,那么是不是就意味着这样的业务场景 kafka 就无能为力呢?不是的,最简单的做法是可以使用单个分区,比如将需要顺序存储的消息存储到单独的分区,其他消息存储到其他分区。

副本其实就是分区的备份,每个主题可以有多个分区,每个分区又可以有多个副本。这多个副本中,只有一个是 Leader,而其他的都是 Follower 副本。仅有 Leader 副本可以对外提供服务。如果 Leader 失效了,通过相应的选举算法将从其他 Follower 副本中选出新的 Leader。

3.偏移量(Offset)

偏移量分两种,一种是生产者的偏移量,一种是消费者偏移量。

Kafka 的较早版本(0.9之前的版本)仅将偏移量存储在 ZK中,而默认情况下,较新版本的 Kafka 则将偏移量存储在内部 Kafka 主题 topic 中。

生产者偏移量 Offset 记录的是生产者在某个分区所推送的数据到了哪个位置,如图:

消费者偏移量 Offset 记录的是消费者在某个分区消费到了哪个位置,如图:

4.日志段(LogSegment)

每个分区对应一个日志段对象,每个日志段对象会在磁盘上创建一组文件,包括:

  • 消息日志文件(.log)、
  • 位移索引文件(.index)、
  • 时间戳索引文件(.timeindex)、
  • 已中止(Aborted)事务的索引文件(.txnindex)

注意:若没有使用 Kafka 事务,已中止事务的索引文件不会被创建。

5.代理(Broker)

Kafka 集群就是由一个或多个 Kafka 实例组成,我们将每一个 Kafka 实例称为代理(Broker),通常也称代理为 Kafka 服务器(KafkaServer),生产者往 Brokers 里面指定的 Topic 中写消息,消费者从 Brokers 里面拉取指定 Topic 的消息,然后进行业务处理,broker 在中间起到一个代理保存消息的中转站作用。每个 broker 有唯一的标识 id,并且是一个非负整数。

6.生产者(Producer)

生产者如字面意思就是产生消息的客户端,负责以 push 的方式将消息发送给代理 Broker。

7.消费者(Cousumer)

消费者就是消费信息的,以 pull 的方式拉取数据进行消费。

8.ISR(In-sync Replica)

Kafka 在 ZooKeeper 中动态维护了一个ISR(In-sync Replica),即保存同步的副本列表。该列表中保存的是与 Leader 副本保持消息同步的所有副本对应的代理节点 id。如果一个 Follower 副本宕机,则该 Follower 副本节点将从 ISR 列表中移除。

HW (High Watermark)

俗称高水位,它标识了一个特定的消息偏移量(offset),消费者只能拉取到这个offset之前的消息。

LEO (Log End Offset)

LEO 标识当前日志文件中下一条待写入消息的 offset,它的大小相当于当前日志分区中最后一条消息的 offset 值加1,分区 ISR 集合中的每个副本都会维护自身的 LEO,下图中 leader 和 follower1 以及 follower2 的LEO分别为7,6,5。而 ISR 集合中最小的 LEO 即为分区的 HW。下图中的HW为5,对消费者而言只能消费 HW 之前的消息,也就是5之前的消息。

9.ZooKeeper(2.8版本后使用Kafka内部的Quorum控制器取代了ZooKeeper)

Kafka 利用 ZooKeeper 保存相应元数据信息,Kafka 元数据信息包括如代理节点信息、Kafka集群信息、旧版消费者信息及其消费偏移量信息、主题信息、分区状态信息、分区副本分配方案信息、动态配置信息等。

Kafka在启动或运行过程当中会在 ZooKeeper 上创建相应节点来保存元数据信息,Kafka 通过监听机制在这些节点注册相应监听器来监听节点元数据的变化,从而由 ZooKeeper 负责管理维护 Kafka 集群,同时通过 ZooKeeper 我们能够很方便地对 Kafka 集群进行水平扩展及数据迁移。


文章转载自不高兴就喝水,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论