Kafka 的部署主要分为单机部署(开发测试用)和集群部署(生产环境用) ,且 Kafka 有两种运行模式:传统 Zookeeper 模式 (依赖 Zookeeper)和KRaft 模式(无 Zookeeper,Kafka 2.8.0 + 支持,3.3.0 + 正式稳定)。以下详细介绍部署步骤。
一、环境准备
1. 操作系统要求
推荐 Linux 系统(如 CentOS 7/8、Ubuntu 18.04+),Windows 仅建议开发测试用(生产不推荐)。
2. 依赖软件
- Java:Kafka 2.0 + 要求 Java 8(JDK 1.8),Kafka 3.0 + 支持 Java 11(推荐 JDK 8/11)。
- Zookeeper(仅 Zookeeper 模式需要):可使用 Kafka 内置的 Zookeeper,或独立部署 Zookeeper 集群(生产推荐独立集群)。
3. 系统配置(Linux)
-
关闭防火墙或开放端口(Zookeeper 默认 2181,Kafka 默认 9092,KRaft 模式控制器默认 9093):
bash# CentOS 7/8 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 或开放端口 firewall-cmd --add-port=2181/tcp --permanent firewall-cmd --add-port=9092/tcp --permanent firewall-cmd --reload -
关闭 SELinux:
bashsetenforce 0 # 临时关闭 sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config # 永久关闭 -
配置主机名与 hosts(集群部署必需,单机也建议配置):
bash# 设置主机名(例如kafka-node1) hostnamectl set-hostname kafka-node1 # 编辑hosts文件 vi /etc/hosts # 添加内容(集群需添加所有节点IP和主机名) 192.168.1.101 kafka-node1 192.168.1.102 kafka-node2 192.168.1.103 kafka-node3
二、JDK 安装(以 JDK 8 为例)
1. 下载 JDK
从 Oracle 官网或阿里云镜像下载 JDK 8 的 tar 包(如jdk-8u381-linux-x64.tar.gz),或用 yum 安装 OpenJDK:
bash
# 安装OpenJDK 8
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
# 验证Java版本
java -version
2. 配置 Java 环境变量(可选,若 yum 安装可能已配置)
bash
vi /etc/profile
# 添加以下内容
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export PATH=$PATH:$JAVA_HOME/bin
# 生效配置
source /etc/profile
三、单机部署(Zookeeper 模式)
1. 下载并解压 Kafka
bash
# 下载Kafka(以3.6.1为例,可从官网https://kafka.apache.org/downloads获取最新版本)
wget https://archive.apache.org/dist/kafka/3.6.1/kafka_2.13-3.6.1.tgz
# 解压
tar -zxvf kafka_2.13-3.6.1.tgz -C /usr/local/
# 重命名(可选)
mv /usr/local/kafka_2.13-3.6.1 /usr/local/kafka
2. 配置 Zookeeper(使用 Kafka 内置)
编辑 Kafka 的 Zookeeper 配置文件/usr/local/kafka/config/zookeeper.properties:
# 数据存储目录(需手动创建)
dataDir=/usr/local/kafka/data/zookeeper
# 客户端端口
clientPort=2181
# 心跳间隔(毫秒)
tickTime=2000
# 初始化连接超时次数
initLimit=10
# 同步超时次数
syncLimit=5
# 禁用Zookeeper自动清理(生产建议开启,配置autopurge.snapRetainCount和autopurge.purgeInterval)
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
创建 Zookeeper 数据目录:
bash
mkdir -p /usr/local/kafka/data/zookeeper
3. 配置 Kafka
编辑 Kafka 的服务配置文件/usr/local/kafka/config/server.properties:
properties
# Broker ID(集群中唯一,单机设为0)
broker.id=0
# 监听地址(PLAINTEXT协议,格式为[协议]://[地址]:[端口])
listeners=PLAINTEXT://0.0.0.0:9092
# 对外暴露的地址(集群部署需配置为节点IP或主机名,单机可与listeners相同)
advertised.listeners=PLAINTEXT://192.168.1.101:9092
# Zookeeper连接地址(单机为localhost:2181,集群为zookeeper节点列表)
zookeeper.connect=localhost:2181
# Kafka日志存储目录(需手动创建)
log.dirs=/usr/local/kafka/data/kafka-logs
# 默认分区数
num.partitions=1
# 副本因子(集群需大于1,单机设为1)
default.replication.factor=1
# 控制器超时时间
controller.socket.timeout.ms=30000
创建 Kafka 日志目录:
bash
mkdir -p /usr/local/kafka/data/kafka-logs
4. 启动服务
-
启动 Zookeeper(后台运行加
-daemon):bashcd /usr/local/kafka bin/zookeeper-server-start.sh -daemon config/zookeeper.properties -
启动 Kafka(后台运行加
-daemon):bashbin/kafka-server-start.sh -daemon config/server.properties
5. 验证部署
-
查看进程:
bashjps # 应看到QuorumPeerMain(Zookeeper)和Kafka(Kafka)进程 -
创建 Topic:
bashbin/kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1 -
查看 Topic 列表:
bashbin/kafka-topics.sh --list --bootstrap-server localhost:9092 -
发送消息(生产者):
bashbin/kafka-console-producer.sh --topic test-topic --bootstrap-server localhost:9092 # 输入消息后回车,如:Hello Kafka! -
消费消息(消费者,新开终端):
bashbin/kafka-console-consumer.sh --topic test-topic --bootstrap-server localhost:9092 --from-beginning # 应看到生产者发送的消息
四、单机部署(KRaft 模式,无 Zookeeper)
KRaft 模式下,Kafka 自身管理元数据,无需 Zookeeper,步骤如下:
1. 生成集群 ID
bash
cd /usr/local/kafka
bin/kafka-storage.sh random-uuid # 生成一个UUID,例如:abc12345-6789-0def-ghij-klmnopqrstuv
2. 格式化存储目录
bash
bin/kafka-storage.sh format -t abc12345-6789-0def-ghij-klmnopqrstuv -c config/kraft/server.properties
3. 配置 Kafka(KRaft 模式)
编辑/usr/local/kafka/config/kraft/server.properties:
# 节点ID(单机设为1,集群需唯一)
node.id=1
# 集群ID(即上述生成的UUID)
cluster.id=abc12345-6789-0def-ghij-klmnopqrstuv
# 角色(controller+broker,单机同时作为控制器和broker)
process.roles=controller,broker
# 控制器监听地址
controller.listener.names=CONTROLLER
# 监听器配置
listeners=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
# 监听器安全协议映射
listener.security.protocol.map=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT
# 对外暴露的地址
advertised.listeners=PLAINTEXT://192.168.1.101:9092
# 控制器投票者列表(单机为node.id@IP:9093)
controller.quorum.voters=1@192.168.1.101:9093
# 日志存储目录
log.dirs=/usr/local/kafka/data/kraft-logs
创建 KRaft 日志目录:
bash
mkdir -p /usr/local/kafka/data/kraft-logs
4. 启动 Kafka(KRaft 模式)
bash
bin/kafka-server-start.sh -daemon config/kraft/server.properties
5. 验证部署
与 Zookeeper 模式的验证步骤相同(创建 Topic、生产消费消息)。
五、集群部署(Zookeeper 模式,3 节点为例)
1. 部署 Zookeeper 集群(可选,也可使用 Kafka 内置 Zookeeper 集群)
生产环境推荐独立部署 Zookeeper 集群(3 节点),参考 Zookeeper 官方文档。若使用 Kafka 内置 Zookeeper,需在每个 Kafka 节点配置zookeeper.properties,并启动 Zookeeper 集群。
2. 同步 Kafka 安装包与配置
将 Kafka 安装包解压到所有集群节点的/usr/local/kafka目录,并确保 JDK、系统配置(hosts、防火墙等)一致。
3. 配置每个 Kafka 节点的server.properties
-
节点 1(kafka-node1,IP:192.168.1.101) :
properties
broker.id=0 listeners=PLAINTEXT://0.0.0.0:9092 advertised.listeners=PLAINTEXT://kafka-node1:9092 zookeeper.connect=kafka-node1:2181,kafka-node2:2181,kafka-node3:2181 log.dirs=/usr/local/kafka/data/kafka-logs num.partitions=3 default.replication.factor=3 min.insync.replicas=2 -
节点 2(kafka-node2,IP:192.168.1.102) :
properties
broker.id=1 listeners=PLAINTEXT://0.0.0.0:9092 advertised.listeners=PLAINTEXT://kafka-node2:9092 zookeeper.connect=kafka-node1:2181,kafka-node2:2181,kafka-node3:2181 log.dirs=/usr/local/kafka/data/kafka-logs num.partitions=3 default.replication.factor=3 min.insync.replicas=2 -
节点 3(kafka-node3,IP:192.168.1.103) :
properties
broker.id=2 listeners=PLAINTEXT://0.0.0.0:9092 advertised.listeners=PLAINTEXT://kafka-node3:9092 zookeeper.connect=kafka-node1:2181,kafka-node2:2181,kafka-node3:2181 log.dirs=/usr/local/kafka/data/kafka-logs num.partitions=3 default.replication.factor=3 min.insync.replicas=2注:
broker.id必须唯一,default.replication.factor建议为集群节点数(或小于节点数),min.insync.replicas建议为default.replication.factor-1。
4. 启动集群
-
先启动所有节点的 Zookeeper(若为独立集群,先启动 Zookeeper;若为 Kafka 内置,在每个节点执行):
bashcd /usr/local/kafka bin/zookeeper-server-start.sh -daemon config/zookeeper.properties -
再启动所有节点的 Kafka:
bashbin/kafka-server-start.sh -daemon config/server.properties
5. 验证集群
-
查看集群节点状态:
bashbin/kafka-broker-api-versions.sh --bootstrap-server kafka-node1:9092 -
创建 Topic(副本因子 3,分区 3):
bashbin/kafka-topics.sh --create --topic cluster-test --bootstrap-server kafka-node1:9092 --partitions 3 --replication-factor 3 -
查看 Topic 详情(验证副本分布):
bashbin/kafka-topics.sh --describe --topic cluster-test --bootstrap-server kafka-node1:9092
六、集群部署(KRaft 模式,3 节点为例)
1. 生成集群 ID(在任意节点执行)
bash
cd /usr/local/kafka
CLUSTER_ID=$(bin/kafka-storage.sh random-uuid)
echo $CLUSTER_ID # 记录集群ID,所有节点共用
2. 格式化每个节点的存储目录
在每个节点执行(替换$CLUSTER_ID为实际生成的 ID):
bash
bin/kafka-storage.sh format -t $CLUSTER_ID -c config/kraft/server.properties
3. 配置每个节点的kraft/server.properties
-
节点 1(kafka-node1) :
properties
node.id=1 cluster.id=$CLUSTER_ID # 替换为实际集群ID process.roles=controller,broker controller.listener.names=CONTROLLER listeners=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093 listener.security.protocol.map=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT advertised.listeners=PLAINTEXT://kafka-node1:9092 controller.quorum.voters=1@kafka-node1:9093,2@kafka-node2:9093,3@kafka-node3:9093 log.dirs=/usr/local/kafka/data/kraft-logs num.partitions=3 default.replication.factor=3 min.insync.replicas=2 -
节点 2(kafka-node2) :
properties
node.id=2 cluster.id=$CLUSTER_ID process.roles=controller,broker controller.listener.names=CONTROLLER listeners=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093 listener.security.protocol.map=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT advertised.listeners=PLAINTEXT://kafka-node2:9092 controller.quorum.voters=1@kafka-node1:9093,2@kafka-node2:9093,3@kafka-node3:9093 log.dirs=/usr/local/kafka/data/kraft-logs num.partitions=3 default.replication.factor=3 min.insync.replicas=2 -
节点 3(kafka-node3) :
properties
node.id=3 cluster.id=$CLUSTER_ID process.roles=controller,broker controller.listener.names=CONTROLLER listeners=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093 listener.security.protocol.map=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT advertised.listeners=PLAINTEXT://kafka-node3:9092 controller.quorum.voters=1@kafka-node1:9093,2@kafka-node2:9093,3@kafka-node3:9093 log.dirs=/usr/local/kafka/data/kraft-logs num.partitions=3 default.replication.factor=3 min.insync.replicas=2注:
node.id必须唯一,controller.quorum.voters包含所有控制器节点(node.id@主机名:控制器端口)。
4. 启动 KRaft 集群
在每个节点执行:
bash
bin/kafka-server-start.sh -daemon config/kraft/server.properties
5. 验证集群
与 Zookeeper 模式的集群验证步骤相同。
七、常见问题与注意事项
- 端口占用 :Zookeeper 默认 2181,Kafka 默认 9092,KRaft 控制器默认 9093,需确保端口未被占用(用
netstat -tulpn | grep 端口号检查)。 - 日志目录权限 :Kafka 和 Zookeeper 的日志 / 数据目录需有读写权限(建议用
chown -R kafka:kafka /usr/local/kafka创建 kafka 用户并授权,生产环境建议使用普通用户运行 Kafka,而非 root)。 - JDK 版本兼容:Kafka 3.0 + 支持 Java 11,但部分旧版本仅支持 Java 8,需根据 Kafka 版本选择 JDK。
- 集群节点时间同步:集群所有节点需配置 NTP 时间同步,避免时间偏差导致元数据同步异常。
- 生产环境优化 :
- 调整 Kafka 的 JVM 参数(
bin/kafka-server-start.sh中的KAFKA_HEAP_OPTS,建议设置为-Xms4G -Xmx4G,根据服务器内存调整)。 - 调整 Linux 内核参数(如
vm.swappiness设为 1,file-max设为较大值,ulimit调整文件描述符数为 65535+)。 - 开启 Kafka 的日志压缩(
log.cleanup.policy=compact),根据业务需求调整分区数和副本因子。
- 调整 Kafka 的 JVM 参数(
八、停止服务
-
停止 Kafka:
bashcd /usr/local/kafka bin/kafka-server-stop.sh -
停止 Zookeeper(仅 Zookeeper 模式):
bashbin/zookeeper-server-stop.sh
以上为 Kafka 部署的核心步骤,生产环境需根据实际服务器配置和业务需求调整参数。