最近比较清闲,准备学习一下 kafka 相关的原理,沉淀一下。(大部分是借鉴哈)
什么是 Kafka
Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。
主要应用场景是:日志收集系统和消息系统。
Kafka 相关术语
-
Broker: Broker可以视为一个独立的 Kafka 服务节点或 Kafka服务实例,大多数情况下 broker 可被视为是Kafka 集群下的一台服务器 (前提是这台服务器只部署了一个 Kafka实例)。
-
Topic: 发送到Kafka的消息都有一个唯一的类别,称为topic。
-
Partition: Topic的分区,一个分区仅属于一个主题。同一主题下的不同分区包含的信息也不同,同一信息只能存放在一个分区中。
-
Repication: 副本,每个分区都有若干副本,当分区leader宕机时,会从分区副本中选择一个成为新的leader
-
Producer: 消息的生产者。
-
Consumer: 消息的消费者,消费者连接至 Kafka 并接受消息。
-
Controller: 也是一个broker,除了具有基本broker的功能外,还负责分区选举和故障切换
-
ISR(In Sync Replica): 每个分区包含一个ISR列表,里面都是和master数据保持一致的副本(包括master)
Kafka架构
(待补图)
- producer 可以直接与 broker 通信,broker中存有元数据信息(broker的数量,各个topic的分区个数,各分区的master位置等),通过这种方式避免 product 与 zookeeper 的通信,降低 zookeeper 的负担。
- 每个broker 都与 zookeeper 直接通信
- consumer 也直接与 broker 通信
Topic逻辑结构
- 生产者 push 的消息会被顺序追加到各个分区日志文件的尾部。
- 消费者在进行信息读取时,会从低位开始消费,消费规则符合FIFO。
- 不同的主题分区(Partition)能够被分配到不同的 broker上, 因此一个主题能够分散的部署到多个broker上,提高存储效率。
- 每一个 Partition 都可以设置消息的有效期,到期后,无论消息是否被消费都将会被清理。(对于传统的MQ而言,一般会删除已经被消费的数据,但 Kafka 会保留所有写入消息,但很明显由于磁盘的限制,数据不可能被永久保留,Kafka对删除旧数据提供了两种策略,基于时间以及基于文件大小。)
- 当消息被存储入 Partition 后,会被指定一个 offset 来记录该消息的位置,该 offset 在分区中递增。
Producer 生产者
消息数据结构
public class ProducerRecord<K, V> {
private final String topic; //消息所属topic
private final Integer partition; //消息所属分区
private final Headers headers; //消息头
private final K key; //如果partition没指定且key存在,kafka会根据key来计算partition
private final V value; //消息体
private final Long timestamp; //时间戳