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/:日志目录,排错全靠它
/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
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
dataDir下要建一个myid文件,内容就是当前节点的ID(比如1、2、3)。这个文件不能少,少了ZooKeeper起不来。
3.5 知识体系总览
下面这张图,是我梳理的Kafka安装部署知识体系。你对照着看,心里就有谱了。
嗯,这张图把三种模式的关系和配置要点都串起来了。你对照着看,应该能快速理解整个部署体系。
最后说一句:安装部署只是第一步,真正考验人的是后续的调优和运维。但基础打牢了,后面的事就好办多了。
公众号:蓝海资料掘金营,微信deep3321