导读:本期聚焦于徐致远创作的《如何在Ubuntu上部署Kafka日志总线并实现高性能日志采集?》,敬请观看详情。系统日志分散在多台机器上难以统一分析,是运维工作中常见的痛点。本文介绍如何在Ubuntu环境下部署Kafka,搭建一条稳定可靠的日志总线,将各类应用日志集中投递到消息队列中,再对接下游的消费与分析程序。内容涵盖Kafka与ZooKeeper的关系说明、单机部署的完整步骤、主题创建与生产消费测试,以及结合Filebeat把业务日志实时推送到Kafka的实践方案,帮助读者快速落地一套可扩展的日志收集架构。

当服务器数量从三五台增长到几十台时,登录每台机器去翻日志 becomes 一件让人崩溃的事情。搭建一条日志总线,把所有机器上的日志实时汇聚到统一的队列里,是解决日志分散问题的经典做法。Kafka凭借高吞吐、可持久化、天然支持多消费者的特性,成为日志总线场景的首选组件。本文以Ubuntu 22.04为例,完整演示从零部署Kafka到接入Filebeat日志采集的全过程。

如何在Ubuntu上部署Kafka日志总线并实现高性能日志采集?

一、部署前的准备:理解Kafka与ZooKeeper的关系

很多新手在部署Kafka时容易混淆ZooKeeper的角色。简单来说,Kafka集群本身的元数据(比如有哪些Broker、哪些主题、分区副本分布情况)需要一个协调服务来维护,早期版本中这个角色由ZooKeeper承担。Kafka从3.x版本开始引入KRaft模式,可以脱离ZooKeeper独立运行,部署复杂度明显降低。

本文两种方式都会提到,但推荐新部署的环境直接使用KRaft模式,减少一个组件就少一分运维成本。如果你的团队还在维护老版本集群,了解ZooKeeper方式的原理依然有价值。

部署前需要确认环境:Ubuntu系统建议20.04以上版本,内存至少2GB(Kafka是吃内存的大户,JVM堆建议1GB起步),磁盘空间预留10GB以上,并确保Java环境已就绪。可以先执行以下命令检查和安装Java:

sudo apt update
sudo apt install openjdk-11-jdk -y
java -version
# 输出类似:openjdk version "11.0.x"

另外建议提前规划好Kafka的安装目录,比如/opt/kafka,并创建一个专用用户来运行Kafka服务,避免直接用root操作带来的安全隐患。

二、下载安装与单机部署实战

访问Kafka官方下载页面获取二进制包,选择Scala 2.13对应的Binary版本。国内网络环境下载较慢的话,可以先在本地下载再通过scp上传到服务器。下载完成后解压到规划好的目录:

cd /tmp
wget https://archive.apache.org/dist/kafka/3.6.0/kafka_2.13-3.6.0.tgz
sudo tar -zxf kafka_2.13-3.6.0.tgz -C /opt/
sudo mv /opt/kafka_2.13-3.6.0 /opt/kafka
sudo mkdir -p /opt/kafka/data  # Kafka日志数据目录

接下来修改配置文件/opt/kafka/config/kraft/server.properties,几个关键参数需要注意。log.dirs指定数据存储路径,建议改成独立的数据目录而非默认的/tmp,防止系统清理临时目录导致数据丢失;advertised.listeners必须填写其他机器能访问到的IP地址,这是新手最常踩的坑之一,如果配置成localhost,客户端从别的机器连接时会出现连接超时。

process.roles=broker,controller
listeners=PLAINTEXT://0.0.0.0:9092
advertised.listeners=PLAINTEXT://192.168.1.100:9092
log.dirs=/opt/kafka/data
controller.quorum.voters=1@192.168.1.100:9093

KRaft模式需要先格式化存储目录,这一步会生成集群的唯一ID。然后就可以启动服务并验证了:

# 生成集群ID并格式化
KAFKA_CLUSTER_ID=$(/opt/kafka/bin/kafka-storage.sh random-uuid)
/opt/kafka/bin/kafka-storage.sh format -t $KAFKA_CLUSTER_ID \
  -c /opt/kafka/config/kraft/server.properties

# 启动Kafka
/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/kraft/server.properties

# 验证进程
jps | grep Kafka
# 查看端口监听
ss -tlnp | grep 9092

为了方便开机自启,建议编写一个systemd服务单元,将Kafka纳入系统服务管理。创建/etc/systemd/system/kafka.service文件,内容如下:

[Unit]
Description=Apache Kafka Server
After=network.target

[Service]
Type=forking
User=kafka
ExecStart=/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/kraft/server.properties
ExecStop=/opt/kafka/bin/kafka-server-stop.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target

写完后执行sudo systemctl daemon-reload和sudo systemctl enable kafka即可。这样服务器重启后Kafka会自动拉起,不用担心半夜宕机后没人手动启动服务。

三、创建主题并完成生产消费测试

Kafka启动成功后,先创建一个专用于日志的主题。日志场景下分区数可以适当多一些,比如6个分区,这样后续增加消费者时能并行消费,提升吞吐:

# 创建日志主题,6个分区,副本因子1(单机环境)
/opt/kafka/bin/kafka-topics.sh --create \
  --bootstrap-server 192.168.1.100:9092 \
  --topic app-logs \
  --partitions 6 \
  --replication-factor 1

# 查看主题列表和详情
/opt/kafka/bin/kafka-topics.sh --list --bootstrap-server 192.168.1.100:9092
/opt/kafka/bin/kafka-topics.sh --describe --topic app-logs --bootstrap-server 192.168.1.100:9092

主题创建好后,开两个终端窗口做一次端到端验证。一个终端启动控制台消费者,另一个终端用生产者发送几条测试消息,如果消费者能实时打印出消息内容,说明整条链路已经打通:

# 终端1:消费日志主题
/opt/kafka/bin/kafka-console-consumer.sh \
  --bootstrap-server 192.168.1.100:9092 \
  --topic app-logs --from-beginning

# 终端2:发送测试消息
/opt/kafka/bin/kafka-console-producer.sh \
  --bootstrap-server 192.168.1.100:9092 \
  --topic app-logs
>hello kafka log bus
>test message 002

四、接入Filebeat把业务日志实时投递到Kafka

Kafka本身不采集日志,需要配合采集器把应用日志推送进来。Filebeat是轻量级日志采集工具,资源占用小,和Kafka配合是日志总线中最常见的组合。在业务服务器上安装Filebeat:

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.11.0-amd64.deb
sudo dpkg -i filebeat-8.11.0-amd64.deb

安装后编辑/etc/filebeat/filebeat.yml,核心配置分两块:inputs部分声明要监控的日志路径,outputs部分指定Kafka的地址和主题。这里用一个简单直接的配置,按服务名区分主题:

filebeat.inputs:
  - type: log
    enabled: true
    paths:
      - /var/log/myapp/*.log
    fields:
      service: myapp
    fields_under_root: true

output.kafka:
  hosts: ["192.168.1.100:9092"]
  topic: "app-logs"
  required_acks: 1
  compression: gzip
  bulk_max_size: 1024

配置中的compression: gzip开启压缩传输,能显著降低跨机房传输时的带宽消耗;bulk_max_size控制批量发送的消息数,日志量大时适当调大可以提升吞吐。配置完成后启动Filebeat并查看状态:

sudo systemctl enable --now filebeat
sudo filebeat test output   # 测试与Kafka的连通性
# 在Kafka端观察消息是否到达
/opt/kafka/bin/kafka-console-consumer.sh \
  --bootstrap-server 192.168.1.100:9092 \
  --topic app-logs --from-beginning --max-messages 5

如果一切正常,消费者会输出Filebeat推送过来的JSON格式日志,包含消息内容、来源文件路径、时间戳等字段。至此,一条完整的日志总线就搭建完成了:业务机器上的Filebeat负责采集和推送,Kafka作为缓冲层削峰填谷,下游可以同时接入Logstash做解析、接入Flink做实时计算、或者归档到数据仓库,多个消费组互不干扰。

最后提几个生产环境的注意事项:第一,单机部署仅适合测试或小规模场景,生产环境至少部署3节点集群并设置副本因子为3,保证单点故障时数据不丢;第二,根据日志保留周期设置log.retention.hours参数,避免磁盘被撑爆;第三,做好Kafka端口的访问控制,PLAINTEXT明文协议在内网可以接受,跨网络传输务必配置SASL认证和SSL加密。把这三点处理好,这条日志总线就能长期稳定地支撑你的日志收集工作了。

Kafka部署Ubuntu日志系统日志总线修改时间:2026-09-16 09:06:46

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/0916/57844.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。