目录
1.1、概述
Kafka是一个能够支持高并发以及流式消息处理的消息中间件,并且Kafka天生就是支持集群的,今天就主要来介绍一下如何搭建Kafka集群。对于Kafka的集群来说,有两种情况:单节点多Broker部署、集群部署(多节点多Broker)。单节点多Broker部署的集群本质上还是集群,只不过是部署在了一台主机,其他功能完全一样。更多关于单节点多Broker部署、集群部署(多节点多Broker)的描述请参考Kafka单机版安装部署文章中的概述部分,这里不在赘述。
1.2、Kafka集群中的节点类型
首先需要了解一下,一个Kafka集群是由下列几种类型的节点构成的,它们充当着不同的作用:
- Broker节点
即代理节点,是Kafka中的工作节点,充当消息队列的角色,负责储存和处理消息,每个Broker都是一个独立的Kafka服务器,可以在不同的机器上运行,除此之外Broker还负责分区(partition)的管理,将主题(topic)划分为多个分区,并分布在集群的不同Broker上。 - Controller节点
即控制器节点,是集群中的特殊节点,负责储存和管理整个集群元数据和状态,它能够监控整个集群中的Broker,在需要时还能够进行平衡操作。 - 混合节点
即同时担任Broker和Controller节点角色的节点。
1.3、系统环境
Kafka强依赖ZooKeeper,如果想要使用Kafka,就必须安装ZooKeeper,ZooKeeper的安装教程请参考Zookeeper单机版安装部署这篇博文。Kafka中的消费偏置信息、kafka集群、topic信息会被存储在ZooKeeper中。有人可能会说我在使用Kafka的时候就没有安装ZooKeeper,那是因为Kafka内置了一个ZooKeeper,一般我们不使用它。具体系统环境如下:
环境名称 | 版本号 |
---|---|
操作系统 | CentOS Linux release 8.4.2105 |
JDK | 17.0.7 |
ZooKeeper | 3.8.4 |
Kafka | 3.7.2 |
1.4、集群规划
本次安装部署将采用3台服务器搭建一个kafka生产集群,服务器列表如下:
服务器ip | 应用 |
---|---|
172.16.20.5 | ZooKeeper、Kafka v_2.7.2 |
172.16.20.6 | ZooKeeper、Kafka v_2.7.2 |
172.16.20.7 | ZooKeeper、Kafka v_2.7.2 |
高版本的Kafka已经抛弃了ZooKeeper。
1.5、部署架构
在Zookeeper模式集群中,Zookeeper节点(或者集群)就充当了Controller的角色,而所有的Kafka节点就充当着Broker的角色。具体架构图如下:
1.6、部署流程
本文将在三台操作系统为CentOS Linux release 8.4.2105、Java环境为JDK17.0.7、ZooKeeper3.8.4版本的生产集群的服务器上部署Kafka2.7.2版本的生产集群,具体流程如下:
1.6.1、部署ZooKeeper集群
部署Kafka集群之前,需要部署一个ZooKeeper集群,因为ZooKeeper节点(或者集群)就充当了Controller的角色,负责储存和管理整个集群元数据和状态,它能够监控整个集群中的Broker,在需要时还能够进行平衡操作。ZooKeeper集群请参考Zookeeper集群版安装部署这篇博文,这里不在赘述。
1.6.2、每台服务器上部署Kafka
这一部分请参考Kafka单机版安装部署这篇博文,这里不在赘述。
1.6.3、修改Kafka配置文件
进入每台服务器的kafka_2.12-2.7.2/config目录,使用文本编辑器(如 vi、nano 或 emacs)打开server.properties文件并进行如下配置:# 唯一标识 broker.id,# 数据存储路径 log.dirs, # 监听地址 listeners, # ZooKeeper 地址 zookeeper.connect等配置项。172.16.20.5服务器的配置文件如下:
172.16.20.6服务器的配置文件如下:
172.16.20.7服务器的配置文件如下:
1.6.4、启动Kafka集群服务
启动Kafka集群服务时先要启动ZooKeeper集群服务,再启动Kafka集群服务;关闭服务时先要关闭Kafka集群服务,在关闭ZooKeeper集群服务。启动Kafka集群服务时,需要在每台服务器上进入 kafka_2.12-2.7.2/bin 目录,执行 ./kafka-server-start.sh ../config/server.properties 命令启动 单个Kafka服务,启动成功后的效果如下:
1.7、Kafka集群可用性验证
1.7.1、ZooKeeper集群数据写入测试
客户端连接zookeeper集群,查看kafka的元数据是否已经写入,首先进入ZooKeeper集群中的任意一台服务器的安装目录:./apache-zookeeper-3.8.4-bin/bin,在执行命令./zkCli.sh -server 172.16.20.6:2182连接到服务节点,最后执行命令 ls / 查看节点信息,正常可用性的效果如下:
1.7.2、创建Topic测试
创建Topic时,先进入Kafka集群中任意一台服务器的 kafka_2.12-2.7.2/bin 目录,执行 ./kafka-topics.sh --create --topic test-topic-1 --bootstrap-server 172.16.20.5:9094 --partitions 3 --replication-factor 3 命令创建一个名为test-topic的主题,创建成功后的效果如下:
然后在进入Kafka集群中另外一台服务器的 kafka_2.12-2.7.2/bin 目录,执行 ./kafka-topics.sh --list --bootstrap-server 172.16.20.6:9094命令上述创建的名为test-topic-1的主题,成功的效果如下:
可见我们在第一个节点上创建了主题,但是在第二个节点上仍然可以获取这个主题,说明集群创建成功,数据在集群之间可以共享。
1.7.3、生产消息测试
启动生产者时,先进入 kafka_2.12-2.7.2/bin 目录,执行 ./kafka-console-producer.sh --broker-list 172.16.20.5:9094,172.16.20.6:9094,172.16.20.7:9094 --topic test-topic-1命令后就可以向名为test-topic-1的主题中生产消息,效果如下:
1.7.4、消费消息测试
启动消费者时,先进入kafka_2.12-2.7.2/bin 目录,执行 ./kafka-console-consumer.sh --topic test-topic-1 --from-beginning --bootstrap-server 172.16.20.7:9094命令后就可以消费名为test-topic-1的主题中的消息,效果如下: