一、kafka是什么
Kafka 是一个高吞吐量的分布式发布订阅消息系统,解耦了消息生产者和消息消费者。与大数据框架 Spark 配合使用,可以实现数据的实时流处理,目前做大数据相关的项目,都会用到 Kafka 消息系统。
Kafka 是一个分布式的流处理平台。它具有以下特点:
- 支持消息的发布和订阅,类似于 RabbitMQ、ActiveMQ 等消息队列。
- 支持数据实时处理。
- 能保证消息的可靠性投递。
- 支持消息的持久化存储,并通过多副本分布式的存储方案来保证消息的容错。
- 高吞吐率,单 Broker 可以轻松处理数千个分区以及每秒百万级的消息量。
二、理解kakfa构成
名称解释
a. broker
一台服务器上只会安装一个 Kafka 软件,这台服务器就是一个 Kafka Server,此时 Kafka Server 称为 broker。
b. topic 和 partition
发布到 Kafka 集群上的消息都属于某一个分类,这个分类称为 topic,它是一个逻辑概念。topic 存储在 broker 中。一个 topic 包括多个 partition(分区),partition 是物理上的概念。producer 发送的消息存储在 partition 中,每个 partition 可以有多个 replica(副本)。
c. producer 是用来产生消息的,负责将消息发送到 Kafka broker的topic上。
d. consumer 是用来消费消息的,用于从 Kafka broker上的topic中读取消息。
broker 和 consumer 使用 Zookeeper 管理状态信息,如 offset 信息。上述内容可以用下图表示:
整体的关系
深入学习kakfa的topic
1、Topic当中的概念
- topic:
用于划分 Kafka 集群中的消息(Message)的逻辑概念,生产者发送消息,要发送给某个 topic;消费者消费消息,要消费某个(某几个)topic 中的消息。Kafka 集群中的消息都存储在 topic 中。 - Partitions:
topic 中的消息是以 partition 分区的形式存储的,注意:partition 是 Kafka 支持扩展和高并发处理的基础。每个 topic 包括 1 个或多个 partition。 - Offset:
每个 partition 中的消息都是顺序存储的,每个消息都是有编号的,编号是顺序增长的。这个编号叫 offset,offset 记录了消息在 partition 中的位置。注意:offset 在一个 partition 内是有序的,多个 partition 之间的 offset 是独立存在的。(也就是说多个partition当中的offset都是各自维护各自的,不同的partition之间不会串)
- Replication:
Kafka 支持以 partition 为单位对消息进行冗余备份,每个 Partition 都必须配置至少 1 个 replication。replication-factor 参数指定了 replication 的个数,即 partition 的副本个数。 - Leader replica:
在 partition 的多个副本 replication 中,有一个副本叫主副本(即 Leader replica),所有消息消费者和消息生产者的读写请求都由 Leader replica 处理,这么做是为了保证一致性。其他副本叫从副本(即 Follower replica),从副本从主副本处把数据更新同步到本地。
如上图所示,Kafka 集群中有4个 broker,某个主题中有3个分区,且副本因子(即副本个数)也为3,如此每个分区便有1个 leader 副本和2个 follower 副本。生产者和消费者只与 leader 副本进行交互,而 follower 副本只负责消息的同步,很多时候 follower 副本中的消息相对 leader 副本而言会有一定的滞后
- ISR(全拼为:In-Sync Replica):
从副本中,如果从主副本处把数据更新同步到本地了,那么这个从副本处于 ISR 状态(已同步状态),如果没有完全与主副本同步,那么会被从 ISR 中踢出去,处于非同步状态
分区中的所有副本统称为 AR(Assigned Replicas),
leader 副本同步滞后过多的副本(不包括 leader 副本)组成 OSR(Out-of-Sync Replicas)
正常情况下:AR=ISR+OSR
三、kafka 安装和使用
1、下载kafka并解压
# sudo wget https://labfile.oss.aliyuncs.com/courses/859/kafka_2.11-1.1.1.tgz
# tar -zxvf kafka_2.11-1.1.1.tgz
解压后可以看到,kafka的根目录下,有bin文件夹和config文件夹,顾名思义bin里面负责各种命令脚本,
config是配置文件。
2、使用zookeeper进行kafka集群的管理, Kafka自带的 Zookeeper 软件,在bin文件夹下有个
zookeeper-server-start.sh 脚本文件。
备注:必须装java环境,否则
# ./zookeeper-server-start.sh ../config/zookeeper.properties
/home/kafka/kafka/bin/kafka-run-class.sh: line 300: exec: java: not found
后台运行zookeeper服务
nohup ./zookeeper-server-start.sh ../config/zookeeper.properties &
3、配置kafka集群并运行
修改server.properties文件
首先复制server.properties,并修改复制的文件
配置文件名称 | 修改内容 |
server.properties | 不改 |
server1.properties | 修改 broker.id=1,log.dirs=/tmp/kafka-logs-1,新增 listeners=PLAINTEXT://:9093 三个参数值 |
server2.properties | 修改 broker.id=2,log.dirs=/tmp/kafka-logs-2 和 listeners=PLAINTEXT://:9094 三个参数值 |
下一步,启动 Kafka 集群。上面我们看到的三个 Kafka 配置文件,每个配置文件对应 Kafka 集群中一个节点(称为 Broker)。
#使用配置文件 server.properties 启动第一个 Kafka Broker,注意:命令最后的 & 符号表示以后台进程启动,启动完成后,按回车键,回到命令行,启动另一个 Kafka Broker。
./kafka-server-start.sh ../config/server.properties &
#使用配置文件 server-1.properties 启动第二个 Kafka Broker 。启动完成后,按回车键,回到命令行,启动另一个 Kafka Broker 。
./kafka-server-start.sh ../config/server-1.properties &
#使用配置文件 server-2.properties 启动第三个 Kafka Broker。启动完成后,按回车键,回到命令行。
./kafka-server-start.sh ../config/server-2.properties &
到目前为止,单机版三个 Broker 的 Kafka 集群已经安装成功。在实验准备阶段的内容中,我们知道:生产者生产消息,将消息发送到 Kafka 服务器(实际上消息存储到了 Kafka 中的 Topic 里面)。消费者消费消息,从 Kafka 服务器读取消息。这里的 Kafka 服务器相当于一个中间人,用于存储生产者和消费者交互的数据(消息),下一步我们要在 Kafka 集群上创建一个 Topic ,用于存储消息,创建一个消息生产者,向 Topic 发送消息。创建一个消息消费者,从 Topic 读取消息。
4、创建Topic
执行下面的命令创建一个myFirstTopic
# ./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic myFirstTopic
Created topic "myFirstTopic".
- kafka-topics.sh:Kafka 提供的一个 shell 脚本文件(位于 bin 目录中),用于创建或查看 topic 信息。
- create:shell 脚本的参数,告诉 shell 脚本要创建一个 topic。
- zookeeper localhost:2181:shell 脚本的参数,告诉 shell 脚本 Zookeeper 的地址用于保存 topic 元数据信息。
- partitions 1:shell 脚本参数,告诉 shell 脚本所创建的这个 topic 的 partition 个数为 1。
- replication-factor 1:shell 脚本参数,告诉 shell 脚本每个 partition 的副本数为 1。
- topic myFirstTopic:shell 脚本参数,告诉 shell 脚本创建的 topic 的名称为 myFirstTopic。
查看所有创建的Topic
[root@VM-0-14-centos bin]# ./kafka-topics.sh --zookeeper localhost:2181 --list
myFirstTopic
备注: 命令查看
./kafka-topics.sh --help
5、使用生产者生产消息、使用消费者处理消息
①启动生产者
./kafka-console-producer.sh --broker-list localhost:9092 --topic myFirstTopic
② 新开终端,启动消费者
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic myFirstTopic
③使用生产者发送消息
[root@XXX bin]# ./kafka-console-producer.sh --broker-list localhost:9092 --topic myFirstTopic
>hello world
>你好 世界
>
④消费者查看发送的消息
[root@XXX bin]# ./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic myFirstTopic
hello world
你好世界
6、利用kafka-topics.sh查看topic相关的信息
关于./kafka-topics.sh 脚本参数详见:
当我们查看一个topic的时候
./kafka-topics.sh --zookeeper localhost:2181 --describe --topic mySecondTopic
返回如下信息
Topic: mySecondTopic PartitionCount:3 ReplicationFactor:2 Configs:
Topic: mySecondTopic Partition: 0 Leader: 2 Replicas: 2,0 Isr: 2,0
Topic: mySecondTopic Partition: 1 Leader: 0 Replicas: 0,1 Isr: 0,1
Topic: mySecondTopic Partition: 2 Leader: 1 Replicas: 1,2 Isr: 1,2
Partition分区是三个、每个分区的副本是2个
leader、replicas 和 ISR 涉及到 kafka 内核结构
3、查看zookeeper上注册的kafka消费者元数据(管理状态信息)
zookeeper-shell.sh 可以进入到zookeeper的Shell命令模式
./zookeeper-shell.sh localhost:2181
可以利用 ls 命令查看节点
Connecting to localhost:2181
Welcome to ZooKeeper!
JLine support is disabled
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
ls /
[cluster, controller_epoch, controller, brokers, zookeeper, admin, isr_change_notification, consumers, log_dir_event_notification, latest_producer_id_block, config]
ls /brokers
[ids, topics, seqid]
ls /brokers/ids
[0, 1, 2]
ls /brokers/topics
[mySecondTopic, myFirstTopic, __consumer_offsets]