目录
一.kafka简介
- kafka定义
- 消息队列
- 与传统消息队列的对比
- kafka特点
二.kafka架构与功能
- kafka拓扑结构图
- 消息发布和读取的两种模式
- Kafka Topics
- Kafka Partition副本
- Kafka Logs
- 稀疏存储
- Kafka Log Cleanup
- 消息保障
- 消息传输
- Kafka Cluster Mirroring
三.kafka关键流程
- 写流程
- 读流程
一.kafka简介
1.kafka定义
Kafka 是一个高吞吐、分布式、基于发布订阅的消息系统。
2.消息队列
Kafka是一个消息队列:
消息队列:
- 同步队列:两个服务端必须同时在线才能通信
- 异步队列:两个服务端不一定要同时在线就可以进行通信
3.与传统消息队列的对比
- 传统的消息队列:
- 大多是基于内存做的处理
- 如果队列当中的消息被消费了就会清除。
- 消息的发布和消费必须是同步的。
- kafka:
- 基于磁盘做的处理
- 消费者可以对消息做多次订阅
- 消息的发布和消费可以是异步的
4.kafka特点
- 解耦:发布和订阅不需要同时在线
- 可恢复:一部分组件失效时,对整个系统的运行不影响
- 冗余:存在数据副本(磁盘中),可以对数据在有效期内进行持久化
- 调整峰值(缓冲):防止服务器和客户端收发速度不一致造成系统崩溃(消息太多消费者处理不过来,可以先放着)
- 灵活性:在线和下线之间灵活转换
二.kafka架构与功能
1.kafka拓扑结构图
- Producer:消息的生产者(发布消息,把消息push到Broker当中)
- Broker :服务器(队列存储),一个broker就是一个kafka的节点
- Consumer:消费者(主动从broker中pull消息)
- zookeeper:所有的broker都会向zookeeper进行注册,只有一个broker会注册成功,成为一个leader,会监控其他的broker。
consumer会通过zookeeper监控broker的状态
2.消息发布和读取的两种模式
- 点对点模式:一对一,每一条消息只能被一个消费者订阅,订阅之后,队列中就没有这条消息了。
- 发布/订阅模式:一对多,一个broker可以被多个consumer消费。消费者消费完数据,数据不会被清除。再要什么数据自己去订阅就好(kafka就是这种模式)
3.Kafka Topics
- Producer 发布消息,broker会对消息进行分类,分成多个topic,每个topic有很多的partition。
- partition:topic的分区,存在在不同的节点上,使得用户可以在不同的节点上同时访问同一个topic。图中的每个蓝色方框代表partition当中的一条数据。
- 每个partition都有自己对应的log,存放了partition的所有数据。同时还有有一个index文件,存放自己的位置信息。
- producer在partition的末尾追加消息。
- consumer通过offset(偏移量)来订阅消息。
- 每个Partition都是有序且不可变的消息队列。
- Consumer group:有多个consumer,每个partition当中的每一条数据都只能被一个consumer group当中的一个consumer订阅。
- Offest:偏移量,用来定位每条消息在文件中的位置(记录读取的位置)
4.Kafka Partition副本
- 每个partition都会有副本:leader(主副本)和follower(从副本),从副本会主动向主副本拉取消息,进行同步。
- 同一个topic的同一个分区(partition)的leader和follower是不可能在同一个节点(broker)的。(一旦节点故障,能够保证消息不丢失)
- consumer是只对leader进行消费的(leader对外提供服务)
- leader会去跟踪所有follower的状态,如果发现follower的同步信息过于落后,就会将follower从副本列表删除。
- 只有当所有follower都对一条消息同步成功了,这条消息才能被消费。
5.Kafka Logs
Kafka把Topic中一个Partition大文件分成多个小文件段,通过多个小文件段,就容易定期清除或删除已经消费完文件,减少磁盘占用。
一个日志文件默认1G,当达到1G的时候,创建新的log文件和index文件。
- .log:消息数据
- .index:索引信息
6.稀疏存储
为了避免元数据在内存中占的空间过大,数据进行稀疏存储,即将原来的完整数据,只间隔的选择多条进行存储。例如:针对100条数据,只存储了1、20、40、60、80条的数据位置,这样如果要查找第23条数据,则直接在index中找到20的位置,再偏移3条即得到。
7.Kafka Log Cleanup
日志的清理方式有两种:delete 和 compact。对于传统的message queue而言,一般会删除已经被消费的消息,而Kafka集群会保留所有的消息,无论其被消费与否。当然,因为磁盘限制,不可能永久保留所有数据(实际上也没必要),因此Kafka提供两种策略删除旧数据。
- 删除:超过阈值(过期的事件和总日志大小)进行删除。
- 合并:保留最新版本的数据
8.kafka消息保障
- 最多一次:可能会出现数据丢失的情况
consumer消费消息,然后需要记录offset(偏移量),再处理消息
如果处理过程中进程失败了,由其他的consumer订阅,offset已经提前保存了,新的consumer不会对没处理完的消息再处理一次。 - 最少一次:消息不丢失
consumer消费消息,然后处理消息,再记录offset
如果处理过程中进程失败了,由其他的consumer订阅,offset还没有保存成功,新的consumer会对没处理完的消息再次处理。 - 仅有一次:不是严格意义上的消息只能被传输一次,只是通过一个机制实现消息不被重复处理和数据丢失的情况。(尚未实现)
9.消息传输
- 同步发送:producer写一条就直接在broker上push一条(数据可靠性高)
- 异步发送:producer先把数据写入缓存区,达到一定数量后一起写入broker(容易造成数据丢失)
同步复制、异步复制与同步发送、异步发送原理相同。常用同步发送带确认+同步复制。
10.Kafka Cluster Mirroring
kafka跨集群同步:
通过内置mirror maker实现,有consumer和producer。
consumer去别的kafka集群的broker上拉取数据给到producer
producer把拉取到的消息push到自己集群的broker当中去,实现同步。
三.kafka关键流程
1.写流程
producer可以连接到任意存活的broker当中进行发布(向leader partition进行发布)
明确要发布的消息主题—>向zookeeper申请发布—>明确具体的partition所在的broker 的位置后进行发布。
2.读流程
consumer要在指定topic的leader partition当中进行数据的拉取。
明确要读取的消息主题—>向zookeeper申请读取—>明确具体的partition所在的broker 的位置后进行读取。
来源:CSDN
作者:TKE_Yolanda
链接:https://blog.csdn.net/TKE_Yolanda/article/details/104640068