一、 什么是Kafka?
-
分布式的基于发布/订阅模式的消息队列
-
消息队列的两种模式
- 1、点对点模式
- 2、发布/订阅模式
-
-
分布式流平台
二、 主要作用
- 异步
- 消峰
- 解耦
三、 Kafka基础架构
-
为了方便扩展,并提高吞吐量,可以把一个topic分成多个partition(分区);
-
配合分区的设计,提出消费者组的概念,组内每个消费者并行消费;
-
为提高可用性,可以为每个partition增加若干副本。
Kafka基础架构图 - 1.Producer:消息生产者,就是向Kafka的broker发送消息的客户端;
- 2.Consumer:消息消费者,从Kafka的broker接收消息的客户端;
- 3.ConsumerGroup:消费者组,由多个Consumer组成。组内每个消费者负责消费不同分区的数据,一个分区只能由一个消费者消费,消费者组之间互不影响;
- 4.Broker:一台Kafka的服务器就是一个Broker。一个集群由多个broker组成。一个broker可以有多个topic。
- 5.Partition:为实现扩展性,一个topic可以分不到多个broker上,每个broker上的topic就是一Partition。
四、 Kafka命令行操作
- 1.启动集群 (依次启动各个节点上的Kafka)
[root@hadoop01 kafka]# kafka-server-start.sh -daemon /opt/kafka/config/server.properties
[root@hadoop02 kafka]# kafka-server-start.sh -daemon /opt/kafka/config/server.properties
[root@hadoop03 kafka]# kafka-server-start.sh -daemon /opt/kafka/config/server.properties
- 2.关闭集群
[root@hadoop01 kafka]# kafka-server-stop.sh
[root@hadoop02 kafka]# kafka-server-stop.sh
[root@hadoop03 kafka]# kafka-server-stop.sh
- 3.查看当前服务器中所有topic
[root@hadoop01 kafka]# kafka-topics.sh --list --zookeeper hadoop01:2181
- 4.创建topic
[root@hadoop01 ~]# kafka-topics.sh --zookeeper hadoop01:2181 --create --topic yang01 --partitions 3 --replication-factor 1
- 5.删除topic
[root@hadoop01 ~]# kafka-topics.sh --zookeeper hadoop01:2181 --delete --topic yang01
ps:需要server.properties中设置delete.topic.enable=true否则只是标记删除,不会真删除
- 6.查看某个Topic的详情
[root@hadoop01 ~]# kafka-topics.sh --describe --topic yang01 --zookeeper hadoop01:2181
- 7.发送消息
[root@hadoop01 ~]# kafka-console-producer.sh --topic yang01 --broker-list hadoop01:9092
>1
>2
>3
- 8.消费消息(在另一台broker上)
[root@hadoop01 ~]# kafka-console-consumer.sh
--topic yang01
--bootstrap-server hadoop01:9092
--from-beginning
1
2
3
ps:from-beginning:会把topic中以往所有的数据都读取出来。根据业务场景选择是否增加该配置。
五、 Kafka运行流程
- 先从集群获取分区的leader
- producer将消息发送给leader
- leader将消息写入本地文件
- follower从leader同步消息
- follower将同步完消息返回ACK给leader
- leader收到所有副本ACK后发送ACK给producer
ps:- 写入数据的时候永远的找leader,不会直接将数据写入follower,follower是主动的去leader进行同步的
- producer采用推push模式将消息发布到broker,每条消息都被追加(append)到分区中,属于顺序写入磁盘(顺序写入磁盘效率比随机写内存要高,是保障kafka高吞吐量的原因之一)
六、Kafka文件存储机制
1、存储机制
由生产者生产的消息会不断追加到log文件的末尾,为防止文件过大导致定位效率低下和数据不方便清除,Kafka采用了分片和索引机制。将每个partition分成多个segment,每个segment下面包含“.index文件”、“.log文件”、“.timeindex”文件,log文件就实际是存储message的地方,而index和timeindex文件为索引文件,用于检索消息。
2、index和log文件
七、Kafka分区(partition)简介
- 优点:
- 1、方便扩展:因为一个topic可以有多个partition,当数据量增加时可以相应的增加分区数
- 2、提高并发:以partition为读写单位,可以多个消费者同时消费数据,提高处理效率。
- 分区原则
- 1、 partition在写入的时候可以指定需要写入的partition,如果指定partition,则写入对应的partition
- 2、 如果没有指定partition,但是有key的情况下,则会根据key的hash值与topic的partition数进行取余,得到partition的值
- 3、 如果既没指定partition,又没有设置key,第一次调用时会随机生成一个整数,后面每次调用在这个整数上自增,将这个值与topic的partition数进行取余得到partition的值
八、Kafka应答机制
在生产者向队列写入数据的时候可以设置参数来确定是否确认kafka接收到数据,这个参数可设置的值为0、1、all。
- 0:代表producer往集群发送数据不需要等到集群的返回,不确保消息发送成功。安全性最低但是效率最高。
- 1:代表producer往集群发送数据只要leader应答就可以发送下一条,只确保leader发送成功。
- all:代表producer往集群发送数据需要所有的follower都完成从leader的同步才会发送下一条,确保leader发送成功和所有的副本都完成备份。安全性最高,但是效率最低。