Kafka 简介
Kafka
是一个基于分布式的消息发布 - 订阅系统,它被设计成快速、可扩展的、持久的分布式流处理平台。与其他消息发布 - 订阅系统类似,Kafka 在主题当中保存消息的信息。生产者向主题写入数据,消费者从主题读取数据。由于 Kafka 的特性是支持分布式,同时也是基于分布式的,所以主题也是可以在多个节点上被分区和覆盖的。
术语
- Topic 用来对消息进行分类,每个进入到 Kafka 的信息都会被放到一个 Topic 下
- Broker 用来实现数据存储的主机服务器
- Partition 每个 Topic 中的消息会被分为若干个 Partition,以提高消息的处理效率
- Producer 消息的生产者
- Consumer 消息的消费者
- Consumer Group 消息的消费群组
运行环境
三台 CentOS 7.5 虚拟机
- server1 192.168.78.101 ( Master KDC Server )
- server2 192.168.78.102 ( Client )
- server3 192.168.78.103 ( Client )
软件 版本
- JDK 1.8.0_181
- Kafka 2.11-2.0.1 (Scala 版本 - Kafka 版本)
安装配置 Kafka
下载并解压安装包
从 官网下载 对应版本,放到服务器目录,此处我们放到 /opt
下并解压:
[root@server1 opt]# wget http://mirror.bit.edu.cn/apache/kafka/2.0.1/kafka_2.11-2.0.1.tgz
[root@server1 opt]# tar -zxvf kafka_2.11-2.0.1.tgz
[root@server1 opt]# cd kafka_2.11-2.0.1/
启动 Kafka 服务器
Kafka
需要用到 Zookeeper
,因此在启动前需要先启动后者。如果本地尚未安装,可以使用 Kafka
自带的单节点 Zookeeper
实例:
[root@server1 kafka_2.11-2.0.1]# bin/zookeeper-server-start.sh config/zookeeper.properties
但接下来我们要配置多节点集群,所以需要假设已经配置好本地 Zookeeper
。-daemon
参数指定后台启动:
[root@server1 kafka_2.11-2.0.1]# bin/kafka-server-start.sh -daemon config/server.properties
创建 Topic
创建名为 HelloWorld 的 Topic
:
[root@server1 kafka_2.11-2.0.1]# bin/kafka-topics.sh --create --zookeeper server1:2181 --replication-factor 1 --partitions 1 --topic HelloWorld
查看 Topic
:
[root@server1 kafka_2.11-2.0.1]# bin/kafka-topics.sh --list --zookeeper server1:2181
除手动创建 Topic
外,也可在 config/server.properties
中添加如下项,使生产消息时自动创建不存在的 Topic
:
auto.create.topics.enable = true # default true
生产者发送消息
Kafka
生产者命令行可以接收文件或者标准输入,并将其作为消息发送给 Kafka
集群。默认情况下,每一行都会作为一条单独的消息。
[root@server1 kafka_2.11-2.0.1]# bin/kafka-console-producer.sh --broker-list server1:9092 HelloWorld --topic HelloWorld
>foo
>bar
消费者接收消息
Kafka
消费者命令行可以接收消息并作为标准输出。在开启生产者的同时,另外启动一个终端作为消费者:
[root@server1 kafka_2.11-2.0.1]# bin/kafka-console-consumer.sh --bootstrap-server server1:9092 —topic HelloWorld --whitelist HelloWorld --from-beginning
foo
bar
注意,此处需要加上 --whitelist HelloWorld
,否则命令无法执行。
另外,新版本 Consumer
已将信息保存 Kafka
中,无需与 Zookeeper
通信,但如果使用的旧版 Consumer
,并且将元数据保存在 Zookeeper
中,就需要将 --bootstrap-server
替换为 --zookeeper
:
[root@server1 kafka_2.11-2.0.1]# bin/kafka-console-consumer.sh --zookeeper server1:2181 —topic HelloWorld --whitelist HelloWorld --from-beginning
搭建多节点多 Broker 集群
复制 Kafka 节点
[root@server1 opt]# scp -r kafka_2.11-2.0.1 root@server2:/opt/kafka_2.11-2.0.1
[root@server1 opt]# scp -r kafka_2.11-2.0.1 root@server3:/opt/kafka_2.11-2.0.1
修改 broker.id
broker.id
是集群中每个节点的唯一标识,所以我们需要各节点下 config/server.properties
中的 broker.id
修改为不同数值,如 3 个节点分别为 0 / 1 / 2。另外,因为 broker
运行在不同节点,不能再使用自带的 Zookeeper
,所以需要设置 Zookeeper
集群,配置如下:
# server1
broker.id = 1
zookeeper.connect = server1:2181,server2:2181,server3:2181
# server2
broker.id = 2
zookeeper.connect = server1:2181,server2:2181,server3:2181
# server3
broker.id = 3
zookeeper.connect = server1:2181,server2:2181,server3:2181
启动所有节点
[root@server1 opt]# bin/kafka-server-start.sh config/server.properties
[root@server2 opt]# bin/kafka-server-start.sh config/server.properties
[root@server3 opt]# bin/kafka-server-start.sh config/server.properties
可以通过 jps
命令查看是否启动:
[root@server1 kafka_2.11-2.0.1]# jps # 下面的 QuorumPeerMain 为 Zookeeper
12135 Jps
11053 Kafka
10623 QuorumPeerMain
创建冗余 Topic
我们可以使用 --replication-factor
指定复制因子为 3,因为我们启动了 3 个 broker。如果指定数为 n,那么 n - 1(n > 1) 个 broker 失败之前仍可保证数据为丢失,其中 n 不得大于 broker 数量。
[root@server1 kafka_2.11-2.0.1]# bin/kafka-topics.sh --create --zookeeper server1:2181 --replication-factor 3 --partitions 1 --topic MultiBroker
查看 Topic
详情:
[root@server1 kafka_2.11-2.0.1]# bin/kafka-topics.sh --describe --zookeeper server1:2181 --topic MultiBroker
Topic:MultiBroker PartitionCount:1 ReplicationFactor:3 Configs:
Topic: MultiBroker Partition: 0 Leader: 2 Replicas: 2,0,1 Isr: 2,0,1
从上面可以看到,第一行是 Topic
概要信息,包括名称、分区数以及复制因子;第二行中的 0 / 1 / 2 分别代表不同的 broker,如目前 2 号 broker 为 leader,Replicas 表示每个 broker 上都有一个备份,Isr 表示当前存活并且能够更新备份的 broker:
-
Partition: 分区编号。当前
Topic
只有一个分区,故编号为 0 -
Leader: Leader 是为对应分区提供所有读/写的节点,随机产生。当前 Leader 为 0,代表 Broker 0
-
Replicas: 提供对应分区的备份列表,不受是否为 Leader 或者是否存活影响。当前为 2,0,1,即为 Broker 2,0,1
-
Isr: “in-sync” replicas 的集合,为 Replicas 的子集,仅包含当前存活且可从 Leader 中复制的节点。当前为 2,0,1,即为 Broker 2,0,1,稍后停掉一个 Broker 会发生变化
生产者发送消息
[root@server1 kafka_2.11-2.0.1]# bin/kafka-console-producer.sh --broker-list server1:9092 --topic MultiBroker
>foo
>bar
消费者接收消息
[root@server2 kafka_2.11-2.0.1]# bin/kafka-console-consumer.sh --bootstrap-server server1:9092 —topic MultiBroker --whitelist MultiBroker --from-beginning
foo
bar
[root@server3 kafka_2.11-2.0.1]# bin/kafka-console-consumer.sh --bootstrap-server server1:9092 —topic MultiBroker --whitelist MultiBroker --from-beginning
foo
bar
注意此处两个 Consumer
都读到了内容,因为两者分属于不同的组,可以通过下列命令查看:
[root@server3 kafka_2.11-2.0.1]# bin/kafka-consumer-groups.sh --bootstrap-server server1:9092 --list
console-consumer-10318
console-consumer-17963
若在启动 Consumer
时使用 --group test-group
参数指定分组,则同组内的 client 同一时间只有一个可以消费:
bin/kafka-console-consumer.sh --bootstrap-server server1:9092 --group test-group —topic MultiBroker --whitelist MultiBroker --from-beginning
验证容错性
从前面可以看到,Kafka 在 3 节点集群中正常运行,且 MultiBroker
分区为 Leader 为 Broker 2,所以我们把 Broker 2 停掉会怎么样呢?可以使用 CTRL-C
或执行脚本:
[root@server3 kafka_2.11-2.0.1]# bin/kafka-server-stop.sh
再次查看 MultiBroker
详情,可以发现 Leader 变为了 Broker 0,Replicas 未发生变化,但 Isr 变为了 0,1,说明当前只能在 Broker 0,1 上备份:
[root@server3 kafka_2.11-2.0.1]# bin/kafka-topics.sh --describe --zookeeper server1:2181 --topic MultiBroker
Topic:MultiBroker PartitionCount:1 ReplicationFactor:3 Configs:
Topic: MultiBroker Partition: 0 Leader: 0 Replicas: 2,0,1 Isr: 0,1
再次使用命令行模拟生产 / 消费消息 ,依然正常运行:
[root@server1 kafka_2.11-2.0.1]# bin/kafka-console-producer.sh --broker-list server1:9092 --topic MultiBroker
>new leader test
[root@server2 kafka_2.11-2.0.1]# bin/kafka-console-consumer.sh --bootstrap-server server1:9092 —topic MultiBroker --whitelist MultiBroker --from-beginning
new leader test
此时重启 Broker 3 会发生什么呢?没错,Broker 无缝衔接,照常使用:
[root@server3 kafka_2.11-2.0.1]# bin/kafka-topics.sh --describe --zookeeper server1:2181 --topic MultiBroker
Topic:MultiBroker PartitionCount:1 ReplicationFactor:3 Configs:
Topic: MultiBroker Partition: 0 Leader: 0 Replicas: 2,0,1 Isr: 0,1,2