目录
一.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 的位置后进行读取。
想了解更多IT知识,推荐访问腾科教育.