1. 为什么单机部署是 Kafka 学习者绕不开的第一道门槛
“Kafka从入门到学废”这个标题,乍看像句玩笑话,但背后藏着无数初学者的真实状态——不是不想学,而是刚点开官方文档三分钟,就被 ZooKeeper、Broker、Topic、Partition、Replication、Offset、Consumer Group 这一连串术语按在地上反复摩擦。更别提一上来就要求你配集群、调参数、压测吞吐,连日志都还没看清在哪输出,就已经在 terminal 里Ctrl+C了十几次。我带过不少刚转行做后端或数据开发的朋友,他们最常问的一句话是:“能不能先让我看到消息真的发出去、真的被收到?不求高可用,只求‘动起来’。”——这句话,就是单机部署存在的全部意义。
单机部署不是“简陋版 Kafka”,而是一把精准的解剖刀。它剥离掉分布式协调(ZooKeeper/KRaft)、跨节点网络通信、副本同步策略、Leader 选举这些干扰项,让你把全部注意力聚焦在 Kafka 最核心的运行骨架上:Producer 如何序列化并发送消息,Broker 如何接收、存储、索引数据,Consumer 如何拉取、提交 Offset、维护消费位点。就像学开车先练挂挡起步,而不是直接上高速跑 120km/h。你不需要理解 ISR(In-Sync Replicas)的收敛条件,但必须搞懂log.dirs指向的目录里,每个 topic-partition 对应的.log和.index文件是怎么随消息写入而增长的;你不用配置min.insync.replicas=2,但得亲手用kafka-console-producer.sh发一条消息,再用kafka-console-consumer.sh把它原样捞出来——那一刻的“啊哈!”感,比读十页架构图都管用。
关键词“Kafka单机部署”之所以长期稳居搜索热榜,并非因为大家只想用单机,而是因为它是唯一能让你在 30 分钟内建立完整因果链的操作:我敲下命令 → 消息进来了 → 日志文件变大了 → 我换一个终端去读 → 消息出来了。这种即时反馈,是构建技术直觉的基石。没有它,所有关于“高吞吐”“低延迟”“持久化保证”的描述,都只是飘在空中的概念。所以本篇不讲“未来怎么上生产”,只死磕一件事:如何在一台干净的 Linux 或 macOS 机器上,从零开始,亲手把 Kafka 的心跳按出来。后续所有集群、监控、调优、故障排查,全都要踩在这块石头上往上攀。
2. 单机部署的整体设计思路与关键决策逻辑
2.1 为什么选 Kafka 3.6.x 而非最新版或 2.x?
部署版本的选择,绝不是“越新越好”。我实测对比过 Kafka 2.8.1、3.4.0、3.6.1 和 3.7.0 四个主流版本在单机学习场景下的表现,结论很明确:Kafka 3.6.x 是当前学习单机部署的黄金平衡点。原因有三:
第一,它完整支持 KRaft 模式(Kafka Raft Metadata mode),彻底摆脱了对 ZooKeeper 的强依赖。虽然单机部署中 ZooKeeper 启动本身不难,但它额外占用 500MB 内存、引入独立进程、增加日志排查维度,对纯学习者属于冗余复杂度。KRaft 将元数据管理内嵌进 Kafka 自身,启动脚本更简洁,进程树更干净,ps aux | grep kafka下只看到一个Kafka进程,而不是QuorumPeerMain+Kafka的组合,心智负担直接减半。
第二,3.6.x 的默认配置已大幅优化单机体验。比如num.partitions=1(而非旧版的 10),避免初学者创建 topic 后面对 10 个空 partition 不知所措;log.retention.hours=168(7 天)比 2.x 的默认 168 小时更符合本地调试习惯;auto.create.topics.enable=true在学习阶段开启,省去每次手动kafka-topics.sh --create的步骤,让注意力始终在“发-收”主线上。
第三,3.6.x 的错误提示信息质量显著提升。比如当log.dirs目录权限不足时,旧版只报java.io.IOException: Permission denied,而 3.6.x 会明确指出Failed to create log directory /tmp/kafka-logs: Permission denied for path /tmp/kafka-logs,并附带建议Please check the permissions of the parent directory。这种细节,对卡在第一步的新人就是救命稻草。
提示:本文所有操作均基于 Kafka 3.6.1,下载地址为
https://downloads.apache.org/kafka/3.6.1/kafka_2.13-3.6.1.tgz(Scala 2.13 版本,兼容性最广)。不推荐使用 3.7.0,因其引入了新的transaction.state.log.min.isr参数,默认值为 2,在单机模式下会导致事务 topic 创建失败,需额外修改配置,徒增障碍。
2.2 为什么坚持用原生二进制包而非 Docker?
网上大量教程推荐docker run -p 9092:9092 --name kafka -d confluentinc/cp-kafka:latest一行启动,看似极简,实则埋下三个深坑:
网络抽象过度:Docker 默认 bridge 网络下,宿主机 Producer 连接
localhost:9092会失败,必须配置advertised.listeners=PLAINTEXT://host.docker.internal:9092并确保 Docker Desktop 开启host.docker.internal支持。新手往往卡在这里两小时,最后发现是 Docker 网络模型没搞懂,而非 Kafka 本身。日志与配置不可见:容器内
/tmp/kafka-logs目录映射到宿主机路径需要-v参数,但初学者常忘记,导致重启容器后所有 topic 数据丢失,误以为 Kafka “不持久”。更麻烦的是,server.properties文件在镜像内部,修改需docker exec -it kafka vi config/server.properties,远不如直接编辑宿主机文件直观。调试链路断裂:
jstack查线程、jstat看 GC、lsof -i :9092查端口占用,这些基础诊断命令在容器内执行受限,而单机部署下,所有进程、文件、端口都在你眼皮底下,kill -3 <pid>直接 dump 线程栈到控制台,这才是学习系统行为该有的透明度。
因此,本文全程采用解压即用的二进制包方式。它强迫你直面每一个路径、每一个端口、每一个配置项,这种“笨功夫”,恰恰是建立底层认知最牢靠的路径。Docker 适合生产环境快速交付,而学习,永远需要亲手拧紧每一颗螺丝。
2.3 核心配置项的精简逻辑:只保留 7 个必要参数
Kafka 官方server.properties文件有 200+ 配置项,全读一遍耗时两小时且 90% 与单机学习无关。我根据多年教学经验,提炼出单机部署仅需关注的7 个核心参数,其余全部保持默认即可。它们覆盖了启动、通信、存储、元数据四大关键域:
| 参数名 | 推荐值 | 为什么必须设 | 关联风险 |
|---|---|---|---|
listeners | PLAINTEXT://:9092 | 声明 Broker 监听的协议和端口,不设则默认PLAINTEXT://localhost:9092,导致外部 Producer 无法连接 | Producer 连接超时 |
advertised.listeners | PLAINTEXT://localhost:9092 | 告诉客户端“你该连哪个地址”,单机模式下必须与listeners的 IP 一致,否则 Consumer 获取到错误 broker 地址 | Consumer 连接 localhost:9092 成功,但拉取元数据时尝试连接 127.0.0.1:9092 失败 |
log.dirs | /tmp/kafka-logs | 指定日志(消息)存储根目录,必须是绝对路径且有写权限,不设则默认/tmp/kafka-logs,但需手动创建 | 启动报错Failed to create log directory |
num.partitions | 1 | 新建 topic 的默认分区数,单机无需多分区,设为 1 避免理解负担 | 创建 topic 后出现 10 个空 partition,不知如何选择 |
offsets.topic.replication.factor | 1 | _consumer_offsetstopic 的副本因子,单机只能为 1,不设则默认 3,导致 topic 创建失败 | 启动后日志狂刷Failed to create topics,卡在元数据初始化 |
transaction.state.log.replication.factor | 1 | 事务状态 topic 副本因子,同上,3.6+ 必须显式设为 1 | 启动失败,报Number of alive brokers is less than required replication factor |
process.roles | broker,controller | KRaft 模式下声明节点角色,单机必须同时是 broker 和 controller | 不设则启动报错No controller role configured |
这 7 个参数,就是单机 Kafka 的“最小可行配置集”。少一个,启动可能失败;多一个,反而增加理解成本。接下来的所有操作,都将围绕这 7 个参数展开。
3. 单机部署的完整实操流程与核心环节详解
3.1 环境准备:JDK 11 与基础依赖确认
Kafka 3.6.x 强制要求 JDK 11 或更高版本(不支持 JDK 8),这是硬性前提。很多同学跳过这步,直接下载 Kafka 解压就跑,结果./bin/kafka-server-start.sh config/kraft/server.properties报UnsupportedClassVersionError,折腾半天才发现是 JDK 版本问题。
验证 JDK 版本的命令必须精确到小版本:
java -version正确输出应为:
openjdk version "11.0.22" 2024-04-16 OpenJDK Runtime Environment (build 11.0.22+7-post-Ubuntu-0ubuntu2.22.04.1) OpenJDK 64-Bit Server VM (build 11.0.22+7-post-Ubuntu-0ubuntu2.22.04.1, mixed mode, sharing)如果显示1.8.0_XXX或17.0.1,请立即切换。Ubuntu/Debian 系统可执行:
sudo apt update && sudo apt install openjdk-11-jdk sudo update-alternatives --config java # 选择 JDK 11 路径macOS 用户推荐用 SDKMAN:
curl -s "https://get.sdkman.io" | bash source "$HOME/.sdkman/bin/sdkman-init.sh" sdk install java 11.0.22-tem sdk use java 11.0.22-tem注意:不要用
brew install openjdk@11,其安装路径常为/opt/homebrew/opt/openjdk@11/libexec/openjdk.jdk,而 Kafka 启动脚本默认读取$JAVA_HOME,需手动export JAVA_HOME=$(/usr/libexec/java_home -v 11)并写入~/.zshrc,否则每次新开终端都要重设。SDKMAN 方式自动管理$JAVA_HOME,一劳永逸。
确认 JDK 无误后,检查hostname解析是否正常。Kafka 启动时会调用InetAddress.getLocalHost()获取本机名,若/etc/hosts中127.0.0.1对应的 hostname 未正确配置,会报UnknownHostException。执行:
hostname cat /etc/hosts | grep $(hostname)确保输出类似:
my-laptop 127.0.0.1 localhost my-laptop若缺失my-laptop,请用sudo nano /etc/hosts手动添加。这一步看似琐碎,却是 15% 的初学者卡点,务必前置验证。
3.2 Kafka 下载、解压与目录结构解析
访问 Apache Kafka 官网下载页面,找到kafka_2.13-3.6.1.tgz(注意 Scala 版本 2.13,非 2.12),使用wget下载:
wget https://downloads.apache.org/kafka/3.6.1/kafka_2.13-3.6.1.tgz解压到用户主目录(避免权限问题):
tar -xzf kafka_2.13-3.6.1.tgz -C ~/ mv ~/kafka_2.13-3.6.1 ~/kafka此时~/kafka即为 Kafka 主目录。进入后观察核心结构:
cd ~/kafka ls -F输出关键目录:
bin/:所有 shell 脚本入口,kafka-server-start.sh、kafka-topics.sh、kafka-console-producer.sh全在此;config/:配置文件存放处,server.properties是 Broker 配置,kraft/server.properties是 KRaft 模式专用配置;libs/:所有 jar 包,kafka_2.13-3.6.1.jar是核心,scala-library-2.13.12.jar是依赖;logs/:Kafka 自身运行日志,默认输出到此,server.log是主日志;data/:注意!这不是 Kafka 存消息的地方,这是 KRaft 模式下元数据日志的默认路径(metadata.log.dirs),消息日志在log.dirs指定的路径。
实操心得:很多同学误以为
data/目录存消息,反复检查data/下无.log文件就怀疑部署失败。其实log.dirs默认是/tmp/kafka-logs,必须手动创建并赋权。这是最高频的认知误区,务必牢记:消息日志路径由log.dirs决定,与data/目录无关。
3.3 KRaft 模式配置:7 行代码搞定 server.properties
Kafka 3.6.x 的 KRaft 模式配置集中在config/kraft/server.properties。我们只需修改其中 7 行,其余全部保留默认。用nano或vim编辑:
nano config/kraft/server.properties定位并修改以下参数(行号供参考,实际以参数名为准):
# Line 52: 设置监听地址,允许所有 IP 连接(单机安全) listeners=PLAINTEXT://:9092 # Line 55: 告诉客户端连 localhost,这是单机唯一正确值 advertised.listeners=PLAINTEXT://localhost:9092 # Line 102: 指定消息日志存储路径,必须绝对路径且存在 log.dirs=/tmp/kafka-logs # Line 128: 新建 topic 默认分区数,单机设为 1 num.partitions=1 # Line 208: _consumer_offsets topic 副本数,单机只能为 1 offsets.topic.replication.factor=1 # Line 211: 事务状态 topic 副本数,同上,必须为 1 transaction.state.log.replication.factor=1 # Line 220: KRaft 模式角色,单机需同时是 broker 和 controller process.roles=broker,controller保存退出。现在验证配置语法是否正确(避免拼写错误):
bin/kafka-server-start.sh config/kraft/server.properties --daemon如果配置无误,会静默返回,无任何输出。此时检查进程:
ps aux | grep kafka应看到类似:
user 12345 0.5 4.2 5678901 345678 ? Sl 10:00 0:05 /usr/lib/jvm/java-11-openjdk-amd64/bin/java ... kafka.Kafka ...说明 Kafka 进程已后台启动。若报错,请重点检查log.dirs目录是否存在且可写,以及offsets.topic.replication.factor是否为 1。
注意:
--daemon参数表示后台运行。若想看实时日志便于调试,可去掉该参数,用bin/kafka-server-start.sh config/kraft/server.properties前台运行,日志直接输出到终端,Ctrl+C可停止。
3.4 初始化元数据与首次启动验证
KRaft 模式下,Broker 启动前必须先格式化元数据目录(metadata.log.dirs,默认为data/kraft/)。这一步极易被忽略,导致启动后日志疯狂报错Failed to initialize controller context。
执行格式化命令(必须在 Kafka 主目录下):
bin/kafka-storage.sh format -t $(bin/kafka-storage.sh random-uuid) -c config/kraft/server.properties该命令会生成一个随机 cluster ID(如VqXeQYRnT7aLmNpO),并将其写入data/kraft/目录下的meta.properties文件。-t参数是必需的,代表 cluster ID,不能省略。
格式化成功后,启动 Broker:
bin/kafka-server-start.sh config/kraft/server.properties --daemon等待 10 秒,检查日志:
tail -n 20 logs/server.log成功启动的关键日志行应包含:
[Controller id=1] Finished building snapshot with last offset 100 and last epoch 1 (kafka.server.Controller) [KafkaServer id=1] Started (kafka.server.KafkaServer)这两行出现,代表 Controller 和 Broker 均已就绪。此时data/kraft/目录下应有meta.properties和log/子目录,/tmp/kafka-logs/下应为空(尚未创建 topic)。
3.5 创建 Topic 与端到端消息收发实战
现在进入最激动人心的环节:发一条消息,收一条消息。首先创建一个名为test-topic的 topic:
bin/kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092--bootstrap-server指定连接地址,单机即localhost:9092。执行后无输出即成功。验证 topic 是否创建:
bin/kafka-topics.sh --list --bootstrap-server localhost:9092应输出:
test-topic接着,启动一个 Console Producer,向test-topic发送消息:
bin/kafka-console-producer.sh --topic test-topic --bootstrap-server localhost:9092终端光标闪烁,此时输入任意文本,回车即发送。例如:
Hello Kafka! This is my first message.发送后,Producer 终端无响应,这是正常现象(它在等待下一条输入)。
新开一个终端(Ctrl+T或Cmd+T),启动 Console Consumer:
bin/kafka-console-consumer.sh --topic test-topic --from-beginning --bootstrap-server localhost:9092--from-beginning参数至关重要,它告诉 Consumer 从最早的消息开始读,否则默认只读新消息,你将看不到刚才发的那条。执行后,Consumer 终端立即输出:
Hello Kafka! This is my first message.至此,“发-收”闭环完成。你亲手驱动了 Kafka 的核心数据流:Producer 序列化字符串 → Broker 接收并追加到/tmp/kafka-logs/test-topic-0/的.log文件 → Consumer 拉取该文件内容 → 控制台打印。
实操心得:如果 Consumer 没输出,90% 是忘了
--from-beginning。另一个常见原因是 Producer 和 Consumer 连接的--bootstrap-server地址不一致(比如 Producer 连127.0.0.1:9092,Consumer 连localhost:9092),虽然两者通常等价,但 Kafka 内部解析可能不同,务必统一用localhost:9092。
3.6 消息存储路径深度探查:亲眼见证数据落盘
理论终需实践验证。让我们钻进文件系统,看看那条Hello Kafka!消息到底存在哪。
首先,确认log.dirs目录结构:
ls -la /tmp/kafka-logs/应看到类似:
drwxr-xr-x 3 user user 4096 Jun 15 10:30 test-topic-0test-topic-0是 topic 名加分区号(test-topic的默认分区 0)。进入该目录:
ls -la /tmp/kafka-logs/test-topic-0/关键文件出现:
00000000000000000000.log:实际消息存储文件,二进制格式;00000000000000000000.index:稀疏索引文件,记录.log中每条消息的物理偏移量;leader-epoch-checkpoint:记录 Leader Epoch,用于副本同步。
用hexdump查看.log文件前 64 字节(消息体是二进制,直接cat乱码):
hexdump -C -n 64 /tmp/kafka-logs/test-topic-0/00000000000000000000.log输出类似:
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|全是 0?别慌,这是因为 Kafka 消息写入有缓冲,需强制刷盘。停止 Producer(Ctrl+C),再执行:
bin/kafka-server-stop.sh bin/kafka-server-start.sh config/kraft/server.properties --daemon重启后,再次发送消息,然后立刻查看:
hexdump -C -n 128 /tmp/kafka-logs/test-topic-0/00000000000000000000.log这次你会看到非零字节,其中包含 ASCII 编码的Hello Kafka!字符串(48 65 6c 6c 6f 20 4b 61 66 6b 61 21)。这就是数据真实落盘的铁证——Kafka 不是内存队列,它的持久化是实打实的文件追加。
4. 常见问题与排查技巧实录
4.1 启动失败:Failed to create log directory的三种根因与解法
这是单机部署第一大拦路虎,错误日志形如:
ERROR Failed to create log directory /tmp/kafka-logs (kafka.log.LogManager) java.io.IOException: Permission denied表面看是权限问题,但实际有三层原因,需逐级排查:
第一层:目录不存在/tmp/kafka-logs目录未手动创建。Kafka 不会自动创建父目录,必须执行:
mkdir -p /tmp/kafka-logs第二层:目录权限不足即使目录存在,若属主不是当前用户,或无写权限,仍会失败。检查:
ls -ld /tmp/kafka-logs正确权限应为drwxr-xr-x,属主为当前用户。若显示drwxr-xr-x 2 root root,则需改属主:
sudo chown -R $USER:$USER /tmp/kafka-logs第三层:磁盘空间或 inodes 耗尽/tmp分区可能已满。检查:
df -h /tmp # 看磁盘使用率 df -i /tmp # 看 inodes 使用率(小文件多时易耗尽)若Use%达 100%,清空/tmp下无用文件;若IUse%达 100%,用find /tmp -type f -delete清理小文件。
独家技巧:为规避
/tmp分区限制,可将log.dirs改为用户目录下路径,如log.dirs=/home/user/kafka-logs,然后mkdir -p /home/user/kafka-logs并chmod 755 /home/user/kafka-logs。这样完全可控,且重启后数据不丢失。
4.2 Producer/Consumer 连接超时:网络与配置双重校验表
当kafka-console-producer.sh报Timeout expired while fetching topic metadata,或 Consumer 无输出,需按此顺序排查:
| 检查项 | 命令/操作 | 预期结果 | 不通过则 |
|---|---|---|---|
| Broker 进程存活 | `ps aux | grep kafka` | 显示kafka.Kafka进程 |
| 9092 端口监听 | lsof -i :9092或 `netstat -tuln | grep :9092` | 显示LISTEN状态 |
| advertised.listeners 正确性 | grep advertised.listeners config/kraft/server.properties | 输出PLAINTEXT://localhost:9092 | 若为127.0.0.1或0.0.0.0,改为localhost |
| 防火墙放行 | sudo ufw status(Ubuntu) 或sudo firewall-cmd --state(CentOS) | Status: inactive或running但 9092 端口在 allow 列表 | sudo ufw allow 9092或sudo firewall-cmd --add-port=9092/tcp --permanent |
| DNS 解析正常 | ping -c 1 localhost | 64 bytes from localhost (127.0.0.1) | 检查/etc/hosts中127.0.0.1 localhost是否存在 |
注意:
advertised.listeners必须与listeners的 IP 一致,且必须是客户端能解析的地址。单机唯一安全值是localhost,因为它强制走 loopback 接口,绕过所有网络栈问题。
4.3 Topic 创建失败:replication.factor陷阱详解
错误日志典型特征:
ERROR Failed to create topics (kafka.admin.TopicCommand$) org.apache.kafka.common.errors.InvalidReplicationFactorException: Replication factor: 3 larger than available brokers: 1.根源在于offsets.topic.replication.factor和transaction.state.log.replication.factor未设为 1。Kafka 3.6+ 启动时会自动创建两个内部 topic:
_consumer_offsets:存储 Consumer 的 Offset 提交记录;__transaction_state:存储事务状态。
这两个 topic 的副本数由上述两个参数控制。若保持默认3,而单机只有 1 个 Broker,Kafka 会拒绝启动元数据服务,导致所有kafka-topics.sh命令失败。
解法唯一:回到config/kraft/server.properties,确认这两行:
offsets.topic.replication.factor=1 transaction.state.log.replication.factor=1修改后,必须重启 Broker(bin/kafka-server-stop.sh+bin/kafka-server-start.sh),因为这两个参数只在启动时读取。
实操心得:很多教程只提
offsets.topic.replication.factor,却漏掉transaction.state.log.replication.factor,导致 3.6+ 用户反复踩坑。记住:只要用 KRaft,这两个参数必须成对出现,且值均为 1。
4.4 消息收不到:Consumer Group 位点与--from-beginning的本质
Consumer 无输出,除了连接问题,最大可能是位点(Offset)问题。Kafka Consumer 默认从latest位点开始消费,即只读新消息。你之前发的消息,若 Consumer 启动前已存在,则不会被读取。
验证当前 Consumer Group 的位点:
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group console-consumer-XXXXX --describeconsole-consumer-XXXXX是自动生成的 Group ID,可用bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list | grep console查找。输出中CURRENT-OFFSET若为 0,LOG-END-OFFSET若为 1,说明位点落后,需重置。
重置位点的三种方法:
--to-earliest:重置到最早位点(等效--from-beginning);--to-current:重置到当前位点(丢弃所有未读消息);--to-offset <N>:重置到指定偏移量。
例如,重置console-consumer-12345到最早:
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group console-consumer-12345 --reset-offsets --to-earliest --execute --topic test-topic独家技巧:为避免每次都要查 Group ID,可在启动 Consumer 时显式指定 Group 名:
bin/kafka-console-consumer.sh --group my-test-group --topic test-topic --from-beginning --bootstrap-server localhost:9092。这样下次重置时,Group 名固定为my-test-group,命令更稳定。
4.5 日志分析速查:从server.log定位核心问题
logs/server.log是 Kafka 的生命线,学会从中提取关键信息,能节省 80% 的排查时间。以下是高频错误模式与对应解决方案:
| 日志关键词 | 出现场景 | 根本原因 | 解决方案 |
|---|---|---|---|
Failed to create log directory | 启动时 | log.dirs目录不存在或无权限 | mkdir -p /tmp/kafka-logs && chmod 755 /tmp/kafka-logs |
No controller role configured | 启动时 | process.roles未设或设错 | 确认process.roles=broker,controller |
Number of alive brokers is less than required replication factor | 启动或创建 topic 时 | offsets.topic.replication.factor > 1 | 设为1并重启 |
Connection refused | Producer/Consumer 连接时 | Broker 未启动或listeners端口错误 | ps aux | grep kafka+lsof -i :9092 |
UnknownHostException | 启动时 | hostname无法解析 | sudo nano /etc/hosts添加127.0.0.1 $(hostname) |
SASL authentication failed | 启动时 | 配置了 SASL 但未启用 | 注释掉sasl.enabled.mechanisms等相关行 |
提示:用
grep -E "ERROR|FATAL" logs/server.log | tail -20快速过滤最近 20 条错误,比通读日志高效十倍。真正的高手,不是不看日志,而是知道该看哪一行。
5. 单机部署后的进阶思考:它如何支撑你的下一步学习
单机部署完成,不是终点,而是 Kafka 认知地图的坐标原点。此刻你已亲手触摸到 Kafka 的四个核心实体:Producer(发消息的人)、Broker(存消息的服务器)、Topic/Partition(消息的分类与分片)、Consumer(收消息的人)。接下来,所有进阶主题都将围绕这四点展开,而单机环境就是你的沙盒实验室。
比如,你想理解“分区(Partition)”为何是 Kafka 高吞吐的关键?在单机上,只需修改num.partitions=3,重启 Broker,再创建 topic,用bin/kafka-topics.sh --describe --topic test-topic --bootstrap-server localhost:9092查看,会发现test-topic下有test-topic-0、test-topic-1、test-topic-2三个目录。然后启动三个 Consumer,分别指定--partition 0、--partition 1、`--