原文地址,转载请注明出处: https://blog.csdn.net/qq_34021712/article/details/79829548 ©王赛超
单节点安装
下载kafka二进制包
从官网下载最新的kafka安装包,我下载的是Scala 2.12 - kafka_2.12-1.1.0.tgz 从Scala 2.12起,只支持java8.
安装java8环境
参考教程:linux安装jdk 只需要将java版本换成1.8的就可以了。
解压
#解压
tar -zxvf kafka_2.12-1.1.0.tgz
#移动到/usr/local下
mv kafka_2.12-1.1.0 /usr/local/
启动zookeeper服务
Kafka需要使用ZooKeeper,因此如果你还没有ZooKeeper服务器,你需要首先启动ZooKeeper服务器。参考: zookeeper单机、集群搭建
你可以使用与kafka打包在一起的便捷脚本来获得快速且简单的单节点ZooKeeper实例。这里直接使用自带zookeeper启动
#前台启动zookeeper
bin/zookeeper-server-start.sh config/zookeeper.properties
#后台启动zookeeper
bin/zookeeper-server-start.sh -daemon config/zookeeper.properties
启动kafka
#前台启动kafka
bin/kafka-server-start.sh config/server.properties
#后台启动kafka
bin/kafka-server-start.sh -daemon config/server.properties
创建topic
我们用一个分区和一个副本创建一个名为“test”的topic
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
如果我们运行list topic命令,我们现在可以看到该topic:
bin/kafka-topics.sh --list --zookeeper localhost:2181
你也可以配置在发布消息到一个不存在的topic时自动创建 ,而不需要手动创建。
发送一些消息
Kafka附带一个命令行客户端,它将从文件或标准输入中获取输入,并将其作为消息发送到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
停止kafka
bin/kafka-server-stop.sh
如果你将上述每个命令都在不同的终端中运行,你的Kafka启动正常,那么你现在应该能够将消息键入生产者终端,并将它们显示在消费者终端中。
集群安装
上面是单节点搭建过程,下面让我们将集群扩展为三个节点(仍在我们的本机器上)。将单节点生成的日志和数据全部删除。从头开始搭建新环境。
首先我们为每个代理创建一个配置文件
cp config/server.properties config/server-1.properties
cp config/server.properties config/server-2.properties
现在编辑这些新文件并设置下列属性:
#config/server.properties:
broker.id=0
listeners=PLAINTEXT://172.20.1.187:9092
log.dir=/tmp/kafka-logs
#config/server-1.properties:
broker.id=1
listeners=PLAINTEXT://172.20.1.187:9093
log.dir=/tmp/kafka-logs-1
#config/server-2.properties:
broker.id=2
listeners=PLAINTEXT://172.20.1.187:9094
log.dir=/tmp/kafka-logs-2
broker.id属性:是群集中每个节点的唯一且永久的名称。我们必须重写端口和日志目录,因为我们在同一台机器上运行这三个节点,所以要修改端口号 和 各自对应的日志输出。
启动zookeeper
bin/zookeeper-server-start.sh -daemon config/zookeeper.properties
本次使用kafka自带zookeeper,如果使用外部的zookeeper 配置server.properties中zookeeper.connect属性,例如:
zookeeper.connect=172.20.1.187:2181,172.20.1.188:2181,172.20.1.189:2181
然后启动三个节点:
> bin/kafka-server-start.sh -daemon config/server.properties
...
> bin/kafka-server-start.sh -daemon config/server-1.properties
...
> bin/kafka-server-start.sh -daemon config/server-2.properties
...
现在创建一个复制因子为三的新topic
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 1 --topic my-replicated-topic
好吧,但现在我们有一个集群,我们怎么知道每一个节点在做什么?要查看运行“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
这里是对输出的解释。
第一行
显示所有partitions的一个总结,列出了topic的名称,分区数(PartitionCount),副本数(ReplicationFactor)以及其他的配置(Config.s) 如果我们只有一个partition,则下面只显示一行。
leader
是在给出的所有partitons中负责读写的节点,每个节点都有可能成为leader,每个分区都会有随机选择的leader.
replicas
显示给定partiton所有副本所存储节点的节点列表,不管该节点是否是leader或者是否存活。
isr
副本都已同步的的节点集合,这个集合中的所有节点都是存活状态,并且跟leader同步
上面的显示中,第一个节点也就是broker.id=1的 那个节点是领导者。
单备份单分区
还记得我们在单节点搭建中 创建的单分区单备份Test topic吗?我们可以使用相同的命令创建并且查看test topic
创建test topic
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
查看test topic
> 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
我们可以看到test topic 没有副本,并且在服务器0上。
多备份多分区
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 3 --topic my-replicated-partitions-topic
查看my-replicated-partitions-topic
> bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-replicated-partitions-topic
Topic:my-replicated-partitions-topic PartitionCount:3 ReplicationFactor:3 Configs:
Topic: my-replicated-partitions-topic Partition: 0 Leader: 0 Replicas: 0,1,2 Isr: 0,1,2
Topic: my-replicated-partitions-topic Partition: 1 Leader: 1 Replicas: 1,2,0 Isr: 1,2,0
Topic: my-replicated-partitions-topic Partition: 2 Leader: 2 Replicas: 2,0,1 Isr: 2,0,1
可以看到每个分区, 其leader不在一个节点上.
发布一些消息给my-replicated-topic
注意:
这里要注意(生产者消费者)和单节点的区别,因为改了properties中listeners=PLAINTEXT://172.20.1.187:9092
这个属性,所以下面的配置 不能再使用localhost 要使用 listeners 配置的ip地址,否则报以下异常:
[2018-04-05 15:43:21,289] WARN Connection to node 0 could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)
启动一个生产者
> bin/kafka-console-producer.sh --broker-list 172.20.1.187:9092,172.20.1.187:9093,172.20.1.187:9094 --topic my-replicated-topic
...
my test message 1
my test message 2
^C
现在启动一个消费者:
> bin/kafka-console-consumer.sh --bootstrap-server 172.20.1.187:9092,172.20.1.187:9093,172.20.1.187:9094 --from-beginning --topic my-replicated-topic
...
my test message 1
my test message 2
^C
测试容错
我们来测试容错,现在是broker.id=1的节点是主节点,我们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
leader节点已经切换到另一个节点,并且broker.id=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 172.20.1.187:9092,172.20.1.187:9093,172.20.1.187:9094 --from-beginning --topic my-replicated-topic
...
my test message 1
my test message 2
^C