4. 日志采集架构概述:Agent-based vs Agentless
聊到日志采集,大家第一个面临的选择就是:到底装不装 Agent?
这个决策直接影响后续的运维成本、采集质量和故障排查效率。我见过不少团队,一开始图省事选了轻量方案,结果半年后发现日志丢了一批又一批,回头又补上 Agent。也有团队一上来就铺 Agent,结果被安全部门怼了一顿——"你在我的生产服务器上装第三方进程?"
所以这一章,咱们把两种架构掰开揉碎讲清楚。你不光要知道它们怎么工作,还得知道什么场景该选哪个。
4.1 Agent-based 架构
所谓 Agent-based,就是在每台目标机器上安装一个独立的采集进程。这个进程负责读日志文件、解析格式、做简单过滤,然后发给中央采集服务。
说白了,就是派一个"哨兵"守在每个机器上。我个人的习惯是,只要条件允许,优先选 Agent-based。为什么?因为它可控。
- 采集能力强——本地直接读文件,不依赖网络协议转换,什么格式都能解析。
- 离线缓存——网络断了或服务挂了,Agent 先把日志存在本地,恢复后继续传。
- 资源隔离好——采集进程独立运行,不影响业务进程。
- 安全边界清晰——Agent 只需要往外发数据,不需要外部主动连进来。
我在一家金融公司干过,他们的核心交易系统要求每笔日志必须 100% 采集。当时用了 Filebeat + Kafka 的 Agent 方案。上线后确实稳,机器重启、网络抖动都没丢过一条日志。但代价是每台服务器得多占 200MB 内存和一个 CPU 核。这个账你得算清楚。
4.2 Agentless 架构
Agentless 正好反过来——不在目标机器上装任何东西。采集端通过网络协议去拉取日志。常见的方式有 SSH 拉取、Syslog 接收、HTTP API 轮询,或者直接读共享存储上的日志文件。
你想想看,如果你要采集 200 台容器的日志,每台都装 Agent,镜像体积暴增,运维复杂度也上去了。Agentless 在这时候就有优势了。
- 零部署——不需要在业务机器上装软件,审批流程短。
- 适合临时场景——排查问题时临时拉一下日志,用完就撤。
- 对业务零侵入——业务团队完全感知不到采集的存在。
- 集中管控——所有采集策略都在中央服务器配,不用挨个登录目标机。
但 Agentless 不是没有代价。我记得有一次用 SSH 拉取方式采集 500 台机器的应用日志,结果采集服务器成了瓶颈——SSH 连接数太多,CPU 打满,日志延迟越来越严重。后来被迫改成批量拉取+压缩传输,才勉强顶住。
4.3 核心对比
光说概念不够,咱们直接上表。我列出了几个关键维度,你在做技术选型时可以拿这张表当 checklist 来用。
| 对比维度 | Agent-based | Agentless |
|---|---|---|
| 部署方式 | 每台目标机器安装独立进程 | 中心化采集,目标机无需装软件 |
| 资源消耗 | 占用目标机 CPU / 内存 / 磁盘 | 消耗集中在采集服务器 |
| 采集能力 | 支持任意格式,可做预处理 | 依赖协议能力,格式受限 |
| 数据可靠性 | 本地缓存,断网不丢数据 | 网络中断可能导致数据丢失 |
| 安全管控 | Agent 只向外发,攻击面小 | 需要开放端口 / 凭证,风险较高 |
| 运维复杂度 | 需要管理 Agent 版本和配置 | 只需维护采集中心 |
| 适用场景 | 生产核心系统、高频采集、合规审计 | 容器环境、临时排查、低频采集 |
这张表你看完应该心里有数了。两种方式不是谁替代谁,而是互补的。我在同一家公司里经常两套都上——核心业务用 Agent,边缘服务和容器用 Agentless,各取所长。
4.4 选型指南
那到底怎么选?我给你几个可操作的判断标准:
- 看数据量——日均日志量超过 10GB/台,上 Agent。低于这个量,Agentless 也能扛。
- 看可靠性要求——审计日志一条不能丢?必须 Agent,带本地缓存那种。
- 看运维人力——团队只有两个人管 1000 台机器?Agentless 能省掉大量版本管理工作。
- 看安全合规——金融、医疗等强监管行业,Agent 方案更容易通过审计,因为数据不出域、链路可控。
- 看环境类型——物理机 / 虚拟机用 Agent,K8s 容器优先考虑 Agentless 或 DaemonSet 方式。
我的一个经验法则:如果你不确定选哪个,先上 Agentless 做快速验证。等确认日志量大了、格式复杂了,再逐步迁移到 Agent。不要一上来就铺 Agent,后面改架构的成本很高。
最后说一句大实话:没有完美的架构,只有适合你的架构。你公司的基础设施水平、团队运维能力、业务对日志的依赖程度,这三个变量决定了最终答案。别照搬别人的方案,回到你自己的环境里做验证。