kafka是依赖于zookeeper的,先安装并启动zookeeper

安装zookeeper
  • 下载zookeeper
  • 解压,进入zookeeper的conf目录,复制zoo_sample.cfg将其命名为zoo.cfg
  • 编辑zoo.cfg文件,把里面的数据保存目录dataDir改成自己的磁盘路径
  • 进入bin目录,点击zkServer.cmd启动zookeeper
安装kafka
  • 下载kafka
  • 解压并进入kafka的config目录,修改server.properties中的log文件路径
  • 启动kafka,进入kafka安装目录下的bin\windows目录下,在命令行窗口执行以下命令
.\bin\windows\kafka-server-start.bat .\config\server.properties

kafka与zookeeper的交互我们使用默认配置就行,默认就是连接的本机,端口也是默认的,localhost:2181。

创建主题

在kafka安装目录下,进行\bin\windows目录下,执行以下命令

kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1
--partitions 1 --topic test
启动producer与consumer测试

在kafka安装目录下,进入\bin\windows目录下,执行以下命令

启动producer
kafka-console-producer.bat --broker-list localhost:9092 --topic test
启动consumer
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test

在producer运行窗口输入消息,在consumer收到输入的信息,则说明kafka已正常安装。

kafka常用命令
列出可用主题
kafka-topics.bat --list --zookeeper localhost:2181
查看主题详细信息
kafka-topics.bat --describe --zookeeper localhost:2181 --topic test
配置集群

上面只启了一个节点,下面配置多个节点,这里是在同一台机器上做的演示

  • 将config目录下的server.properties复制两份,分别命名为server-1.properties,server-2.properties
  • 分别编辑server-1.properties,server-2.properties配置文件,修改以下几个参数:broker.id、listeners、log.dirs,如下所示:

server-1.properties

broker.id=1
listeners=PLAINTEXT://:9093
log.dirs=D:/java/apache/kafka_2.11-2.0.0/config/kafka-logs-1

server-2.properties

broker.id=1
listeners=PLAINTEXT://:9094
log.dirs=D:/java/apache/kafka_2.11-2.0.0/config/kafka-logs-2

在同个集群中broker.id必需是唯一的,不能重复,如果是同一台机器运行多个节点,要把监听端口和日志文件路径修改成不一样的,以免数据被覆盖。

前面zookeeper和其中一个节点已经启动了,现在我们把剩余的两个节点也启动一下,只需要分别执行以下命令即可。

.\bin\windows\kafka-server-start.bat .\config\server-1.properties

.\bin\windows\kafka-server-start.bat .\config\server-2.properties

创建分区副本为三的主题

kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 3 --partitions 1 --topic my-replicated-topic

怎么知道集群中每个节点在做什么呢?可以使用“主题描述”命令查看,如下

kafka-topics.bat --describe --zookeeper localhost:2181 --topic my-replicated-topic

运行结果如下,下面是对输出的解释。第一行给出了所有分区的摘要,下面的每一行给出了关于一个分区的信息。因为这个主题只有一个分区,所以只有一行。

Topic:my-replicated-topic       PartitionCount:1        ReplicationFactor:3     Configs:
Topic: my-replicated-topic      Partition: 0    Leader: 1       Replicas: 1,0,2 Isr: 1,0,2
  • “leader”是负责对给定分区进行所有读写操作的节点。每个节点将作为随机选择的分区的一部分的领导者。
  • “replicas”是为这个分区复制日志的节点列表,不管它们是leader还是当前存活的。
  • “isr”是“同步”副本的集合。这是副本列表的子集,这些副本列表现在还在运行中,并被领导者捕获。

在这里,主题分区的leader是节点1,在用相同的命令查看之前创建的主题test

kafka-topics.bat --describe --zookeeper localhost:2181 --topic test

结果如下所示

Topic:test      PartitionCount:1        ReplicationFactor:1     Configs:
Topic: test     Partition: 0    Leader: 0       Replicas: 0     Isr: 0

这个主题没有副本,它在最开始创建的节点0上。

我们往my-replicated-topic主题发布一些信息测试一下

kafka-console-producer.bat --broker-list localhost:9092 --topic my-replicated-topic

>test message 4
>test message 5
>test message 6
>test message 7
>test message 8

下面启动消费者来消费这个主题的信息

kafka-console-consumer.bat --bootstrap-server localhost:9092 --from-beginning --topic my-replicated-topic

test message 4
test message 5
test message 6
test message 7
test message 8

消费者启动后消费的信息和上面发布的信息一样

下面来测试一下集群的容错能力,因为leader是节点1,现在把节点下关掉,测试消息的发布和消费是否正常,先来看一下主题描述

kafka-topics.bat --describe --zookeeper localhost:2181 --topic my-replicated-topic

Topic:my-replicated-topic       PartitionCount:1        ReplicationFactor:3     Configs:
Topic: my-replicated-topic      Partition: 0    Leader: 0       Replicas: 1,0,2 Isr: 0,2

从上面的结果看出,leader已经切换到从之前的从节点0,复制节点只有0和2,节点1不再是复制节点。再用生产者发布一些测试信息,看消费者是否还可以消费,结果显示消费者正常消费,说明原来的leader down了并没有影响消息的消费。