3. Kafka安装与部署:从单机到集群的实战指南

说实话,Kafka的安装部署这件事,看起来简单,但坑不少。我见过太多人在这一步栽跟头——配置文件写错一个参数,集群半天起不来;或者选错了模式,后面扩容时欲哭无泪。今天咱们就把这事彻底讲透。

3.1 单机模式安装:快速上手

单机模式,说白了就是在一台机器上跑Kafka。适合开发测试,千万别用在生产环境。我刚开始学Kafka时,就是先搭个单机版练手。

前置条件:你需要先装好JDK 8或11。我个人习惯用JDK 11,稳定且性能不错。

# 下载Kafka(以3.5.0版本为例)
wget https://downloads.apache.org/kafka/3.5.0/kafka_2.13-3.5.0.tgz

# 解压
tar -xzf kafka_2.13-3.5.0.tgz
cd kafka_2.13-3.5.0

解压后,目录结构是这样的:

  • bin/:启动脚本,Kafka和ZooKeeper的命令都在这里
  • config/:配置文件,核心中的核心
  • libs/:依赖的JAR包
  • logs/:日志目录,排错全靠它
小技巧:我习惯把Kafka装在/opt/kafka下,然后建个软链接,方便版本切换。

启动ZooKeeper(单机模式必须):

# 启动ZooKeeper
bin/zookeeper-server-start.sh config/zookeeper.properties

再启动Kafka:

# 启动Kafka Broker
bin/kafka-server-start.sh config/server.properties

验证是否成功:

# 创建一个测试主题
bin/kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1

# 查看主题列表
bin/kafka-topics.sh --list --bootstrap-server localhost:9092

看到test-topic出现在列表里,说明单机模式跑起来了。

3.2 集群模式部署:这才是生产环境该有的样子

单机模式说白了就是玩具。生产环境必须上集群。为什么?你想想看,一台机器挂了,整个消息系统就瘫痪了,这在金融系统里是绝对不能接受的。

集群部署的核心思路:多台机器,数据冗余,高可用。我曾在项目中部署过一个3节点的Kafka集群,扛住了日均10亿条消息的流量。

集群规划示例(3节点):

节点 IP地址 Broker ID 角色
Node1 192.168.1.101 1 Broker + ZooKeeper
Node2 192.168.1.102 2 Broker + ZooKeeper
Node3 192.168.1.103 3 Broker + ZooKeeper

每个节点的server.properties配置如下(以Node1为例):

# 每个节点必须唯一
broker.id=1

# 监听地址,建议用内网IP
listeners=PLAINTEXT://192.168.1.101:9092
advertised.listeners=PLAINTEXT://192.168.1.101:9092

# 日志存储路径
log.dirs=/data/kafka/logs

# ZooKeeper连接串(所有节点)
zookeeper.connect=192.168.1.101:2181,192.168.1.102:2181,192.168.1.103:2181

# 副本因子,建议设为2或3
default.replication.factor=3
min.insync.replicas=2
注意:broker.id绝对不能重复!我曾经有一次手抖,两个节点配了相同的ID,结果集群一直报错,排查了半天才发现。

启动顺序:先启动所有ZooKeeper,再逐个启动Kafka Broker。

# 在每个节点上执行
bin/zookeeper-server-start.sh config/zookeeper.properties
bin/kafka-server-start.sh config/server.properties

验证集群状态:

# 查看所有Broker
bin/kafka-broker-api-versions.sh --bootstrap-server 192.168.1.101:9092

# 创建一个带副本的主题
bin/kafka-topics.sh --create --topic cluster-test --bootstrap-server 192.168.1.101:9092 --partitions 3 --replication-factor 3

# 查看主题详情
bin/kafka-topics.sh --describe --topic cluster-test --bootstrap-server 192.168.1.101:9092

如果看到每个分区都有3个副本,且分布在不同的Broker上,恭喜你,集群部署成功了。

3.3 ZooKeeper vs KRaft:模式选择之争

这个问题,说白了就是「要不要去掉ZooKeeper这个中间人」。Kafka早期版本必须依赖ZooKeeper来管理集群元数据、选举Controller。但从2.8版本开始,Kafka引入了KRaft模式,可以自己管理元数据了。

两种模式的对比:

特性 ZooKeeper模式 KRaft模式
依赖组件 需要额外部署ZooKeeper集群 无需ZooKeeper,Kafka自管理
部署复杂度 较高,需要维护两套集群 较低,一套集群搞定
成熟度 非常成熟,生产验证多年 较新,3.3版本后达到生产就绪
性能 元数据操作有额外网络开销 元数据操作更快,延迟更低
运维成本 高,ZooKeeper本身也需要维护 低,减少一个运维对象

我的建议:

  • 如果你用的是Kafka 3.3及以上版本,且是新项目,直接上KRaft模式。少维护一个ZooKeeper集群,省心不少。
  • 如果是老项目升级,或者对稳定性要求极高(比如金融核心交易系统),先用ZooKeeper模式,等KRaft再迭代几个版本再迁移。

KRaft模式的配置示例:

# 在config/kraft/server.properties中
process.roles=broker,controller
node.id=1
controller.quorum.voters=1@192.168.1.101:9093,2@192.168.1.102:9093,3@192.168.1.103:9093
listeners=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
advertised.listeners=PLAINTEXT://192.168.1.101:9092
核心区别:KRaft模式下,每个节点可以同时扮演Broker和Controller角色,不再需要单独的ZooKeeper集群。说白了就是「去中心化」了。

3.4 配置文件详解:每个参数都是坑

配置文件是Kafka的灵魂。我见过太多人因为配错一个参数,导致集群性能惨不忍睹。下面我把核心参数逐个讲透。

server.properties 核心参数:

参数 默认值 说明 我的建议
broker.id 0 Broker唯一标识 从0开始递增,不要重复
listeners PLAINTEXT://:9092 监听地址和端口 生产环境用内网IP,别用0.0.0.0
log.dirs /tmp/kafka-logs 消息日志存储路径 别用/tmp,用独立数据盘
num.partitions 1 默认分区数 建议设为3或6,方便扩展
default.replication.factor 1 默认副本因子 生产环境至少2,推荐3
min.insync.replicas 1 最小同步副本数 设为2,保证数据不丢
log.retention.hours 168 日志保留时间(小时) 金融系统建议72小时以上
log.segment.bytes 1073741824 单个日志段文件大小 1GB够用,不用改
避坑指南:我曾经在生产环境遇到过一个问题——log.dirs配到了系统盘,结果消息量一大,磁盘直接写满,整个集群挂了。记住:日志目录一定要用独立的数据盘,最好是SSD

zookeeper.properties 核心参数:

参数 默认值 说明
dataDir /tmp/zookeeper ZooKeeper数据存储路径
clientPort 2181 客户端连接端口
maxClientCnxns 60 最大客户端连接数
tickTime 2000 心跳间隔(毫秒)
initLimit 10 Leader初始化等待时间(tick数)
syncLimit 5 Leader与Follower同步超时(tick数)

生产环境推荐配置(3节点ZooKeeper集群):

# 每个节点都要配
dataDir=/data/zookeeper/data
clientPort=2181
maxClientCnxns=100
tickTime=2000
initLimit=10
syncLimit=5

# 集群节点列表
server.1=192.168.1.101:2888:3888
server.2=192.168.1.102:2888:3888
server.3=192.168.1.103:2888:3888
小技巧:ZooKeeper的dataDir下要建一个myid文件,内容就是当前节点的ID(比如1、2、3)。这个文件不能少,少了ZooKeeper起不来。

3.5 知识体系总览

下面这张图,是我梳理的Kafka安装部署知识体系。你对照着看,心里就有谱了。

Kafka安装与部署知识体系 Kafka部署模式 单机模式 适用场景:开发测试 特点:单台机器,无冗余 依赖:ZooKeeper必须启动 集群模式 适用场景:生产环境 特点:多节点,高可用 核心:副本因子≥2,分区分布 KRaft模式 适用场景:新项目(3.3+) 特点:去ZooKeeper,自管理 优势:部署简单,性能更好 配置文件详解 server.properties broker.id, listeners, log.dirs zookeeper.properties dataDir, tickTime, server.X kraft/server.properties process.roles, node.id 选择哪种模式,取决于你的版本、团队经验和业务要求

嗯,这张图把三种模式的关系和配置要点都串起来了。你对照着看,应该能快速理解整个部署体系。

最后说一句:安装部署只是第一步,真正考验人的是后续的调优和运维。但基础打牢了,后面的事就好办多了。


公众号:蓝海资料掘金营,微信deep3321