kafka集群安装

1 篇文章 0 订阅

原文地址,转载请注明出处: 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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值