美文网首页
kafka相关概念

kafka相关概念

作者: mundane | 来源:发表于2022-03-27 22:01 被阅读0次

https://zhuanlan.zhihu.com/p/74063251
https://my.oschina.net/u/3777556/blog/5180700
https://blog.51cto.com/u_12206475/3113376
https://blog.csdn.net/weixin_39860755/article/details/112076339

官方文档:

http://kafka.apache.org/documentation/

基础概念

  • Producer :
    生产者,负责将消息发送到 Broker
  • Consumer:
    消费者,从 Broker 接收消息
  • Consumer Group :
    消费者组,由 多个 Consumer 组成。消费者组内每个消费者负责消费不同分区的数据, 一个分区只能由一个组内消费者消费;消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。


  • Topic(主题):
    一个逻辑上的概念,包含很多 Partition, 同一个 Topic 下的 Partiton 的消息内容是不相同的。这有点儿类似于数据库中的表
  • Partition(分区):
    为了实现扩展性,一个非常大的 topic 可以分布到多个 broker 上,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列。
    kafka只保证一个分区内的数据是有序的,不保证一个topic下的所有partition全局有序。
    同一个topic下,不同partition存的消息是不同的。
    partition 中的每条消息都会被分配一个有序的id(offset)。
  • Offset:kafka 的存储文件都是按照 offset.kafka 来命名,用 offset 做名字的好处是方便查找。例如你想找位于 2049 的位置,只要找到 2048.kafka 的文件即可。当然 the first offset 就是 00000000000.kafka。
  • replica:
    partition 的副本,保障 partition 的高可用
  • leader:
    replica 中的一个角色, producer 和 consumer 只跟 leader 交互
  • follower:
    replica 中的一个角色,从 leader 中复制数据


  • Broker:
    一个 Kafka 服务器也称为 Broker
  • Cluster(集群):
    若干个 Broker 组成一个集群,其中集群内某个 Broker 会成为集群控制器(Cluster Controller)

consumer和topic的关系

每个consumer group中可以有多个consumer,这样不仅可以提高topic中消息的并发消费能力,而且还能提高"故障容错"性,如果group中的某个consumer失效那么其消费的partition将会被其他consumer自动接管。

一个partition只能被某个consumer group中的其中一个consumer消费。
一个partition不能被同一个consumer group中的多个consumer同时消费。
一个consumer可以同时消费多个partition中的消息。
如果只有3个partition,而consumer group有4个consumer,那么一个consumer会空闲。

https://blog.csdn.net/weixin_39860755/article/details/112076339

Partition 与消费模型

上面提到,Kafka 中一个 topic 中的消息是被打散分配在多个 Partition(分区) 中存储的, Consumer Group 在消费时需要从不同的 Partition 获取消息,那最终如何重建出 Topic 中消息的顺序呢?

答案是:没有办法。Kafka 只会保证在 Partition 内消息是有序的,而不管全局的情况。

下一个问题是:Partition 中的消息可以被(不同的 Consumer Group)多次消费,那 Partition中被消费的消息是何时删除的? Partition 又是如何知道一个 Consumer Group 当前消费的位置呢?

无论消息是否被消费,除非消息到期 Partition 从不删除消息。例如设置保留时间为 2 天,则消息发布 2 天内任何 Group 都可以消费,2 天后,消息自动被删除。
Partition 会为每个 Consumer Group 保存一个偏移量,记录 Group 消费到的位置。 如下图:

讨论一:Kafka 存储在文件系统上

是的,您首先应该知道 Kafka 的消息是存在于文件系统之上的。Kafka 高度依赖文件系统来存储和缓存消息,一般的人认为 “磁盘是缓慢的”,所以对这样的设计持有怀疑态度。实际上,磁盘比人们预想的快很多也慢很多,这取决于它们如何被使用;一个好的磁盘结构设计可以使之跟网络速度一样快。

上述的 Topic 其实是逻辑上的概念,面相消费者和生产者,物理上存储的其实是 Partition,每一个 Partition 最终对应一个目录,里面存储所有的消息和索引文件。默认情况下,每一个 Topic 在创建时如果不指定 Partition 数量时只会创建 1 个 Partition。比如,我创建了一个 Topic 名字为 test ,没有指定 Partition 的数量,那么会默认创建一个 test-0 的文件夹,这里的命名规则是:<topic_name>-<partition_id>。

https://zhuanlan.zhihu.com/p/74063251

消费组与分区重平衡

可以看到,当新的消费者加入消费组,它会消费一个或多个分区,而这些分区之前是由其他消费者负责的;另外,当消费者离开消费组(比如重启、宕机等)时,它所消费的分区会分配给其他分区。这种现象称为重平衡(rebalance)。重平衡是 Kafka 一个很重要的性质,这个性质保证了高可用和水平扩展。不过也需要注意到,在重平衡期间,所有消费者都不能消费消息,因此会造成整个消费组短暂的不可用。而且,将分区进行重平衡也会导致原来的消费者状态过期,从而导致消费者需要重新更新状态,这段期间也会降低消费性能。后面我们会讨论如何安全的进行重平衡以及如何尽可能避免。

消费者通过定期发送心跳(hearbeat)到一个作为组协调者(group coordinator)的 broker 来保持在消费组内存活。这个 broker 不是固定的,每个消费组都可能不同。当消费者拉取消息或者提交时,便会发送心跳。

如果消费者超过一定时间没有发送心跳,那么它的会话(session)就会过期,组协调者会认为该消费者已经宕机,然后触发重平衡。可以看到,从消费者宕机到会话过期是有一定时间的,这段时间内该消费者的分区都不能进行消息消费;通常情况下,我们可以进行优雅关闭,这样消费者会发送离开的消息到组协调者,这样组协调者可以立即进行重平衡而不需要等待会话过期。

在 0.10.1 版本,Kafka 对心跳机制进行了修改,将发送心跳与拉取消息进行分离,这样使得发送心跳的频率不受拉取的频率影响。另外更高版本的 Kafka 支持配置一个消费者多长时间不拉取消息但仍然保持存活,这个配置可以避免活锁(livelock)。活锁,是指应用没有故障但是由于某些原因不能进一步消费。

讨论二:Kafka 中的底层存储设计

相关文章

网友评论

      本文标题:kafka相关概念

      本文链接:https://www.haomeiwen.com/subject/ukprjrtx.html