一、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 信息。上述内容可以用下图表示:

kafka服务端配置是否生效 kafka服务端与客户端_kafka

 

 整体的关系

kafka服务端配置是否生效 kafka服务端与客户端_kafka_02

 

 

深入学习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服务端配置是否生效 kafka服务端与客户端_kafka服务端配置是否生效_03

 

 

如上图所示,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]