Kafka 3.9.x 安装、鉴权、配置详解

Kafka

一、下载安装

下载最新3.9.1版本,目前这个版本是没有漏洞的版本,尽量不要用之前的版本。

下载链接: https://kafka.apache.org/downloads

1.1、目录结构

解压 Kafka 安装包后,根目录包含以下关键子目录和文件:

shell 复制代码
kafka_2.13-3.6.1/
├── bin/                # 可执行脚本(核心工具)
├── config/             # 配置文件(Broker、消费者、生产者等)
├── libs/               # 依赖库(Kafka 核心 jar 包)
├── logs/               # 默认日志目录(Broker 运行日志)
├── site-docs/          # 官方文档(HTML 格式)
├── LICENSE             # 许可证文件
├── NOTICE              # 版权声明
└── README.md           # 快速启动说明

1.2、核心目录详解

1.2.1、bin/:执行脚本目录

存放 Kafka 所有核心工具的脚本(包含 Linux 下的 .sh 和 Windows 下的 .bat),按功能分为以下几类:

脚本类型 关键脚本 功能说明
Broker 管理 kafka-server-start.sh 启动 Kafka Broker(需指定配置文件,如 config/server.properties
kafka-server-stop.sh 停止 Kafka Broker
Topic 管理 kafka-topics.sh 创建、删除、查看 Topic(如 --create --topic test --partitions 3
消费组管理 kafka-consumer-groups.sh 查看消费组偏移量、重置 Offset(如 --describe --group my-group
生产者工具 kafka-console-producer.sh 命令行生产者(测试用,发送消息到指定 Topic)
消费者工具 kafka-console-consumer.sh 命令行消费者(测试用,从指定 Topic 消费消息)
集群管理 kafka-broker-api-versions.sh 查看 Broker 支持的 API 版本
kafka-metadata-shell.sh 查看集群元数据(如 Broker 列表、Topic 分区信息)
KRaft 模式 kafka-storage.sh KRaft 模式下初始化存储(替代 ZooKeeper 时使用)
kafka-server-start.sh 启动 KRaft 控制器(需指定 controller.properties

示例:启动 Broker

bash 复制代码
bin/kafka-server-start.sh config/server.properties

1.2.2、config/:配置文件目录

存放 Kafka 所有核心配置文件,按组件分为:

配置文件 关联组件 核心作用
server.properties Kafka Broker Broker 核心配置(端口、存储路径、副本策略等,必配)
consumer.properties 消费者 命令行消费者默认配置(消费组 ID、集群地址等)
producer.properties 生产者 命令行生产者默认配置(ACK 策略、压缩方式等)
zookeeper.properties 内置 ZooKeeper Kafka 自带的 ZooKeeper 配置(单节点测试用,生产环境需独立 ZooKeeper 集群)
controller.properties KRaft 控制器 KRaft 模式下的控制器配置(替代 ZooKeeper 时使用)
connect-*.properties 连接器(Connect) 用于数据导入导出(如 connect-standalone.properties 单机模式配置)

注意 :生产环境需根据集群规模修改 server.properties,并为每个 Broker 分配独立配置文件(如 server-0.propertiesserver-1.properties)。

1.2.3、libs/:依赖库目录

存放 Kafka 运行所需的所有 jar 包,包括:

  • 核心依赖:kafka_2.13-3.6.1.jar(Kafka 核心逻辑)、kafka-clients-3.6.1.jar(客户端 API);
  • 第三方依赖:ZooKeeper 客户端、JSON 解析、压缩算法(Snappy、LZ4)等;
  • 日志依赖:log4j 相关 jar 包(控制日志输出)。

说明:无需手动修改,Kafka 启动时会自动加载这些依赖。

1.2.4、logs/:运行日志目录

默认存储 Kafka Broker 和内置 ZooKeeper 的运行日志,包含:

  • server.log:Broker 主日志(记录启动、错误、警告等信息,排查问题的核心依据);
  • controller.log:KRaft 模式下控制器的日志;
  • zookeeper.out:内置 ZooKeeper 的输出日志(仅单节点测试用)。

建议 :生产环境通过 log4j.properties(在 config/ 目录)修改日志路径和滚动策略,避免日志占满磁盘。

1.2.5、site-docs/:文档目录

包含 Kafka 官方 HTML 文档,涵盖:

  • 快速入门指南;
  • 配置参数说明;
  • 客户端 API 文档;
  • 架构设计说明。

用途:本地查阅 Kafka 功能和配置细节(无需联网)。

1.2.6、数据存储目录(非安装目录,需手动配置)

Kafka 的消息数据(日志)默认存储在 tmp/kafka-logs,但生产环境需通过 server.propertieslog.dirs 配置到独立磁盘路径(如 /data/kafka-logs)。该目录结构如下:

复制代码
/data/kafka-logs/
├── test-topic-0/        # Topic 名称+分区号(如 test-topic 的 0 号分区)
│   ├── 00000000000000000000.index  # 索引文件(记录消息偏移量与物理位置映射)
│   ├── 00000000000000000000.log    # 消息数据文件(实际存储消息内容)
│   ├── 00000000000000000000.timeindex  # 时间索引(按时间查找消息)
│   └── leader-epoch-checkpoint      # Leader 纪元信息(用于副本同步)
├── test-topic-1/        # 其他分区(结构同上)
└── __consumer_offsets-2/  # 内部 Topic(存储消费组的 Offset 信息)

说明

  • 每个 Topic 的每个分区对应一个子目录;
  • 消息按"日志段(Segment)"存储(.log 文件),满 log.segment.bytes 后自动滚动;
  • 索引文件(.index)加速消息查找,避免全量扫描 .log 文件。

1.3、服务启动

以下是针对 Kafka 3.9.1 + ZooKeeper 模式 的完整后台启动流程(含 ZooKeeper 启动步骤),确保流程正确且适配你的版本:

1.3.1、先启动 ZooKeeper(后台启动)

Kafka 安装包中 自带了 ZooKeeper 组件 (路径在 kafka_2.13-3.9.1/bin/zookeeper-server-start.sh),无需额外下载独立 ZooKeeper,直接使用自带脚本启动即可。

  1. 后台启动 ZooKeeper 命令
bash 复制代码
# 后台启动 ZooKeeper,日志输出到指定文件(替换为你的 Kafka 实际路径)
nohup /path/to/kafka_2.13-3.9.1/bin/zookeeper-server-start.sh /path/to/kafka_2.13-3.9.1/config/zookeeper.properties > /var/log/kafka/zookeeper.log 2>&1 &

命令说明:

  • zookeeper-server-start.sh:Kafka 自带的 ZooKeeper 启动脚本;
  • zookeeper.properties:ZooKeeper 默认配置文件(Kafka 安装包 config 目录下自带),默认端口 2181
  • > /var/log/kafka/zookeeper.log:将 ZooKeeper 日志单独输出(避免与 Kafka 日志混淆,便于排查);
  • 末尾 & 确保进程在后台运行。
  1. 验证 ZooKeeper 启动成功
bash 复制代码
# 方式1:查看进程(存在 "QuorumPeerMain" 表示启动成功)
ps -ef | grep zookeeper | grep -v grep

# 方式2:查看日志(无报错且出现 "Started" 表示正常)
tail -f /var/log/kafka/zookeeper.log
# 日志中出现类似 "Started QuorumPeerMain" 或 "Binding to port 0.0.0.0/0.0.0.0:2181" 即成功

1.3.2、再启动 Kafka Broker(后台启动,适配 3.9.1 版本)

ZooKeeper 启动成功后,再启动 Kafka,确保 Kafka 能连接到 ZooKeeper 注册元数据。

  1. 确认 Kafka 配置(关键:关联 ZooKeeper)

先检查 config/server.properties 中 ZooKeeper 连接配置是否正确(3.9.1 版本默认仍包含此配置):

properties 复制代码
# 打开 server.properties 文件
vim /path/to/kafka_2.13-3.9.1/config/server.properties

# 确认 ZooKeeper 连接地址(默认值如下,无需修改,除非调整过 ZooKeeper 端口)
zookeeper.connect=localhost:2181
# 可选:ZooKeeper 会话超时时间(默认 18000ms,无需修改)
zookeeper.connection.timeout.ms=18000

# Broker 监听的网络地址列表,下面这两个没有配置,只能本机连接
listeners=PLAINTEXT://:9092
# 与 listeners 相同 	对外暴露的监听地址(客户端实际连接的地址)
advertised.listeners=PLAINTEXT://192.168.223.232:9092
  1. 后台启动 Kafka Broker
bash 复制代码
# 后台启动 Kafka,日志输出到指定文件(替换为你的实际路径)
nohup /path/to/kafka_2.13-3.9.1/bin/kafka-server-start.sh /path/to/kafka_2.13-3.9.1/config/server.properties > /var/log/kafka/kafka-server.log 2>&1 &
  1. 验证 Kafka 启动成功
bash 复制代码
# 方式1:查看进程(存在 "kafka.Kafka" 表示启动成功)
ps -ef | grep kafka | grep -v grep

# 方式2:查看日志(关键看是否连接上 ZooKeeper 并完成启动)
tail -f /var/log/kafka/kafka-server.log
# 日志中出现类似 "[KafkaServer id=0] started (kafka.server.KafkaServer)" 即成功
# 同时会有 "Connected to ZooKeeper" 相关日志,说明与 ZooKeeper 连接正常

二、配置掌握

2.1、Kafka server.properties 配置详解

server.properties 是 Kafka Broker(服务器节点)的核心配置文件,用于定义 Broker 的身份、网络通信、存储、日志、副本机制、安全等关键行为。每个 Broker 必须有独立的配置文件(若单机部署多 Broker,需为每个实例分配不同端口和存储路径)。以下按 功能模块 拆解核心配置,结合场景说明其作用与默认值(基于 Kafka 3.x 版本)。

2.1.1、基础身份配置

定义 Broker 在 Kafka 集群中的唯一标识和集群关联信息,是 Broker 启动的基础。

配置项 默认值 功能说明 注意事项
broker.id 0 Broker 的 唯一身份ID (整数),集群内所有 Broker 的 broker.id 必须不同。 1. 若配置 broker.id.generation.enable=true,可自动生成 ID(无需手动指定); 2. 手动配置时建议按节点顺序编号(如 0、1、2),便于运维。
broker.id.generation.enable true 是否允许 Broker 自动生成 broker.id(基于 log.dirs 路径的哈希值)。 仅在未手动指定 broker.id 时生效,适合动态扩容场景(避免 ID 冲突)。
cluster.id 无(需手动指定) Kafka 集群的唯一标识,用于区分不同集群(如测试集群、生产集群)。 同一集群内所有 Broker 必须配置相同的 cluster.id,否则会被视为独立集群。

2.1.2、网络通信配置

控制 Broker 的网络监听、连接限制、数据传输参数,直接影响客户端(Producer/Consumer)与 Broker 的交互效率。

  1. 监听地址与端口
配置项 默认值 功能说明 场景示例
listeners 无(必须配置) Broker 监听的网络地址列表,格式为 协议://主机:端口,支持多协议(如 PLAINTEXT、SSL)。 - 单机测试:PLAINTEXT://localhost:9092(仅本地可访问); - 集群部署:PLAINTEXT://0.0.0.0:9092(允许所有主机访问); - 多协议:PLAINTEXT://0.0.0.0:9092,SSL://0.0.0.0:9093(同时支持明文和加密)。
advertised.listeners listeners 相同 对外暴露的监听地址(客户端实际连接的地址),适用于 Broker 部署在 NAT 或容器环境(如 Docker、K8s)。 若 Broker 内网地址为 192.168.1.100:9092,外网地址为 203.0.113.10:8080,则配置: advertised.listeners=PLAINTEXT://203.0.113.10:8080
listener.security.protocol.map PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL 映射 listeners 中的协议名称到实际安全协议,默认无需修改。 仅在自定义协议名称时调整(如简化协议标识)。
port 9092 listeners 未指定端口,默认使用此端口(建议优先通过 listeners 明确配置)。 低优先级配置,仅当 listeners 未定义时生效。
  1. 网络连接限制
配置项 默认值 功能说明 优化建议
num.network.threads 3 处理网络请求的线程数(接收客户端连接、读取请求数据)。 高并发场景(如每秒万级请求)可增至 5-10,避免线程瓶颈。
num.io.threads 8 处理 I/O 操作的线程数(写入磁盘、发送响应给客户端)。 与磁盘性能匹配,若使用 SSD 可增至 12-16,机械硬盘建议不超过 10
socket.send.buffer.bytes 102400(100KB) socket 发送缓冲区大小,用于批量传输数据。 大消息场景(如单条消息 10KB+)可增至 262144(256KB),减少网络往返。
socket.receive.buffer.bytes 102400(100KB) socket 接收缓冲区大小,用于缓存客户端请求数据。 socket.send.buffer.bytes 配合调整,避免缓冲区溢出。
socket.request.max.bytes 104857600(100MB) 单个请求的最大字节数(防止超大请求压垮 Broker)。 若业务需传输超大消息(如 200MB),需同步调整 Producer 的 生产者单个请求最大值max.request.size=10485760 (10MB 10×1024×1024)和 Consumer 的消费者单次拉取最大值fetch.max.bytes=10485760 (10MB 10×1024×1024)。

2.1.3、存储配置

定义 Kafka 日志(消息数据)的存储路径、分区大小、清理策略,直接影响数据可靠性和磁盘利用率。

  1. 日志存储路径
配置项 默认值 功能说明 注意事项
log.dirs /tmp/kafka-logs 日志文件的存储目录(可配置多个路径,用逗号分隔)。 1. 生产环境必须修改/tmp 目录重启后会清空); 2. 多目录配置时,Kafka 会轮询分配分区(负载均衡磁盘压力); 3. 建议使用独立磁盘(如 /data/kafka-logs-1,/data/kafka-logs-2),避免与系统盘混用。
log.dir 单日志目录配置(已过时,优先使用 log.dirs)。 若同时配置 log.dirslog.dirlog.dirs 优先级更高。
  1. 日志保留与清理

Kafka 消息默认不会永久存储,需通过配置控制保留策略(按时间或大小),避免磁盘占满。

配置项 默认值 功能说明 场景建议
log.retention.hours 168(7天) 消息保留的 默认时间(超过此时间的消息会被清理)。 - 实时业务(如监控数据):保留 24-48 小时; - 离线分析(如用户行为):保留 7-30 天。
log.retention.minutes 消息保留时间(分钟级),优先级高于 log.retention.hours 需更精细的保留控制时使用(如保留 30 分钟:log.retention.minutes=30)。
log.retention.ms 消息保留时间(毫秒级),优先级最高(覆盖小时/分钟配置)。 毫秒级精度场景(如金融实时数据保留 5 分钟:log.retention.ms=300000)。
log.retention.bytes -1(无限制) 单个分区的 最大保留大小(超过此大小会删除旧消息),优先级低于时间策略。 磁盘有限时配置(如单个分区保留 10GB:log.retention.bytes=10737418240),需结合分区数估算总磁盘占用。
log.segment.bytes 1073741824(1GB) 单个日志段(Segment)的最大大小(Kafka 按段存储日志,便于清理)。 1. 段越小,清理速度越快,但会生成更多小文件(影响性能); 2. 建议保持默认 1GB,或调整为 512MB(小消息场景)、2GB(大消息场景)。
log.segment.ms 604800000(7天) 日志段的 滚动时间 (即使未达到 log.segment.bytes,超过此时间也会生成新段)。 配合清理策略,避免单个段过大导致清理延迟(如配置 1 天:log.segment.ms=86400000)。
log.cleanup.policy delete 日志清理策略: - delete:删除过期消息; - compact:按 Key 压缩(保留每个 Key 的最新消息,适用于更新型数据如用户画像)。 1. 普通消息队列用 delete; 2. 键值型数据(如变更日志)用 compact,需同时配置 log.cleaner.enable=true
log.cleaner.enable true 是否启用日志清理器(仅对 compact 策略生效)。 若使用 compact 策略,必须确保此配置为 true

2.1.4、副本与可用性配置

Kafka 通过 副本机制 保证数据可靠性(多副本存储),以下配置控制副本的同步、选举和故障转移行为。

配置项 默认值 功能说明 关键原理
default.replication.factor 1 新创建 Topic 时的 默认副本数 (建议生产环境设为 2-3)。 副本数越多,可靠性越高,但会增加磁盘占用和网络同步开销(推荐 3 副本:容忍 2 个节点故障)。
min.insync.replicas 1 生产者发送消息时,必须同步成功的最小副本数 (与 Producer 的 acks 配合)。 1. 若 acks=-1(Producer 等待所有副本确认),且 min.insync.replicas=2,则至少 2 个副本同步成功才返回成功; 2. 生产环境建议设为 2(避免单副本故障导致数据丢失)。
replica.lag.time.max.ms 30000(30秒) 副本同步滞后的最大容忍时间:若从节点(Follower)超过此时间未与主节点(Leader)同步,会被标记为"下线"。 防止从节点长期滞后导致数据不一致,超时后 Leader 会剔除该从节点,不再向其同步数据。
replica.lag.max.messages -1(无限制) 副本同步滞后的最大消息数(已过时,优先使用 replica.lag.time.max.ms)。 建议保持默认 -1,避免因消息量波动误判副本下线。
unclean.leader.election.enable false 是否允许"非同步副本"(未跟上 Leader 的 Follower)成为新 Leader。 1. true:可用性优先(故障时快速选举 Leader,但可能丢失数据); 2. false:可靠性优先(仅允许同步副本成为 Leader,无数据丢失,但选举可能延迟); 3. 生产环境强烈建议设为 false
num.replica.fetchers 1 从节点(Follower)从 Leader 拉取消息的线程数。 多副本场景(如 3 副本)可增至 2-3,提升同步速度,避免副本滞后。

2.1.5、ZooKeeper 配置

Kafka 3.x 之前依赖 ZooKeeper 存储集群元数据(如 Broker 列表、Topic 分区信息),3.x 开始支持 KRaft 模式(无 ZooKeeper),但仍兼容 ZooKeeper 配置。

配置项 默认值 功能说明 注意事项
zookeeper.connect localhost:2181 ZooKeeper 集群地址,格式为 主机1:端口1,主机2:端口2,.../kafka/kafka 为命名空间,避免与其他应用冲突)。 1. 若 ZooKeeper 集群有 3 个节点,配置:zk1:2181,zk2:2181,zk3:2181/kafka; 2. 若使用 KRaft 模式,需删除此配置,改用 process.roles 等 KRaft 相关配置。
zookeeper.connection.timeout.ms 18000(18秒) 与 ZooKeeper 建立连接的超时时间。 网络不稳定时可增至 30000(30秒),避免频繁断开连接。

2.1.6、高级性能优化配置

针对高并发、大流量场景,调整以下配置提升 Broker 吞吐量和稳定性。

配置项 默认值 功能说明 优化建议
log.flush.interval.messages -1(无限制) 触发日志刷盘的 消息数量阈值(-1 表示由操作系统控制刷盘)。 不建议手动配置(依赖 OS 页缓存更高效),强制刷盘会降低吞吐量。
log.flush.interval.ms -1(无限制) 触发日志刷盘的 时间阈值(-1 表示由操作系统控制)。 同上,保持默认即可(Kafka 依赖 OS 缓存和磁盘自身缓存保证性能)。
compression.type producer Broker 对消息的压缩方式: - producer:保留 Producer 发送的压缩格式; - gzip/snappy/lz4:强制重压缩(需权衡 CPU 与带宽)。 若 Producer 未压缩,可配置 snappy(CPU 开销小,压缩比适中),减少磁盘和网络开销。
num.partitions 1 新创建 Topic 时的 默认分区数(决定并发处理能力)。 1. 分区数越多,Consumer 可并行消费的线程数越多(吞吐量越高); 2. 建议按"峰值吞吐量/单分区吞吐量"估算(如单分区每秒处理 1000 条消息,峰值 5000 条则设为 5 个分区)。
auto.create.topics.enable true 是否允许客户端自动创建 Topic(如 Producer 发送消息到不存在的 Topic 时)。 生产环境建议设为 false,避免误创建无用 Topic,需通过运维手动创建 Topic。

2.1.7、安全配置(可选)

若需保障数据传输和访问安全,需配置 SSL/TLS 加密、SASL 认证等(默认不启用安全机制)。

配置项 示例值 功能说明
listeners SSL://0.0.0.0:9093 启用 SSL 加密监听(替换 PLAINTEXT)。
ssl.keystore.location /etc/kafka/ssl/server.keystore.jks Broker 证书库路径(存储自身证书)。
ssl.keystore.password 123456 证书库密码。
ssl.truststore.location /etc/kafka/ssl/server.truststore.jks 信任库路径(存储客户端信任的证书)。
ssl.truststore.password 123456 信任库密码。
sasl.enabled.mechanisms PLAIN 启用 SASL 认证机制(如 PLAIN、SCRAM-SHA-256)。
sasl.mechanism.inter.broker.protocol PLAIN Broker 之间通信的 SASL 机制。

2.1.8、配置优先级与生效方式

  1. 优先级顺序
    命令行参数(如 --broker.id=1) > server.properties 配置 > Kafka 默认值。
  2. 生效方式
    • 大部分配置(如 listenerslog.dirs)修改后需 重启 Broker 生效;
    • 部分动态配置(如 log.retention.hoursmin.insync.replicas)可通过 Kafka 命令行工具修改,无需重启(需开启动态配置支持)。

通过合理配置 server.properties,可平衡 Kafka 的 可靠性、吞吐量、延迟 三大核心指标。生产环境需结合业务场景(如消息大小、并发量、数据保留需求)和硬件资源(CPU、内存、磁盘、网络)动态调整,避免直接使用默认配置。

2.1.9、生产环境-配置示例

shell 复制代码
# ================ 基础身份配置 ================
broker.id=0  # 每个Broker唯一,依次递增(0,1,2...)
cluster.id=prod-kafka-cluster  # 集群唯一标识
broker.id.generation.enable=false  # 禁用自动生成Broker ID(生产环境建议固定ID)

# ================ 网络通信配置 ================
listeners=PLAINTEXT://0.0.0.0:9092  # 监听地址(生产环境建议用SSL加密)
advertised.listeners=PLAINTEXT://192.168.1.100:9092  # 对外暴露的地址(替换为实际IP)
num.network.threads=6  # 处理网络请求的线程数(CPU核心数的1-1.5倍)
num.io.threads=12  # 处理I/O的线程数(CPU核心数的2-3倍)
socket.send.buffer.bytes=131072  # 发送缓冲区(128KB)
socket.receive.buffer.bytes=131072  # 接收缓冲区(128KB)
socket.request.max.bytes=104857600  # 单个请求最大100MB(需大于生产者max.request.size)

# ================ 存储配置 ================
log.dirs=/data/kafka-logs-1,/data/kafka-logs-2  # 多磁盘路径(避免/tmp)
log.retention.hours=48  # 消息保留48小时(根据业务调整)
log.segment.bytes=1073741824  # 单个日志段1GB
log.segment.ms=86400000  # 日志段滚动时间24小时
log.cleanup.policy=delete  # 清理策略(默认删除,变更日志用compact)
log.flush.scheduler.interval.ms=300000  # 刷盘调度间隔5分钟(依赖OS缓存)

# ================ 副本与可用性配置 ================
default.replication.factor=3  # 默认副本数3(容忍2节点故障)
min.insync.replicas=2  # 至少2个副本同步成功才确认消息(配合acks=-1)
unclean.leader.election.enable=false  # 禁止非同步副本成为Leader(优先可靠性)
replica.lag.time.max.ms=30000  # 副本同步超时30秒
num.replica.fetchers=2  # 副本同步线程数
replica.fetch.max.bytes=10485760  # 副本同步最大消息10MB

# ================ 性能优化配置 ================
num.partitions=8  # 默认分区数8(根据吞吐量估算)
auto.create.topics.enable=false  # 禁用自动创建Topic(需手动管理)
compression.type=snappy  # 启用Snappy压缩(平衡CPU和带宽)
log.message.format.version=3.0  # 消息格式版本(与Kafka版本一致)

# ================ ZooKeeper配置(若使用) ================
zookeeper.connect=zk1:2181,zk2:2181,zk3:2181/kafka  # ZK集群地址+命名空间
zookeeper.connection.timeout.ms=30000  # ZK连接超时30秒

# ================ 动态配置支持 ================
dynamic.config.sync.interval.ms=60000  # 动态配置同步间隔1分钟

2.2、Kafka consumer.properties 配置详解

consumer.properties 是 Kafka 消费者(Consumer)的核心配置文件,用于定义消费者与 Broker 的连接方式、消费行为、数据拉取策略、偏移量(Offset)管理等关键特性。以下按功能模块拆解核心配置,结合使用场景说明其作用与最佳实践(基于 Kafka 3.x 版本)。

通常将 Kafka 消费者配置写入自己服务的配置文件(如 Spring Boot 的application.yml),与服务的其他配置统一管理。以下配置用于熟悉和了解

2.2.1、基础身份与集群连接配置

定义消费者所属的消费组、连接的 Kafka 集群地址等基础信息,是消费者启动的前提。

配置项 默认值 功能说明 注意事项
bootstrap.servers 无(必须配置) Kafka 集群 Broker 地址列表,格式为 host1:port1,host2:port2 1. 只需配置部分 Broker 地址(消费者会自动发现集群中所有节点); 2. 示例:bootstrap.servers=broker1:9092,broker2:9092,broker3:9092
group.id 无(建议配置) 消费者所属的 消费组 ID,用于实现消息的负载均衡和偏移量共享。 1. 同一消费组内的消费者共同消费 Topic 分区(每个分区仅被组内一个消费者消费); 2. 不同消费组可独立消费同一 Topic(互不影响)。
client.id 自动生成(如 consumer-1 消费者的客户端标识(用于 Broker 日志和监控区分不同客户端)。 建议手动配置有业务含义的名称(如 order-service-consumer),便于问题排查。

2.2.2、数据拉取与消费策略

控制消费者从 Broker 拉取消息的频率、数量、大小等,直接影响消费效率和性能。

  1. 拉取参数配置
配置项 默认值 功能说明 优化建议
fetch.min.bytes 1 消费者单次拉取的 最小字节数:若 Broker 数据不足,会等待直到满足条件或超时。 1. 低延迟场景(如实时监控):保持默认 1(有数据就拉取); 2. 高吞吐量场景:设为 102400(100KB),减少请求次数(需配合 fetch.max.wait.ms)。
fetch.max.bytes 52428800(50MB) 消费者单次拉取的 最大字节数(包含所有分区的消息总和)。 1. 必须 ≥ 可能遇到的最大单条消息大小(否则无法消费大消息); 2. 与 Broker 端 socket.request.max.bytes 和 Producer 端 max.request.size 协调(建议为最大消息的 2-3 倍)。
fetch.max.wait.ms 500(500毫秒) 等待 fetch.min.bytes 满足的 最长时间(超时后即使数据不足也返回)。 fetch.min.bytes 配合使用,例如:fetch.min.bytes=100KB + fetch.max.wait.ms=1000(最多等1秒)。
max.partition.fetch.bytes 1048576(1MB) 消费者从 单个分区 拉取的最大字节数(优先级高于 fetch.max.bytes)。 1. 限制单个分区的拉取量,避免某分区数据过大占用全部带宽; 2. 若单条消息超过此值,需调大(如 5MB 消息对应 5242880)。
  1. 消费并行度配置
配置项 默认值 功能说明 关键原理
max.poll.records 500 单次 poll() 调用返回的 最大消息数(控制批量消费的数量)。 1. 数值越大,单次处理的消息越多,但会增加内存占用和处理延迟; 2. 结合业务处理能力调整(如每秒能处理 1000 条,则设为 1000)。
max.poll.interval.ms 300000(5分钟) 两次 poll() 调用的 最大间隔时间:超过此时间,消费组会认为该消费者失效并触发重平衡(Rebalance)。 1. 若业务处理消息耗时较长(如5分钟以上),需调大此值(如 3600000 即1小时); 2. 过小会导致频繁重平衡,影响消费稳定性。

2.1.3、偏移量(Offset)管理

Offset 是消费者已消费消息的位置标识,以下配置控制 Offset 的提交方式、初始位置等,直接影响消息的可靠性(是否漏消费或重复消费)。

  1. Offset 提交策略
配置项 默认值 功能说明 场景选择
enable.auto.commit true 是否自动提交 Offset(后台定期提交)。 1. true:适用于对重复消费不敏感的场景(如日志收集),简化开发; 2. false:适用于严格不允许重复消费的场景(如金融交易),需手动调用 commitSync()commitAsync()
auto.commit.interval.ms 5000(5秒) 自动提交 Offset 的 间隔时间 (仅当 enable.auto.commit=true 生效)。 缩短间隔(如 1000 毫秒)可减少重复消费的范围,但会增加 Broker 压力。
  1. Offset 初始位置与重置策略
配置项 默认值 功能说明 适用场景
auto.offset.reset latest 当消费组无初始 Offset 或 Offset 无效(如消息已被删除)时的处理策略: - latest:从最新消息开始消费(默认); - earliest:从最早消息开始消费; - none:抛出异常,不消费。 1. 新消费组首次消费:earliest(全量消费历史数据)或 latest(只消费新数据); 2. 数据回溯场景:需手动重置 Offset 并配合 earliest
offset.metadata.max.bytes 4096(4KB) 存储 Offset 元数据(如自定义标识)的最大字节数。 若无需自定义元数据,保持默认即可;如需存储额外信息(如业务标识),可适当调大。

2.2.4、连接与超时配置

控制消费者与 Broker 的连接超时、会话保持等,保障网络不稳定时的可靠性。

配置项 默认值 功能说明 优化建议
session.timeout.ms 45000(45秒) 消费组会话超时时间:若消费者超过此时长未发送心跳,会被标记为失效并触发重平衡。 1. 需小于 group.initial.rebalance.delay.ms + max.poll.interval.ms; 2. 网络不稳定时可增至 60000(60秒),减少误判。
heartbeat.interval.ms 3000(3秒) 消费者向协调者(Coordinator)发送心跳的间隔时间(用于确认存活状态)。 建议设为 session.timeout.ms 的 1/3 ~ 1/5(如会话超时 45 秒,心跳设为 3-10 秒)。
connection.max.idle.ms 540000(9分钟) 空闲连接的最大保持时间:超过此时长会关闭连接,节省资源。 长连接场景(如持续消费)可适当调大(如 3600000 即1小时)。
request.timeout.ms 30000(30秒) 消费者请求(如拉取消息、提交 Offset)的超时时间。 网络较慢时可增至 60000(60秒),避免频繁超时重试。

2.2.5、消费组与重平衡配置

消费组(Consumer Group)通过重平衡(Rebalance)机制实现分区的动态分配,以下配置控制重平衡的行为。

配置项 默认值 功能说明 关键作用
group.initial.rebalance.delay.ms 0 新消费者加入消费组后,延迟多久触发首次重平衡(给其他消费者足够时间加入)。 1. 集群扩容时,设为 10000(10秒),避免短时间内多次重平衡; 2. 快速启动场景保持默认 0
partition.assignment.strategy [org.apache.kafka.clients.consumer.RangeAssignor, org.apache.kafka.clients.consumer.CooperativeStickyAssignor] 分区分配策略(决定消费组内消费者如何分配 Topic 分区): - RangeAssignor:按范围分配(默认); - RoundRobinAssignor:轮询分配; - StickyAssignor:粘性分配(尽量保持原有分配,减少重平衡波动)。 1. 普通场景:默认策略即可; 2. 分区数多且频繁扩缩容:推荐 StickyAssignor(减少重平衡对消费的影响)。

2.2.6、高级功能配置

针对特殊场景(如大消息、安全认证、监控)的配置。

配置项 默认值 功能说明 适用场景
receive.buffer.bytes 65536(64KB) 消费者 socket 接收缓冲区大小(用于缓存从 Broker 拉取的数据)。 大消息场景(如单条 10MB)可增至 10485760(10MB),减少网络往返。
send.buffer.bytes 131072(128KB) 消费者 socket 发送缓冲区大小(用于发送请求到 Broker)。 receive.buffer.bytes 配合调整,避免缓冲区溢出。
isolation.level read_uncommitted 消费隔离级别: - read_uncommitted:可消费未提交的事务消息(默认); - read_committed:仅消费已提交的事务消息。 事务消息场景(如分布式事务)需设为 read_committed,确保数据一致性。
metric.reporters 配置指标报告器(如 Prometheus、Graphite),用于监控消费者性能。 生产环境建议配置,示例:metric.reporters=org.apache.kafka.common.metrics.JmxReporter(JMX 监控)。

2.2.7、安全配置(可选)

若 Kafka 集群启用了安全认证(如 SSL、SASL),需配置以下参数(默认不启用)。

配置项 示例值 功能说明
security.protocol SSLSASL_PLAINTEXT 消费者与 Broker 通信的安全协议(需与 Broker 端 listeners 匹配)。
ssl.truststore.location /etc/kafka/ssl/consumer.truststore.jks 信任库路径(存储 Broker 证书)。
ssl.truststore.password 123456 信任库密码。
sasl.mechanism PLAINSCRAM-SHA-256 SASL 认证机制(需与 Broker 端一致)。
sasl.jaas.config org.apache.kafka.common.security.plain.PlainLoginModule required username="user" password="pass"; SASL 认证的用户名和密码配置。

2.2.8、生产环境配置示例(精简版)

properties 复制代码
# 基础连接
bootstrap.servers=broker1:9092,broker2:9092,broker3:9092
group.id=order-service-group
client.id=order-consumer-1

# 拉取策略
fetch.min.bytes=102400  # 100KB
fetch.max.bytes=104857600  # 100MB
fetch.max.wait.ms=1000  # 1秒
max.partition.fetch.bytes=5242880  # 5MB

# 消费并行度
max.poll.records=1000
max.poll.interval.ms=600000  # 10分钟(处理耗时较长的场景)

# Offset 管理(手动提交,确保不重复消费)
enable.auto.commit=false
auto.offset.reset=earliest  # 首次消费从最早消息开始

# 连接与超时
session.timeout.ms=60000  # 60秒
heartbeat.interval.ms=10000  # 10秒
request.timeout.ms=60000  # 60秒

# 分区分配策略(优先粘性分配,减少重平衡影响)
partition.assignment.strategy=org.apache.kafka.clients.consumer.StickyAssignor

2.2.9、常见问题与最佳实践

  1. 避免频繁重平衡

    • 重平衡会导致消费暂停,需尽量减少:
      • 合理设置 session.timeout.msmax.poll.interval.ms(避免消费者被误判为失效);
      • 扩缩容时通过 group.initial.rebalance.delay.ms 延迟重平衡;
      • 使用 StickyAssignor 分配策略,减少重平衡时的分区迁移。
  2. 平衡消费延迟与吞吐量

    • 低延迟场景:减小 fetch.min.bytes(如 1)和 fetch.max.wait.ms(如 100 毫秒);
    • 高吞吐量场景:增大 fetch.min.bytes(如 100KB)和 max.poll.records(如 1000),减少请求次数。
  3. Offset 提交策略选择

    • 非关键业务:启用 enable.auto.commit(简化开发,容忍少量重复消费);
    • 关键业务(如支付):禁用自动提交,在消息处理完成后手动提交 commitSync()(确保消息仅被消费一次)。
  4. 处理大消息

    • 确保 max.partition.fetch.bytes ≥ 单条消息大小;
    • 同步调整 Broker 端 socket.request.max.bytes 和 Producer 端 max.request.size

通过合理配置 consumer.properties,可优化消费者的性能、可靠性和资源利用率。核心原则是:结合业务场景(延迟/吞吐量需求)、消息特性(大小/频率)和集群规模动态调整

2.2.10、生产环境-配置示例

shell 复制代码
# ================ 基础连接配置 ================
bootstrap.servers=broker1:9092,broker2:9092,broker3:9092  # Broker地址列表
group.id=order-service-group  # 消费组ID(业务相关命名)
client.id=order-consumer-1  # 客户端标识(便于监控)

# ================ 拉取策略配置 ================
fetch.min.bytes=102400  # 单次拉取最小100KB(减少请求次数)
fetch.max.bytes=104857600  # 单次拉取最大100MB
fetch.max.wait.ms=1000  # 最多等待1秒(平衡延迟和吞吐量)
max.partition.fetch.bytes=10485760  # 单个分区拉取最大10MB(需≥最大消息大小)

# ================ 消费并行度配置 ================
max.poll.records=1000  # 单次poll最大1000条消息(根据处理能力调整)
max.poll.interval.ms=600000  # 两次poll间隔最大10分钟(避免频繁重平衡)

# ================ Offset管理配置 ================
enable.auto.commit=ture  # 开启自动提交(手动提交为false,要控制提交时机)
auto.offset.reset=latest  # 生产环境稳定后可改为从最新消息消费
# auto.offset.reset=earliest  # 无Offset时从最早消息开始消费(首次消费)

# ================ 连接与超时配置 ================
session.timeout.ms=60000  # 会话超时60秒
heartbeat.interval.ms=10000  # 心跳间隔10秒(约为session.timeout的1/6)
connection.max.idle.ms=3600000  # 空闲连接保持1小时
request.timeout.ms=60000  # 请求超时60秒

# ================ 重平衡与分配策略 ================
group.initial.rebalance.delay.ms=10000  # 首次重平衡延迟10秒(等待更多消费者加入)
partition.assignment.strategy=org.apache.kafka.clients.consumer.StickyAssignor  # 粘性分配策略(减少重平衡波动)

# ================ 高级配置 ================
receive.buffer.bytes=65536  # 接收缓冲区64KB
send.buffer.bytes=131072  # 发送缓冲区128KB
isolation.level=read_committed  # 仅消费已提交的事务消息(事务场景)

2.3、Kafka producer.properties 配置详解

producer.properties 是 Kafka 生产者(Producer)的核心配置文件,用于定义生产者与 Broker 的连接方式、消息发送策略、可靠性保证、压缩方式等关键特性。以下按功能模块拆解核心配置,结合使用场景说明其作用与最佳实践(基于 Kafka 3.x 版本)。

2.3.1、基础连接配置

定义生产者连接 Kafka 集群的基础信息,是生产者启动的前提。

配置项 默认值 功能说明 注意事项
bootstrap.servers 无(必须配置) Kafka 集群 Broker 地址列表,格式为 host1:port1,host2:port2 1. 只需配置部分 Broker 地址(生产者会自动发现集群中所有节点); 2. 示例:bootstrap.servers=broker1:9092,broker2:9092,broker3:9092
client.id 自动生成(如 producer-1 生产者的客户端标识(用于 Broker 日志和监控区分不同客户端)。 建议手动配置有业务含义的名称(如 order-service-producer),便于问题排查。

2.3.2、消息发送与可靠性配置

控制消息发送的确认机制、重试策略等,直接影响消息的可靠性(是否丢失)和发送延迟。

  1. 可靠性保证(ACK 机制)
配置项 默认值 功能说明 场景选择
acks 1 消息发送的确认级别: - 0:生产者发送后不等待 Broker 确认(最快,但可能丢失消息); - 1:仅等待 Leader 分区确认接收(默认,平衡可靠性和性能); - -1all:等待 Leader 和所有同步副本(ISR)确认(最可靠,但延迟最高)。 1. 高性能场景(如日志采集):01; 2. 高可靠场景(如金融交易):-1(需配合 Broker 的 min.insync.replicas ≥ 2)。
  1. 重试机制
配置项 默认值 功能说明 优化建议
retries 2147483647(无限重试) 消息发送失败时的重试次数(如网络抖动、Leader 切换导致的临时失败)。 1. 生产环境建议设为 10(避免无限重试导致消息积压); 2. 需配合 retry.backoff.ms 控制重试间隔。
retry.backoff.ms 100(100毫秒) 两次重试之间的等待时间(避免频繁重试给 Broker 带来压力)。 网络不稳定时可增至 1000(1秒),减少无效重试。
delivery.timeout.ms 120000(2分钟) 消息从发送到成功交付的最大超时时间(包含重试时间)。 需大于 linger.ms + (retries + 1) * retry.backoff.ms,确保重试机制生效。

2.3.3、性能优化配置

控制消息的批量发送、压缩方式等,直接影响生产者的吞吐量和网络带宽占用。

  1. 批量发送策略
配置项 默认值 功能说明 关键原理
batch.size 16384(16KB) 生产者批量发送的 缓冲区大小:达到此大小后会统一发送。 1. 增大此值(如 65536 即64KB)可提高吞吐量(减少网络请求次数),但会增加延迟; 2. 若消息体较大(如5KB),建议设为消息大小的 3-5 倍(如 20480)。
linger.ms 0(立即发送) 批量发送的 等待时间 :即使未达到 batch.size,超过此时长也会发送。 1. 低延迟场景:保持 0(有消息就发); 2. 高吞吐量场景:设为 5-100 毫秒(等待更多消息凑成批量)。
buffer.memory 33554432(32MB) 生产者用于缓存消息的 总内存大小(所有分区共享)。 若消息发送速度超过 Broker 接收速度,缓冲区满后会阻塞发送(或抛出异常,取决于 block.on.buffer.full),建议根据并发量调整(如 67108864 即64MB)。
  1. 压缩配置
配置项 默认值 功能说明 场景选择
compression.type none(不压缩) 消息压缩算法: - none:不压缩; - gzip:高压缩比(CPU 开销大); - snappy:中等压缩比(CPU 开销小,推荐); - lz4:压缩速度快(适合大消息)。 1. 网络带宽有限时:启用 snappylz4; 2. 小消息(<1KB):压缩收益低,可保持 none; 3. 大消息(>1KB):建议压缩(减少网络传输和存储开销)。

2.3.4、消息大小与序列化配置

控制单条消息的最大尺寸、数据序列化方式等。

配置项 默认值 功能说明 注意事项
max.request.size 1048576(1MB) 单个请求的最大字节数(包含消息本身和协议头),限制单条消息的最大尺寸。 1. 必须 ≤ Broker 端的 socket.request.max.bytes(否则 Broker 会拒绝请求); 2. 若需发送大消息(如10MB),需同步调整为 10485760 并修改 Broker 配置。
key.serializer 无(必须配置) 消息键(Key)的序列化类(将对象转为字节数组)。 官方提供:org.apache.kafka.common.serialization.StringSerializer(字符串)、org.apache.kafka.common.serialization.IntegerSerializer(整数)等。
value.serializer 无(必须配置) 消息值(Value)的序列化类(同 Key 序列化逻辑)。 自定义对象需实现 org.apache.kafka.common.serialization.Serializer 接口。

2.3.5、分区策略配置

控制消息如何分配到 Topic 的不同分区(影响消费的负载均衡)。

配置项 默认值 功能说明 适用场景
partitioner.class org.apache.kafka.clients.producer.internals.DefaultPartitioner 分区分配策略类: - 默认策略:指定 Key 时按 Key 哈希分配到固定分区;无 Key 时轮询分配。 - 自定义策略:需实现 org.apache.kafka.clients.producer.Partitioner 接口。 1. 普通场景:默认策略即可; 2. 特殊需求(如按业务标签分区):自定义分区器。
linger.ms 0 见"批量发送策略" 与分区策略配合,影响批量消息的分区分布。

2.3.6、连接与超时配置

控制生产者与 Broker 的连接超时、请求超时等,保障网络不稳定时的可靠性。

配置项 默认值 功能说明 优化建议
connections.max.idle.ms 540000(9分钟) 空闲连接的最大保持时间:超过此时长会关闭连接,节省资源。 长连接场景(如持续发送消息)可适当调大(如 3600000 即1小时)。
request.timeout.ms 30000(30秒) 生产者请求(如发送消息)的超时时间。 网络较慢时可增至 60000(60秒),避免频繁超时重试。
metadata.fetch.timeout.ms 60000(60秒) 获取集群元数据(如分区 Leader 信息)的超时时间。 集群规模大时可适当调大(如 120000 即2分钟)。

2.3.7、安全配置(可选)

若 Kafka 集群启用了安全认证(如 SSL、SASL),需配置以下参数(默认不启用)。

配置项 示例值 功能说明
security.protocol SSLSASL_PLAINTEXT 生产者与 Broker 通信的安全协议(需与 Broker 端 listeners 匹配)。
ssl.keystore.location /etc/kafka/ssl/producer.keystore.jks 生产者证书库路径(存储自身证书)。
ssl.keystore.password 123456 证书库密码。
sasl.mechanism PLAINSCRAM-SHA-256 SASL 认证机制(需与 Broker 端一致)。
sasl.jaas.config org.apache.kafka.common.security.plain.PlainLoginModule required username="user" password="pass"; SASL 认证的用户名和密码配置。

2.3.8、常见问题与最佳实践

  1. 平衡可靠性与性能

    • 核心业务(如支付):acks=-1 + retries=10 + 同步发送(确保消息不丢失);
    • 非核心业务(如日志):acks=1 + 异步发送 + 压缩(优先吞吐量)。
  2. 批量发送调优

    • 消息量小但频繁:增大 linger.ms(如50ms),让更多消息凑成批量;
    • 消息量大:增大 batch.size(如64KB),减少网络请求次数。
  3. 处理大消息

    • 避免发送超大消息(建议 ≤10MB),否则会降低吞吐量;
    • 必须发送大消息时,同步调整:
      • 生产者 max.request.size
      • Broker socket.request.max.bytes
      • 消费者 max.partition.fetch.bytes
  4. 序列化选择

    • 简单类型(字符串、整数):用官方 StringSerializer
    • 复杂对象:推荐 JSON(可读性好)或 Protobuf(效率高、体积小)。

通过合理配置 producer.properties,可在满足业务可靠性要求的同时,最大化生产者的吞吐量并降低延迟。核心原则是:根据消息特性(大小、频率)和业务对可靠性的要求动态调整

2.3.9、生产环境-配置示例

shell 复制代码
# ================ 基础连接配置 ================
# Kafka集群Broker地址列表(至少配置2个,避免单点依赖)
bootstrap.servers=broker1:9092,broker2:9092,broker3:9092
# 客户端标识(建议包含业务名称,便于监控和日志排查)
client.id=order-service-producer

# ================ 可靠性配置(核心) ================
# 消息确认级别:-1/all 表示等待Leader和所有同步副本确认(最高可靠性)
acks=-1
# 消息发送失败后的重试次数(10次足够覆盖大多数临时故障)
retries=10
# 重试间隔时间(1秒,避免频繁重试压垮Broker)
retry.backoff.ms=1000
# 消息从发送到成功交付的最大超时时间(5分钟,需大于重试总耗时)
delivery.timeout.ms=300000
# 发送缓冲区满时是否阻塞(false表示抛出异常,避免消息积压)
block.on.buffer.full=false

# ================ 性能优化配置 ================
# 批量发送缓冲区大小(64KB,平衡批量效率和延迟)
batch.size=65536
# 批量等待时间(50毫秒,等待更多消息凑成批量,提高吞吐量)
linger.ms=50
# 生产者总缓存内存(64MB,根据并发量调整,避免OOM)
buffer.memory=67108864
# 启用Snappy压缩(平衡CPU开销和网络带宽,大消息收益明显)
compression.type=snappy

# ================ 消息大小与序列化 ================
# 单个请求最大大小(10MB,支持大消息,需与Broker和Consumer配合调整)
max.request.size=10485760
# Key的序列化器(字符串类型,根据实际数据类型调整)
key.serializer=org.apache.kafka.common.serialization.StringSerializer
# Value的序列化器(字符串类型,复杂对象可替换为JSON/Protobuf序列化器)
value.serializer=org.apache.kafka.common.serialization.StringSerializer

# ================ 连接与超时配置 ================
# 空闲连接最大保持时间(1小时,长连接场景减少重连开销)
connections.max.idle.ms=3600000
# 单个请求超时时间(60秒,网络较慢时避免频繁超时)
request.timeout.ms=60000
# 元数据获取超时时间(2分钟,集群规模大时需延长)
metadata.fetch.timeout.ms=120000
# 元数据刷新间隔(5分钟,定期更新集群信息如Leader切换)
metadata.max.age.ms=300000

# ================ 分区策略(可选) ================
# 分区分配策略(默认策略:按Key哈希分区,无Key则轮询)
# partitioner.class=org.apache.kafka.clients.producer.internals.DefaultPartitioner

# ================ 安全配置(按需启用) ================
# 若集群启用SSL/SASL,取消注释并配置以下参数
# security.protocol=SASL_SSL
# sasl.mechanism=SCRAM-SHA-256
# sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="producer-user" password="producer-pass";
# ssl.truststore.location=/etc/kafka/ssl/truststore.jks
# ssl.truststore.password=truststore-pass

三、鉴权配置

3.1、kafka鉴权

  1. server.properties配置文件最下方添加配置
shell 复制代码
#使用的认证协议
#security.inter.broker.protocol=SASL_PLAINTEXT
#SASL机制
sasl.enabled.mechanisms=PLAIN
sasl.mechanism.inter.broker.protocol=PLAIN
#完成身份验证的类
authorizer.class.name=kafka.security.authorizer.AclAuthorizer
#如果没有找到ACL(访问控制列表)配置,则允许任何操作。
allow.everyone.if.no.acl.found=false
#需要开启设置超级管理员,设置visitor用户为超级管理员
super.users=User:visitor
  1. 在同层目录新建kafka_server_jaas.conf配置
shell 复制代码
vim kafka_server_jaas.conf

添加以下内容:

shell 复制代码
KafkaServer{
org.apache.kafka.common.security.plain.PlainLoginModule required
username="visitor"
password="123456"
user_visitor="123456"
user_producer="123456"
user_consumer="123456";
};
  1. 修改启动脚本

给kafka启动脚本最上方添加变量

shell 复制代码
vim bin/kafka-server-start.sh
shell 复制代码
export KAFKA_OPTS=" -Djava.security.auth.login.config=/path/to/kafka_2.12-3.9.1/config/kafka_server_jaas.conf"
  1. 设置server.properties映射端口,修改内外网连接地址端口

这时候你的内部连接kafka端口为19092,使用外网ip连接端口为29092

shell 复制代码
listeners=INTERNAL://0.0.0.0:19092,EXTERNAL://0.0.0.0:29092
advertised.listeners=INTERNAL://内网ip:19092,EXTERNAL://外网ip:29092
listener.security.protocol.map=INTERNAL:SASL_PLAINTEXT,EXTERNAL:SASL_PLAINTEXT
inter.broker.listener.name=INTERNAL
  1. 启动服务

启动ZooKeeper

shell 复制代码
nohup /path/to/kafka_2.13-3.9.1/bin/zookeeper-server-start.sh /path/to/kafka_2.13-3.9.1/config/zookeeper.properties > /var/log/kafka/zookeeper.log 2>&1 &

启动kafka

shell 复制代码
nohup /path/to/kafka_2.12-3.9.1/bin/kafka-server-start.sh /path/to/kafka_2.12-3.9.1/config/server.properties > /path/kafka_2.12-3.9.1/log/kafka/kafka-server.log 2>&1 &
  1. 测试



连接测试,接入成功

输入错误的密码,连接不上

3.2、zookeeper鉴权

ZooKeeper 默认是 "无鉴权开放状态" 的 ------ 即默认不需要任何密码就能直接访问,任何能连接到 ZooKeeper 端口(默认 2181)的客户端,都能读写数据、甚至删除关键节点。加鉴权后,未授权用户无法连接,自然无法读取这些敏感元数据。

建议上方kafka配置成功后再来配置zookeeper鉴权。

  1. zookeeper.properties 中添加以下配置(启用 SASL 认证)
bash 复制代码
# 启用 SASL 认证插件(必填)
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider

# 强制客户端必须使用 SASL 认证(若设为 sasl,则未认证的客户端无法连接)
requireClientAuthScheme=sasl

# SASL 登录会话的刷新时间(毫秒),建议设置为 1 小时
jaasLoginRenew=3600000
  1. Kafka 的server.properties 需明确指定 ZooKeeper 的 SASL 机制
bash 复制代码
# 启用ZooKeeper SASL客户端认证
zookeeper.sasl.client=true
# 指定SASL机制(与ZooKeeper一致)
zookeeper.sasl.client.mechanism=PLAIN
# 与ZooKeeper JAAS配置中定义的用户匹配
zookeeper.sasl.client.username=zkuser
  1. 在同层目录(config下)新建zookeeper_jaas.conf配置

注意注释要删掉,可能会报错

bash 复制代码
Server {
    org.apache.zookeeper.server.auth.DigestLoginModule required
     # ZooKeeper管理员账号(用于内部操作)
    username="admin"
    password="admin123"
    user_zkuser="zkpass123";  # Kafka连接ZooKeeper的用户(user_用户名)
};
  1. 在kafka的鉴权配置kafka_server_jaas.conf中,加入连接zookeeper鉴权配置

注意注释要删掉,可能会报错

bash 复制代码
# 连接ZooKeeper的客户端认证配置
Client {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="zkuser"  # 与ZooKeeper中定义的user_zkuser对应
    password="zkpass123";  # 与ZooKeeper中user_zkuser的密码一致
};
  1. 在zookeeper的启动文件zookeeper-server-start.sh上方加入配置
bash 复制代码
export KAFKA_OPTS="-Djava.security.auth.login.config=/path/to/zookeeper_jaas.conf"  

6.启动zookeeper,此时连接就需要鉴权

相关推荐
java干货3 小时前
还在重启应用改 Topic?Spring Boot 动态 Kafka 消费的“终极形态”
spring boot·kafka·linq
lifallen3 小时前
KafkaStreams 计算图节点设计:ProcessorNode、SourceNode、SinkNode
java·数据结构·算法·kafka·apache
AAA修煤气灶刘哥4 小时前
缓存世界的三座大山:穿透、击穿、雪崩,今天就把它们铲平!
redis·分布式·后端
失散135 小时前
分布式专题——4 大厂生产级Redis高并发分布式锁实战
java·redis·分布式·缓存·架构
eqwaak06 小时前
科技信息差(9.10)
网络·人工智能·分布式·ar·智能硬件
一个帅气昵称啊6 小时前
C#,RabbitMQ从入门到精通,.NET8.0(路由/分布式/主题/消费重复问题 /延迟队列和死信队列/消息持久化 )/RabbitMQ集群模式
分布式·微服务·架构·rabbitmq·.net
长相易乐6 小时前
RabbitMQ 教程
分布式·rabbitmq
zhysunny6 小时前
消息三剑客华山论剑:Kafka vs RabbitMQ vs RocketMQ
kafka·rabbitmq·rocketmq
月夕·花晨7 小时前
Gateway -网关
java·服务器·分布式·后端·spring cloud·微服务·gateway