kafka一主两从环境怎样搭建
搭建一个“一主两从”的 Kafka 集群,核心是部署 3个 Broker 节点。这能让你的系统获得高可用性,确保即使有一台机器宕机,服务也能持续运行。
目前搭建 Kafka 集群主要有两种方式,我建议你优先考虑更现代的 KRaft 模式。
模式选择:KRaft vs. ZooKeeper
-
KRaft 模式(Kafka 3.3.1+ 推荐):这是 Kafka 自 3.3.1 版本后内置的、生产可用的新集群管理方式。它最大的优势是去掉了对 ZooKeeper 的依赖,将元数据管理集成在 Kafka 内部,让架构更简单,也降低了运维的复杂度。
-
ZooKeeper 模式(传统方式):这是旧版 Kafka 的经典方案,需要额外搭建一个 3 节点的 ZooKeeper 集群来管理元数据。如果你的环境必须使用 Kafka 2.x 版本,可以选择此方案。
准备工作(两种模式通用)
在开始前,请确保完成以下步骤:
-
准备三台服务器:规划好三台机器的 IP 和主机名(例如
kafka-1,kafka-2,kafka-3),并确保它们之间网络互通。 -
安装 Java:在所有节点上安装 Java 8 或更高版本。
-
下载 Kafka:从官网下载 Kafka 的二进制包(例如
kafka_2.13-3.4.0.tgz)并解压到/opt/kafka目录。 -
配置主机名和防火墙:配置好各节点的主机名解析(/etc/hosts),并开放 Kafka 默认端口
9092(以及 KRaft 模式下的9093端口)。
方案一:使用 KRaft 模式部署(推荐)
1. 生成集群唯一 ID
在任意一台节点上执行以下命令,生成一个集群 ID,并记下来:
/opt/kafka/bin/kafka-storage.sh random-uuid
# 示例输出:2nZvZ4y5Q1qP4pQ2nZvZ4A
2. 配置 server.properties
编辑每台节点的配置文件 /opt/kafka/config/kraft/server.properties。
所有节点共用的配置:
# 角色设定为 broker 和 controller(合设模式)
process.roles=broker,controller [reference:17]
# 所有节点的投票者列表,格式: node.id@hostname:port
controller.quorum.voters=1@kafka-1:9093,2@kafka-2:9093,3@kafka-3:9093 [reference:18][reference:19]
# 监听端口
listeners=PLAINTEXT://:9092,CONTROLLER://:9093 [reference:20]
# 日志数据目录
log.dirs=/var/lib/kafka/data [reference:21]
# 默认主题分区数和副本数,建议都设为3
num.partitions=3 [reference:22]
default.replication.factor=3 [reference:23]
# 最少同步副本数,保证数据不丢
min.insync.replicas=2 [reference:24][reference:25]
各节点独有的配置(请根据节点修改):
# kafka-1 节点
node.id=1 [reference:26]
advertised.listeners=PLAINTEXT://<kafka-1的IP>:9092 [reference:27][reference:28]
# kafka-2 节点
node.id=2
advertised.listeners=PLAINTEXT://<kafka-2的IP>:9092
# kafka-3 节点
node.id=3
advertised.listeners=PLAINTEXT://<kafka-3的IP>:9092
3. 格式化存储目录
在每一台节点上,使用第一步生成的集群 ID 来格式化日志目录:
/opt/kafka/bin/kafka-storage.sh format -t <你的集群ID> -c /opt/kafka/config/kraft/server.properties
4. 启动 Kafka 服务
在每一台节点上,后台启动 Kafka:
/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/kraft/server.properties
方案二:使用 ZooKeeper 模式部署(传统)
1. 搭建 ZooKeeper 集群
首先,你需要在这三台机器上搭建一个 3 节点的 ZooKeeper 集群。
-
配置
zoo.cfg,指定数据目录和集群节点信息。 -
在每个节点的数据目录下创建
myid文件,内容分别为1,2,3。 -
启动所有节点的 ZooKeeper 服务。
2. 配置 server.properties
编辑每台节点的配置文件 /opt/kafka/config/server.properties。
各节点独有的配置:
# kafka-1 节点
broker.id=1 [reference:38][reference:39]
listeners=PLAINTEXT://:9092 [reference:40]
advertised.listeners=PLAINTEXT://<kafka-1的IP>:9092
# kafka-2 节点
broker.id=2
advertised.listeners=PLAINTEXT://<kafka-2的IP>:9092
# kafka-3 节点
broker.id=3
advertised.listeners=PLAINTEXT://<kafka-3的IP>:9092
所有节点共用的配置:
# 数据存储目录
log.dirs=/var/lib/kafka/data [reference:41]
# 指向你的 ZooKeeper 集群地址
zookeeper.connect=kafka-1:2181,kafka-2:2181,kafka-3:2181 [reference:42][reference:43]
3. 分发配置并启动
将配置好的 Kafka 目录复制到另外两台机器,然后在每一台节点上启动 Kafka 服务:
/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties
验证集群
集群启动后,可以通过以下命令验证其状态:
-
查看主题列表(KRaft 和 ZK 模式命令略有不同):
-
KRaft 模式:
/opt/kafka/bin/kafka-topics.sh --list --bootstrap-server kafka-1:9092 -
ZooKeeper 模式:
/opt/kafka/bin/kafka-topics.sh --list --zookeeper kafka-1:2181
-
-
创建测试主题(验证集群功能):
bash/opt/kafka/bin/kafka-topics.sh --create --topic test-topic --bootstrap-server kafka-1:9092 --partitions 3 --replication-factor 3注意:
--replication-factor 3表示每个分区有3个副本,即“一主两从”。 -
查看主题详情:
bash/opt/kafka/bin/kafka-topics.sh --describe --topic test-topic --bootstrap-server kafka-1:9092在输出中,你会看到每个分区的
Leader和Replicas信息,从而确认集群已正确配置。
浙公网安备 33010602011771号