Kafka基础概念

参考文献

基本概念这里
理解分区 Partition
offset 理解


基本概念

  • Topic
    • 是一个逻辑概念,相当于给消息分配的标签
  • Partition
    • 分区,topic 中的消息被分割为一个或多个的 partition,是一个物理概念
    • 对应到系统上就是若干个目录,一个分区就是一个日志文件
    • 消息以追加(append)的形式写入分区,先后以顺序的方式读取
    • 每个日志文件都是一个log entry序列。这个log entry并非由一个文件构成,而是分成多个segment
  • Segment
    • 段,将 Partition 进一步细分为若干个 segment,每个 segment 文件的大小相等
    • 每个segment以该segment第一条消息的offset命名并以.kafka为后缀
    • 另外会有一个索引文件,它标明了每个segment下包含的log entry的offset范围

因为每条消息都被append到该Partition中,属于顺序写磁盘,因此效率非常高
(顺序写磁盘效率比随机写内存还要高,这是Kafka高吞吐率的一个很重要的保证),值得一提的是,kafka使用文件进行存储,并且采用操作系统的零拷贝技术,主要利用ChanneltransferTo方法。
image

  • Broker
    • Kafka 集群包含一个或多个服务器,每个 Kafka 中服务器被称为 broker。
    • Broker 接收来自生产者的消息,为消息设置偏移量,并提交消息到磁盘保存。
    • Broker 为消费者提供服务,对读取分区的请求作出响应,返回已经提交到磁盘上的消息
  1. Broker 是集群的组成部分,每个集群中都有一个 Broker 同时充当了集群控制器 Leader的角色(选举产生;每个 Broker 都可能成为 Leader,功能包括将分区 partition 分配给 broker 和监控 broker)

  2. 集群中,一个分区从属于一个 Leader,但是一个分区可以分配给多个 Broker(非Leader),这时会发生分区复制
    (复制机制为分区提供了消息冗余,如果一个 broker 失效,那么其他活跃用户会重新选举一个 Leader 接管)
    image

  • Producer
    • 消息的发布者,会将某 topic 的消息发布到相应的 partition 中。
    • 默认情况下把消息均衡地分布到主题的所有分区上,而并不关心特定消息会被写到哪个分区。
    • 某些情况下,生产者会把消息直接写到指定的分区
  • Consumer
    • 消费者,一个消费者可以消费多个 topic 的消息
    • 对于某一个 topic 的消息,其只会消费同一个 partition 中的消息
      image

同一Topic的一条消息只能被同一个Consumer Group内的一个Consumer消费;
但多个Consumer Group可同时消费这一消息
单播:所有的Consumer在同一个Group里
广播:只要每个Consumer有一个独立的Group就可以

image

  • offset

kafka会将生产的消息 append 到不太的 partition 中(即分区),每个分区都是有序且顺序不可变的记录集,分区中每一个记录都会分配一个 id 号来表示顺序,称之为 offset,offset 用来唯一标识区分分区中的每一条记录。消息的被读状态是由 consumer 来维护的,所以每个partition中offset一般都是连续递增的(如果开启了压缩,因为对旧数据的merge会导致不连续)被读取的消息并不会删除,所以每次都是追加写入顺序读写,具备很好的吞吐量。

  1. offset 有什么作用
    消费者在消费数据时,发生宕机后,再次重新启动后,消费的数据需要从宕机位置开始读取
  • 如果从头读取, 有一部分消息一定出现了重复消费
  • 如果从宕机时的消费位置读取, 就不会出现重复消费
  • 因此kafka设计了offset 可以用于处理这种情况
  1. 如何维护 offset 的值
  • 自动提交,设置enable.auto.commit=true,更新的频率根据参数【auto.commit.interval.ms】来定。这种方式也被称为【at most once】,fetch到消息后就可以更新offset,无论是否消费成功。默认就是true
  • 手动提交,设置enable.auto.commit=false,这种方式称为【at least once】。fetch到消息后,等消费完成再调用方法【consumer.commitSync()】,手动更新offset;如果消费失败,则offset也不会更新,此条消息会被重复消费一次
  1. offset 实体在什么位置

0.9.0版本以前.这些数值维护在zookeeper中,但是zk不适合大量写入.后来做了改动
0.9.0 版本以后,数据维护在kafka的_consumer_offsets主题下.
内部结构包括
groupid:topicName_partition offset

Kafka

  1. Kafka 是分布式发布-订阅消息系统。在 Kafka 集群中,没有“中心主节点”的概念,集群中所有的服务器都是对等的,因此,可以在不做任何配置的情况下实现服务器的删除与添加,消息生产者和消费者也能够做到随意重启和机器的上下线

  2. 消息系统生产者和消费者部署关系
    image

  3. 消息系统架构
    image

posted @ 2022-08-29 17:15  MeiyangLi  阅读(58)  评论(0编辑  收藏  举报