kafka原理详解
消息队列概述
消息队列分类
点对点
发布/订阅
常见的消息系统
kafka架构
kafka介绍
Kafka是一个分布式的发布/订阅消息系统,最初由LinkedIn(领英)公司发布,使用Scala语言编写,后成为Apache的顶级项目。
kafka主要用于处理活跃的数据,如登录、浏览、点击、分享等用户行为产生的数据。
kafka架构组成


Broker
Topic
Partition
Replication
-
副本,每个partition分区可以有多个副本,分布在不同的Broker上
-
kafka会选出一个副本作为Leader,所有的读写请求都会通过Leader完成,Follower只负责备份数据
-
所有Follower会自动从Leader中复制数据,当Leader宕机后,会从Follower中选出一个新的Leader继续提供服务,实现故障自动转移
Message
Producer
Consumer
Consumer Group
ZooKeeper
kafka的工作流程
生产者向kafka发送数据的流程(六步)

一共六步:
-
生产者查询Leader:producer先从zookeeper的“/brokers/.../state”节点找到该partition的leader
-
找到Leader之后往Leader写数据:producer将消息发送给该leader
-
Leader落盘:leader将消息写入本地log
-
Leader通知Follower
-
Follower从Leader中拉取数据:replication写入到Follower的本地log后,follower向leader发送ack
-
Kafka向生产者回应ACK:leader收到所有的replication的ack之后,向producer发送ack
Kafka选择分区的模式(三种)
-
直接指定往哪个分区写
-
指定key,然后kafka根据key做hash后决定写哪个分区
-
各个分区轮询
生产者往kafka发送数据的模式(三种)
-
把数据发送给Leader就认为成功,效率最高,安全性低
-
把数据发送给Leader,等待Leader回复Ack后则认为发送成功
-
把数据发送给Leader,确保Follower从Leader拉取数据回复Ack给Leader,Leader再向生产者回复Ack才认为发送成功,安全性最高
数据消费
多个消费者可以组成一个消费者组,并用一个标签来标识这个消费者组(一个消费者实例可以运行在不同的进程甚至不同的服务器上)
各个consumer可以组成一个组,每个消息只能被组中的一个consumer消费,如果一个消息可以被多个consumer消费的话,那么这些consumer必须在不同的组
注意:每个消费者实例可以消费多个分区,但是每一个分区最多只能被消费者组中的一个实例消费
kafka的文件存储机制
topic、partition和segment
1)在kafka文件存储中,同一个topic下有多个不同的partition:
2)每个partition的目录下面会有多组segment文件:
-
每个partition(目录)相当于一个巨型大文件被平均分配到多个大小都相等的segment数据文件中(但每个segment file消息数量不一定相等,这种特性方便old segment file快速被删除)
-
每组segment文件包含:.index文件、.log文件、.timeindex文件(.log文件就是实际存储message的地方,.index和.timeindex文件为索引文件,用于检索消息)
-
每个partition只需要支持顺序读写就行了,segment文件生命周期由服务端配置参数决定
-
这样做能快速删除无用文件,有效提高磁盘利用率
3)segment文件
-
segment文件由2大部分组成,分别为index file和data file,此2个文件一一对应,成对出现,后缀".index"和“.log”分别表示为segment索引文件、数据文件
-
segment文件命名规则:partion全局的第一个segment从0开始,后续每个segment文件名为上一个segment文件最后一条消息的offset值。数值最大为64位long大小,19位数字字符长度,没有数字用0填充
存储和查找message的过程
1)数据写入过程
每个Partition都是一个有序并且不可改变的消息记录集合(每个partition都是一个有序队列),当新的数据写入时,就被追加到partition的末尾。
在每个partition中,每条消息都会被分配一个顺序的唯一标识,这个标识被称为Offset(偏移量),用于partition唯一标识一条消息。
2)数据查找过程
在partition中通过offset查找message:
-
查找segment file:每一个segment文件名都包含了上一个segment最后一条消息的offset值,所以只要根据offset二分查找文件列表,就能定位到具体segment文件
-
通过segment file查找message:当定位到segment文件后,可以通过对应的.index元数据文件,在对应的.log文件中顺序查找对应的offset,然后即可拿到数据
3)说明:
kafka安装部署及操作
kafka单机部署
安装ZooKeeper
kafka需要依赖ZooKeeper,所以需要先安装并启动ZooKeeper,kafka使用zk有两种方式:
-
使用kafka自带的ZooKeeper(一般不推荐使用内置的ZooKeeper)
-
单独搭建ZooKeeper
使用kafka自带的ZooKeeper:
-
如果要使用kafka内置的ZooKeeper,修改好配置文件 ./config/zookeeper.properties
(主要修改zk的data位置和端口),直接启动即可
-
安装kafka
kafka需要java环境,需要安装jdk
-
kafka脚本程序及配置文件
几个kafka的操作脚本
-
kafka-topics.sh 创建topic程序
-
kafka-console-producer.sh 命令行模拟生产者生产消息数据程序
-
kafka-console-consumer.sh 命令行模拟消费者消费消息数据程序
kafka的配置文件
vim /usr/local/kafka/config/server.properties
-
kafka集群部署
环境信息
节点 | IP | ZK Port | Kafka Port | OS |
node01 |
10.0.0.80 |
2181 |
9092 |
CentOS7.9 |
node02 |
10.0.0.81 |
2181 |
9092 |
CentOS7.9 |
node03 |
10.0.0.82 |
2181 |
9092 |
CentOS7.9 |
部署ZooKeeper集群
kakfa依赖ZooKeeper,可以用以下两种方式使用ZooKeeper:
-
使用kafka自带的ZooKeeper(一般不推荐使用内置的ZooKeeper)
-
单独搭建ZooKeeper
搭建ZooKeeper集群见ZooKeeper文档。
部署kafka集群
所有节点(node01、node02、node03)上操作:
-
生产和消费消息测试
-
kafka-topics.sh 创建topic程序
-
kafka-console-producer.sh 命令行模拟生产者生产消息数据程序
-
kafka-console-consumer.sh 命令行模拟消费者消费消息数据程序
topic相关操作
操作topic使用kafka-topic.sh
脚本
-
生产和消费命令
1)生产消息
使用kafka自带的生产者命令生产消息 (可开一个窗口,模拟生产者)
-
2)消费消息
使用kafka自带的消费者命令消费消息 (可开多个窗口,模拟消费者)
-
查看消息本体及相关数据
查看kafka存放的消息
-
查看kafka存放在ZooKeeper中的元数据
-