概述
对于kafka来说,一个单独的broker意味着kafka集群中只有一个节点。要想增加kafka集群中的节点数量,只需要多启动几个broker实例即可。
单个节点的安装: Kafka-初体验Kafka(02)-Centos7下搭建单节点kafka_2.11‐1.1.0
这里我们来搭建个3个节点的kafka集群来体验下吧
部署信息
192.168.18.130 —> kafka 、 zookeeper(单节点的zk) 192.168.18.131 —> kafka 192.168.18.132 —> kafka
单节点的 zk , 部署上 130上,事实上生产环境的话,zk也是要搭建集群的,这里演示用的话,用单个节点的zk先。
3个节点的kafka注册到 单节点的zk上。
配置信息
kafka的配置文件主要是配置文件 server.properties
130
代码语言:javascript复制[root@artisan config]# grep -Ev '^$|^[#;]' server.properties
broker.id=0
listeners=PLAINTEXT://192.168.18.130:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/tmp/kafka-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=192.168.18.130:2181
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0
[root@artisan config]#
131
代码语言:javascript复制[root@artisan config]# grep -Ev '^$|^[#;]' server.properties
broker.id=1
listeners=PLAINTEXT://192.168.18.131:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/tmp/kafka-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=192.168.18.130:2181
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.de
132
代码语言:javascript复制[root@artisan config]# grep -Ev '^$|^[#;]' server.properties
broker.id=2
listeners=PLAINTEXT://192.168.18.132:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/tmp/kafka-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=192.168.18.130:2181
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0
[root@artisan config]#
还有一篇博主写的 zk也是高可用的,可以参考下,写的很不错 ZooKeeper Kafka 高可用集群搭建
验证
启动zookeeper 和 3个 kafka 后,我们创建一个新的topic,副本数设置为3,分区数设置为2
代码语言:javascript复制[root@artisan bin]# ./kafka-topics.sh --create --zookeeper 192.168.18.130:2181 --replication-factor 3 --partitions 2 --topic artisan-replicated-topic
Created topic "artisan-replicated-topic".
[root@artisan bin]#
查看topic的情况
代码语言:javascript复制[root@artisan bin]# ./kafka-topics.sh --describe --zookeeper 192.168.18.130:2181 --topic artisan-replicated-topic
Topic:artisan-replicated-topic PartitionCount:2 ReplicationFactor:3 Configs:
Topic: artisan-replicated-topic Partition: 0 Leader: 1 Replicas: 1,2,0 Isr: 1,2,0
Topic: artisan-replicated-topic Partition: 1 Leader: 2 Replicas: 2,0,1 Isr: 2,0,1
[root@artisan bin]#
我们来解释下上面的输出内容
第一行是所有分区的概要信息,之后的每一行表示每一个partition的信息。
所有分区的概要信息:
代码语言:javascript复制Topic:artisan-replicated-topic PartitionCount:2 ReplicationFactor:3 Configs
每一个partition的信息:
代码语言:javascript复制Topic: artisan-replicated-topic Partition: 0 Leader: 1 Replicas: 1,2,0 Isr: 1,2,0
Topic: artisan-replicated-topic Partition: 1 Leader: 2 Replicas: 2,0,1 Isr: 2,0,1
- leader节点负责给定partition的所有读写请求。
- replicas 表示某个partition在哪几个broker上存在备份。不管这个几点是不是”leader“,甚至这个节点挂了,也会列出
- isr 是replicas的一个子集,它只列出当前还存活着的,并且已同步备份了该partition的节点。
我们可以运行相同的命令查看之前创建的名称为”artisan“的topic
代码语言:javascript复制[root@artisan bin]# ./kafka-topics.sh --describe --zookeeper 192.168.18.130:2181 --topic artisan
Topic:artisan PartitionCount:1 ReplicationFactor:1 Configs:
Topic: artisan Partition: 0 Leader: 0 Replicas: 0 Isr: 0
[root@artisan bin]#
之前设置了topic的partition数量为1,备份因子为1,因此显示就如上所示了。当然我们也可以通过如下命令增加topic的分区数量(目前kafka不支持减少分区):
代码语言:javascript复制[root@artisan bin]# ./kafka-topics.sh --alter --partitions 3 --zookeeper 192.168.18.130:2181 --topic artisan
WARNING: If partitions are increased for a topic that has a key, the partition logic or ordering of the messages will be affected
Adding partitions succeeded!
重新查看
代码语言:javascript复制[root@artisan bin]# ./kafka-topics.sh --describe --zookeeper 192.168.18.130:2181 --topic artisan
Topic:artisan PartitionCount:3 ReplicationFactor:1 Configs:
Topic: artisan Partition: 0 Leader: 0 Replicas: 0 Isr: 0
Topic: artisan Partition: 1 Leader: 1 Replicas: 1 Isr: 1
Topic: artisan Partition: 2 Leader: 2 Replicas: 2 Isr: 2
[root@artisan bin]#
现在我们向新建的 artisan-replicated-topic 中发送一些message,kafka集群可以加上所有kafka节点:
代码语言:javascript复制[root@artisan bin]# ./kafka-console-producer.sh --broker-list 192.168.18.130:9092,192.168.18.131:9092,192.168.18.132:9092 --topic artisan-replicated-topic
>artisan message test 1
>artisan message test 2
>artisan message test 3
>
现在131broker 开始消费:
代码语言:javascript复制[root@artisan bin]# ./kafka-console-consumer.sh --bootstrap-server 192.168.18.131:9092 --from-beginning --topic artisan-replicated-topic
artisan message test 1
artisan message test 3
artisan message test 2
现在我们来测试我们 容错性 ,因为broker1目前是artisan-replicated-topic的分区0的 leader,所以我们要将其kill , kill 掉 131 节点的 kafka
再执行
代码语言:javascript复制[root@artisan bin]# ./kafka-topics.sh --describe --zookeeper 192.168.18.130:2181 --topic artisan-replicated-topic
Topic:artisan-replicated-topic PartitionCount:2 ReplicationFactor:3 Configs:
Topic: artisan-replicated-topic Partition: 0 Leader: 2 Replicas: 1,2,0 Isr: 0,2
Topic: artisan-replicated-topic Partition: 1 Leader: 2 Replicas: 2,0,1 Isr: 2,0
[root@artisan bin]#
我们可以看到,分区0的leader节点已经变成了broker 2。要注意的是,在Isr中,已经没有了1号节点。leader的选举也是从ISR(in-sync replica)中进行的。
131 重新起来以后,还是可以消费消息
代码语言:javascript复制[root@artisan bin]# ./kafka-server-start.sh -daemon ../config/server.properties
[root@artisan bin]# jps
24436 Kafka
24455 Jps
[root@artisan bin]# ./kafka-console-consumer.sh --bootstrap-server 192.168.18.131:9092 --from-beginning --topic artisan-replicated-topic
artisan message test 1
artisan message test 3
artisan message test 2
再看下
代码语言:javascript复制[root@artisan bin]# ./kafka-topics.sh --describe --zookeeper 192.168.18.130:2181 --topic artisan-replicated-topic
Topic:artisan-replicated-topic PartitionCount:2 ReplicationFactor:3 Configs:
Topic: artisan-replicated-topic Partition: 0 Leader: 1 Replicas: 1,2,0 Isr: 0,2,1
Topic: artisan-replicated-topic Partition: 1 Leader: 2 Replicas: 2,0,1 Isr: 2,0,1
[root@artisan bin]#
[root@artisan bin]#