下载、安装
官网下载
然后解压
> tar -xzf kafka_2.11-0.10.2.0.tgz
> cd kafka_2.11-0.10.2.0
linux用户使用bin/
目录下的命令,Windows用户可以使用bin/windows/
下的命令
使用
启动服务
kafka依赖于ZooKeeper,如果没有安装zookeeper,可以用kafka包里面现成的:
> bin/zookeeper-server-start.sh config/zookeeper.properties
[2017-06-22 15:01:37,495] INFO Reading configuration from: config/zookeeper.properties (org.apache.zookeeper.server.quorum.QuorumPeerConfig)
...
然后启动kafka
> bin/kafka-server-start.sh config/server.properties
[2017-06-22 15:01:47,028] INFO Verifying properties (kafka.utils.VerifiableProperties)
[2017-06-22 15:01:47,051] INFO Property socket.send.buffer.bytes is overridden to 1048576 (kafka.utils.VerifiableProperties)
...
创建主题
创建一个test
主题,1个分区,1个副本
> bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
看一眼刚才创建的主题
> bin/kafka-topics.sh --list --zookeeper localhost:2181
test
注:如果不想手动创建主题,你可以自动创建
发消息
运行kafka自带的客户端发一些消息试试。默认情况下,每一行作为一条消息发出去。
> bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
This is a message
This is another message
消费
然后用kafka自带的消费者输出
> bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
This is a message
This is another message
提示:
如果上面的每个命令都在不同的终端中运行,你就可以在生产者终端中输入消息后,在消费者终端中看到。
启动一个多broker的集群
目前我们已经运行了一个单broker的kafka,只是有一个节点的集群。再让我们扩展到三个节点玩一下。
为其他两个节点复制一下配置文件:
> cp config/server.properties config/server-1.properties
> cp config/server.properties config/server-2.properties
修改一下配置:
config/server-1.properties:
broker.id=1
listeners=PLAINTEXT://:9093
log.dir=/tmp/kafka-logs-1
config/server-2.properties:
broker.id=2
listeners=PLAINTEXT://:9094
log.dir=/tmp/kafka-logs-2
abroker.id
是集群中每个节点的唯一识别。我们也要改一下节点的端口和日志路径,主要因为是在本地环境,如果在多台机器上,就可以不改端口和日志路径了。
前面已经启动了zk,和一个几点,现在我们只需启动另外两个节点:
> bin/kafka-server-start.sh config/server-1.properties &
...
> bin/kafka-server-start.sh config/server-2.properties &
...
现在我们创建一个1个分区3个副本的新主题:
> bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 1 --topic my-replicated-topic
现在我们有一个kafka集群了,那么我们怎么知道哪个broker在做什么呢? 运行describe topics
命令看看:
> bin/kafka-topics.sh --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,2,0 Isr: 1,2,0
第一行给出了所有分区的摘要,每个附加行提供有关一个分区的信息。 因为这个主题只有一个分区,只有一行。
- “leader”是负责给定分区的所有读取和写入的节点。 每个节点将成为随机选择的分区部分的引导者。
- “replicas”是复制此分区日志的节点的列表,无论它们是不是leader。
- “isr”是一组“同步”副本。 这是副本列表的子集,该副本目前正在生效并被leader所追踪。
我们可以再看一下最开始创建的test主题
> bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic test
Topic:test PartitionCount:1 ReplicationFactor:1 Configs:
Topic: test Partition: 0 Leader: 0 Replicas: 0 Isr: 0
往新的主题发一些消息:
> bin/kafka-console-producer.sh --broker-list localhost:9092 --topic my-replicated-topic
...
my test message 1
my test message 2
消费一下这些消息:
> bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic my-replicated-topic
...
my test message 1
my test message 2
容错
现在我们来测试容错。 broker 1作为 leader,我们kill一下试试:
> ps aux | grep server-1.properties
7564 ttys002 0:15.91 /System/Library/Frameworks/JavaVM.framework/Versions/1.8/Home/bin/java...
> kill -9 7564
win用户可以用这个命令:
> wmic process get processid,caption,commandline | find "java.exe" | find "server-1.properties"
java.exe java -Xmx1G -Xms1G -server -XX:+UseG1GC ... build\libs\kafka_2.10-0.10.2.0.jar" kafka.Kafka config\server-1.properties 644
> taskkill /pid 644 /f
leader已切换到其中一个slaves节点,节点1不再处于同步副本集中:
> bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-replicated-topic
Topic:my-replicated-topic PartitionCount:1 ReplicationFactor:3 Configs:
Topic: my-replicated-topic Partition: 0 Leader: 2 Replicas: 1,2,0 Isr: 2,0
不过消息仍然可以消费,即便刚才的leader已经挂掉了:
> bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic my-replicated-topic
...
my test message 1
my test message 2