Kafka 基本术语

2022/08/09

Kafka 属于分布式的消息引擎系统,其主要功能是提供一套完备的消息发布与订阅解决方案。 在 kafka 中,发布订阅的对象是主题(Topic),你可以为每个业务,每个应用甚至是每类数据都创建专属的主题。

Kafka 高可用相关

Broker

Broker: Kafka 的服务器端。

一个 Kafka 集群由多个 Broker 组成,Broker 进程负责接受和处理客户端发送过来的请求,以及对消息进行持久化。

将不同的 Broker 分散运行在不同机器上,这样如果集群中一台机器宕机,即使在它上面运行的所有 Broker 进程都挂掉,其他机器上的 Broker 也依然能对外提供服务。

Replication

Replication:备份机制。

备份的思想,就是把相同的数据拷贝到多台机器上,而这些相同的拷贝在 Kafka 中被称为副本(Replica)。

两类副本:

副本工作机制,生产者总是向领导者副本写消息;而消费者总是从领导者副本读取消息。至于追随者副本,它只做一件事:向领导者副本发送请求,请求领导者把最新生产者的消息发给它,这样它能保持与领导者的同步。

Scalability

Scalability:伸缩性。

若领导者副本积累了太多数据以至于单台 Broker 机器都无法容纳了,怎么办? 一个自然的想法就是,能否把数据分割成多份保存在不同的 Broker 上?Kafka 就是这么设计的。

这种机制是分区(Partitioning)。其他分布式系统中,分区、分区域等提法,比如 MongoDB 和 Elasticsearch 中的 Sharding、 HBase 中的 Region ,其实它们都是相同原理。

Kafka 中的分区机制,指的是将每个 Topic 划分为多个分区 (Partition),每个分区是一组有序的消息日志。生产者生产的每条消息只会被发送到一个分区中(注:分区编号从 0 开始)。

实际上副本是在分区这个层级定义的,每个分区下可以配置 N 个副本,其中只能有一个领导者副本和 N-1 个追随者副本。生产者向分区写消息,每条消息在分区中的位置由位移(Offset)来表征(注:分区位移从 0 开始)。

Kafka 的三层消息架构

  1. 主题层:每个主题可以配置 M 个分区,每个分区可以配置 N 个副本。
  2. 分区层: 每个分区的 N 个副本中只有一个领导者副本,对外提供服务;其他 N-1 个副本是追随者副本,只是提供数据冗余。
  3. 消息层:分区中包含若干条消息,每条消息的位移从 0 开始,依次递增。
  4. 客户端只能与分区的领导者副本进行交互。

持久化

Kafka 使用消息日志(Log)在保存数据,一个日志就是磁盘上一个只能追加写(Append-only)消息的物理文件。因为只能追加写入,故避免了缓慢的随机 I//O ,改为性能较好的顺序 I/O 写操作,这是实现 Kafka 高吞吐量的一个重要手段。

如果不停地向一个日志写消息,最终也会耗尽所有的磁盘空间,因此 Kafka 必然要定期删除消息以回收磁盘。通过日志段(Log Segment)机制进行删除。在 Kafka 底层,一个日志又近一步分成多个日志段,消息被追加写到当前最新的日志段中,当写满一个日志段后,Kafka 会自动切分出一个新的日志段,并将老的日志段封存起来。Kafka 在后台还有定时任务会定期检查老的日志段是否能够被删除,从而实现回收磁盘空间的目的。

消费者

消息引擎基础中,提到了两种消息传输模型,即点对点模型(Peer to Peer, P2P) 和发布订阅模型。这里点对点指的是同一条消息只能被下游的一个消费者消费。在 Kafka 中实现 P2P 模型的方法是引入消费者组(Consumer Group)。 消费者组,指的是多个消费者实例共同组成一个组来消费一组主题。**这组主题中的每个分区都只能被组内的一个消费者实例消费,其他消费者实例不能消费它。**多个消费者实例同时消费,提高整个消费端的吞吐量(TPS)。

消费者组里的消费者实例不仅“瓜分”订阅主题的数据,它们还能彼此协助。假设组内某个实例挂掉了,Kafka 能够自动检测到,然后把这个 Failed 实例之前负责的分区转移给其他存活的消费者。这个过程是“重平衡”(Rebalance)。

重平衡引发的消费者问题比比皆是,很多 Bug 社区都无力解决。

每个消费者在消费消息的过程中必然需要有个字段记录它当前消费到了分区的那个位置上,这个字段就是消费者位移(Consumer Offset)。

术语总结

参考