什么是Kafka
Kafka 是一个分布式的基于 发布/订阅模式 的流式平台,主要应用于大数据实时处理领域。
它有三个关键能力:
1.订阅发布记录流,它类似于企业中的消息队列 或 企业消息传递系统
2.以容错的方式存储记录流
3.实时记录流
Kafka 的应用
- 作为消息系统
- 作为存储系统
- 作为流处理器
Kafka 可以建立流数据管道,可靠性的在系统或应用之间获取数据。
建立流式应用传输和响应数据。
Kafka 作为消息系统
Kafka 作为消息系统,它有三个基本组件
- Producer : 发布消息的客户端
- Broker:一个从生产者接受并存储消息的客户端
- Consumer : 消费者从 Broker中读取消息
Kafka 基本概念
Kafka 作为一个高度可扩展可容错的消息系统,有很多 Kafka 专属的概念
topic(主题)
在 kafka 中,使用一个类别属性来划分消息的所属类,划分消息的这个类称为 topic。topic 相当于消息的分配标签,是一个逻辑概念。主题好比是数据库的表,或者文件系统中的文件夹。
partition(分区)
topic 中的消息被分割为一个或多个的 partition,它是一个物理概念,对应到系统上的就是一个或若干个目录,一个分区就是一个 提交日志。消息以追加的形式写入分区,先后以顺序的方式读取。
注意:由于一个主题包含无数个分区,因此无法保证在整个 topic 中有序,但是单个 Partition 分区可以
保证有序。消息被迫加写入每个分区的尾部。Kafka 通过分区来实现数据冗余和伸缩性
分区可以分布在不同的服务器上,也就是说,一个主题可以跨越多个服务器,以此来提供比单个服务器更强大的性能。
同一个分区只能被同一个组里的消费者消费。
分区的原因:
- 方便在集群中扩展:提高某一个Topic的负载均衡,从而提高吞吐量。
- 提高并发
分区原则:
我们需要将producer发送的数据封装成一个ProducerRecord对象。
- 指明partition 的情况下,直接将指明的值直接作为partiton 值;
- 没有指明partition 值但有key的情况下,将key的hash 值与topic 的partition 数进行取余得到partition 值;
- 既没有partition 值又没有key值的情况下,第一次调用时随机生成一个整数(后面每次调用在这个整数上自增),将这个值与topic 可用的partition总数取余得到partition 值,也就是常说的round-robin 算法。
segment(段)
Kafka采取分片和索引机制,将 Partition 进一步细分为若干个 segment,每个 segment 文件的大小相等。每个segment对应两个文件:“.index”文件和“.log”文件。index文件中存储了索引和偏移量(offset),每一条数据的大小是固定的,log文件存储了具体的数据,会根据index中索引对应的偏移量找到log中对应的数据。
broker(服务器)
Kafka 集群包含一个或多个服务器,每个 Kafka 中服务器被称为 broker,一个broker可以容纳多个topic。 broker 接收来自生产者的消息,为消息设置偏移量,并提交消息到磁盘保存。broker 为消费者提供服务,对读取分区的请求作出响应,返回已经提交到磁盘上的消息。
broker 是集群的组成部分,每个集群中都会有一个 broker 同时充当了 集群控制器(Leader) 的角色,它是由集群中的活跃成员选举出来的。每个集群中的成员都有可能充当 Leader,Leader 负责管理工作,包括将分区分配给 broker 和监控 broker。集群中,一个分区总属于一个 Leader,但是一个分区可以分配给多个 broker(非Leader),这时候会发生分区复制。 这种复制的机制为分区提供了消息冗余,如果一个 broker 失效,那么其他活跃用户会重新选举一个 Leader 接管。
producer(生产者)
生产者,即消息的发布者,其会将某 topic 的消息发布到相应的 partition 中。生产者在默认情况下把消息均衡地分布到主题的所有分区上,而并不关心特定消息会被写到哪个分区。不过,在某些情况下,生产者会把消息直接写到指定的分区。
consumer(消费者)
消费者,即消息的使用者,一个消费者可以消费多个 topic 的消息,对于某一个 topic 的消息,其只会消费同一个 partition 中的消息。
Consumer Group (CG)(消费者组)
由多个consumer组成。消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费;消费者组之间互不影响。 所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。
Replica(副本)
为保证集群中的某个节点发生故障时,该节点上的partition数据不丢失,且kafka仍然能够继续工作,kafka提供了副本机制,一个topic的每个分区都有若干个副本,一个leader和若干个follower。副本数是一个broker中leader和follower的总和。
情景分析
消费者多于partition
即同一个partition内的消息只能被同一个组中的一个consumer消费。当消费者数量多于partition的数量时,多余的消费者空闲。
消费者少于和等于partition
消息在同一个组之间的消费者之间均分
多个消费者组
多个组都会消费同一个消息,消费情况按组的情况分别处理