kafka

168 阅读4分钟

kafka架构图

2502bede516a6c41b3ff91266c741080.png

  • broker 一台机器节点

    • 一台broker中有多个topic
  • topic 消息主题

    • 一个topic包含多个partition
  • partition 分区/队列

    • 以文件形式存储在机器上
    • 一个partition由多个segement文件组成,以最小的offset+.log命名
    • 一个分区只有一个leader和多个follower
    • 一个分区包含很多message

    消息以顺序的方式写入
    消息以二分查找的方式检索定位到具体在哪个segment
    针对消息文件有相应的索引文件

    检索过程
    查找某个offset的消息,先二分法找出消息所在的segment文件(因为每个segment的命名都是以该文件中消息offset最小的值命名);然后,加载对应的.index索引文件到内存,同样二分法找出小于等于给定offset的最大的那个offset记录(相对offset,position);最后,根据position到.log文件中,顺序查找出offset等于给定offset值的消息。

由于消息在partition的segment数据文件中是顺序读写的,且消息消费后不会删除(删除策略是针对过期的segment文件),这种顺序磁盘IO存储设计是Kafka高性能很重要的原因。

  • message 消息
    • offset 消息的逻辑便宜值,并不是在文件中的位置
    • messageSize 消息大小
    • data 消息数据
  • producer 生产者
    • 一个生产者可以发送消息到多个topic
    • 一个生产者同时也可以是消费者

    消息发送
    负载均衡:由于消息topic由多个partition组成,且partition会均衡分布到不同broker上,因此,为了有效利用broker集群的性能,提高消息的吞吐量,producer可以通过随机或者hash等方式,将消息平均发送到多个partition上,以实现负载均衡。 批量发送:是提高消息吞吐量重要的方式,Producer端可以在内存中合并多条消息后,以一次请求的方式发送了批量的消息给broker,从而大大减少broker存储消息的IO操作次数。但也一定程度上影响了消息的实时性,相当于以时延代价,换取更好的吞吐量。

  • consumer 消费者
    • 一个消费者可以监听消费多个topic
    • 一个消费者同时也可以是生产者
    • 任何Consumer必须属于一个Consumer Group
    • 同一Consumer Group中的多个Consumer实例,不同时消费同一个partition,等效于队列模式。
    • 不同Consumer Group的Consumer实例可以同时消费同一个partition,等效于发布订阅模式。
    • partition内消息是有序的,Consumer通过pull方式消费消息。
    • Kafka不删除已消费的消息
  • consumerGroup 消费者组
    • 每个消费组维护自己的消费进度 offset,相互隔离
    • 消费进度保存在broker中

队列模式

  • 在Consumer Group稳定状态下,每一个Consumer实例只会消费某一个或多个特定partition的数据,而某个partition的数据只会被某一个特定的Consumer实例所消费,也就是说Kafka对消息的分配是以partition为单位分配的,而非以每一条消息作为分配单元;
  • 同一Consumer Group中,如果Consumer实例数量少于partition数量,则至少有一个Consumer会消费多个partition的数据;如果Consumer的数量与partition数量相同,则正好一个Consumer消费一个partition的数据;而如果Consumer的数量多于partition的数量时,会有部分Consumer无法消费该Topic下任何一条消息;
  • 设计的优势是:每个Consumer不用都跟大量的broker通信,减少通信开销,同时也降低了分配难度,实现也更简单;可以保证每个partition里的数据可以被Consumer有序消费。
  • 设计的劣势是:无法保证同一个Consumer Group里的Consumer均匀消费数据,且在Consumer实例多于partition个数时导致有些Consumer会饿死。

发布订阅模式

  • 发布订阅模式,又指广播模式,Kafka保证topic的每条消息会被所有Consumer Group消费到,而对于同一个Consumer Group,还是保证只有一个Consumer实例消费到这条消息。

三高保证

  • 高性能

    过多的生产者及消费者争抢 topic

    • 业务分类 topic
    • 队列消息分区 partition

    总结:
    partition的顺序写 Producer批量向broker批量写数据 Consumer批量从broker批量拉数据 零copy数盘,调用的sendfile

  • 高可用
    • partition 分leader/follower
    • 同步复制机制
    • 异步复制
    • 同步刷盘
    • 异步刷盘

    总结就是2点:
    备份 + 复制的方式
    刷盘方式

  • 高扩展

    单个机器 topic和partition过多,cup、mem等资源瓶颈

    • partition 分散在不同机器

持久化和过期策略

  • 消息刷写到磁盘
  • retention policy 磁盘大小|超过一定时间 进行清理segment文件

应用场景

  • 流量削峰填谷
  • 服务解耦
  • 日志