Broker 配置
定义与作用
本节提供 Broker 端关键配置参数的速查表。Broker 是 Kafka 集群的物理承载者,其配置直接影响可靠性、性能和运维复杂度。
配置速查表
核心标识
| 参数 | 默认值 | 说明 |
|---|---|---|
broker.id | -1(必须设置) | Broker 唯一标识(ZooKeeper 模式) |
node.id | (KRaft 必填) | 节点唯一标识(KRaft 模式) |
process.roles | — | broker,controller 或单独一个 |
网络
| 参数 | 默认值 | 说明 | 建议 |
|---|---|---|---|
listeners | PLAINTEXT://:9092 | 监听地址和协议 | 内网 PLAINTEXT,外网 SSL |
advertised.listeners | listeners 的值 | 对外广播地址 | 云环境必须设置(公网 IP/域名) |
num.network.threads | 3 | 网络线程数 | 高吞吐可设为核心数 |
num.io.threads | 8 | I/O 线程数 | 不少于磁盘数 × 2 |
存储
| 参数 | 默认值 | 说明 | 建议 |
|---|---|---|---|
log.dirs | /tmp/kafka-logs | 数据目录(可多目录逗号分隔) | 生产用独立 SSD,多目录并行 I/O |
log.segment.bytes | 1073741824 (1GB) | Segment 文件大小 | 保持在 512MB-1GB |
log.retention.hours | 168 (7天) | 消息保留时长 | 按业务和法律要求设置 |
log.retention.bytes | -1 (无限) | 按大小保留 | 防止磁盘写满 |
log.cleanup.policy | delete | 清理策略:delete/compact | 保留最新状态用 compact |
副本与可靠性
| 参数 | 默认值 | 说明 | 建议 |
|---|---|---|---|
default.replication.factor | 1 | 自动创建的 Topic 默认副本数 | 生产设 3 |
min.insync.replicas | 1 | 最小同步副本数 | 生产设 2(全局)或 Topic 级别 |
unclean.leader.election.enable | false | 是否允许非 ISR 副本成为 Leader | 生产必须 false |
num.replica.fetchers | 1 | Follower 拉取 Leader 的线程数 | 吞吐高时可增加 |
压缩
| 参数 | 默认值 | 说明 |
|---|---|---|
compression.type | producer | producer(保留源压缩)/uncompressed/lz4等 |
message.max.bytes | 1048588 (1MB) | 单条消息最大大小 |
Controller(KRaft)
| 参数 | 默认值 | 说明 |
|---|---|---|
controller.quorum.voters | — | Quorum 节点列表 |
controller.listener.names | — | Controller 通信的监听器名 |
完整示例
示例一:生产环境 Broker 配置
场景:3 节点 Kafka 集群,每节点 2 块 SSD,内网通信。
# Broker 标识
node.id=1
process.roles=broker,controller
# 网络
listeners=PLAINTEXT://:9092,CONTROLLER://:9093
advertised.listeners=PLAINTEXT://kafka1.internal:9092
controller.listener.names=CONTROLLER
controller.quorum.voters=1@kafka1.internal:9093,2@kafka2.internal:9093,3@kafka3.internal:9093
# 存储
log.dirs=/data/ssd1/kafka,/data/ssd2/kafka
log.segment.bytes=1073741824
log.retention.hours=168
log.retention.bytes=107374182400 # 100GB
# 副本与可靠性
default.replication.factor=3
min.insync.replicas=2
unclean.leader.election.enable=false
num.replica.fetchers=4
# I/O 线程
num.network.threads=8
num.io.threads=16
示例二:动态调整 Broker 配置(无需重启)
# 调整日志保留时间为 3 天(动态生效,无需重启)
bin/kafka-configs.sh --bootstrap-server localhost:9092 \
--entity-type brokers --entity-name 1 \
--alter --add-config log.retention.hours=72
# 查看动态配置
bin/kafka-configs.sh --bootstrap-server localhost:9092 \
--entity-type brokers --entity-name 1 --describe
# 删除动态配置(恢复默认)
bin/kafka-configs.sh --bootstrap-server localhost:9092 \
--entity-type brokers --entity-name 1 \
--alter --delete-config log.retention.hours
易错场景
易错 1:advertised.listeners 未设置在云环境
场景:Kafka 在 AWS EC2 上,listeners=PLAINTEXT://:9092 但未设 advertised.listeners。
后果:Broker 返回内部私有 IP 给客户端,客户端(可能在外网)无法连接。
正确做法:
listeners=PLAINTEXT://0.0.0.0:9092
advertised.listeners=PLAINTEXT://ec2-54-123-45-67.compute-1.amazonaws.com:9092
易错 2:log.dirs 使用网络存储(NFS)
场景:将 log.dirs 指向 NFS 挂载点以简化备份。
后果:Kafka 依赖顺序 I/O 和 Page Cache 的高性能,网络存储的延迟和带宽严重降低吞吐。
规则:log.dirs 必须是本地磁盘(优先 SSD)。
面试高频考点
Q:unclean.leader.election.enable 设为 true 会带来什么风险?
A:当 ISR 中所有副本都故障时,此参数允许选择不在 ISR 中的副本(可能有数据缺失)成为 Leader。代价是数据丢失——该副本的数据可能比 ISR 中的副本少。
场景:
ISR=[1,2,3] → Broker 1,2,3 同时故障(极小概率)
非 ISR 副本 Broker 4 存活但数据落后 500 条
unclean.leader.election.enable=true → Broker 4 成为 Leader → 500 条消息永久丢失
unclean.leader.election.enable=false → 分区不可用,等待至少一个 ISR 副本恢复
生产建议:数据准确性要求高的系统(交易、支付)必须设为 false,宁可不可用也不丢数据。日志收集等可容忍少量丢失的场景可设 true。