1. 数据采集系统概述:架构演进、核心组件、常见数据源类型与采集模式

1.1 从单机到分布式:架构演进之路

数据采集系统,说白了就是帮我们把散落在各处的数据「搬」到统一平台的那套东西。我入行那会儿,大家还在用简单的脚本定时拉取日志,架构就是一台服务器加一个数据库。现在呢?早就不是那个玩法了。

我个人习惯把架构演进分成三个阶段:

  • 单体架构阶段:采集、清洗、存储全在一台机器上。优点是简单,缺点是扛不住量。我记得2015年帮一家电商公司做日志采集,双十一当天单机直接被打挂,数据丢了整整两小时——那叫一个惨。
  • 分层架构阶段:采集层、缓冲层、处理层、存储层分开部署。这时候开始引入消息队列(Kafka、RocketMQ)做解耦,采集端只管收,处理端只管算,互不干扰。
  • 流式架构阶段:实时采集、实时处理、实时落盘。Flink、Spark Streaming 这些引擎开始登场。说白了,就是数据还没落地,你已经在处理它了。

核心观点:架构演进的核心驱动力就两个——数据量变大、实时性要求变高。没有银弹,只有取舍。

1.2 核心组件:每个环节都不能掉链子

一个完整的数据采集系统,至少包含以下组件。我按数据流向给你捋一遍:

组件 职责 常见选型
采集代理(Agent) 部署在数据源端,负责抓取数据 Filebeat、Logstash、Flume
消息队列 缓冲数据,削峰填谷 Kafka、RabbitMQ、Pulsar
传输通道 保证数据可靠送达 HTTP、gRPC、TCP长连接
数据转换 清洗、过滤、格式化 Logstash filter、自定义UDF
存储引擎 最终落盘 HDFS、ClickHouse、Elasticsearch

嗯,这里要注意:消息队列不是必须的。如果你数据量很小,实时性要求也不高,直接用采集代理写到存储里就行。但一旦日均数据量超过百万条,我建议你老老实实上Kafka。为什么?

我曾经在一个项目中跳过消息队列,采集端直接写数据库。结果业务高峰期数据库连接池被打满,采集任务大面积超时,数据全丢了。后来加了Kafka做缓冲,再也没出过类似问题。

1.3 常见数据源类型:你面对的不只是日志

很多人一提到数据采集,第一反应就是「收日志」。其实数据源类型远比你想的丰富。我按来源分类给你列一下:

  • 应用日志:Java的log4j、Python的logging、Nginx的access log。这类数据最典型,也最好处理。
  • 数据库变更:MySQL的binlog、PostgreSQL的WAL日志。用Canal、Debezium这类工具监听,实现实时同步。
  • API接口数据:第三方服务的RESTful接口、Webhook回调。说白了就是定时轮询或者被动接收。
  • 物联网设备:传感器、智能硬件的上报数据。协议五花八门,MQTT、CoAP、HTTP都有。
  • 用户行为埋点:前端JS埋点、APP SDK上报。这类数据量最大,也最容易出问题。

避坑指南:我曾经接手过一个埋点采集项目,前端上报的数据里字段名大小写不统一,有的用「userId」,有的用「user_id」。清洗脚本写了三天才搞定。所以,数据源侧的规范比采集侧的代码更重要

1.4 采集模式:推还是拉?这是个问题

采集模式就两种:推(Push)和拉(Pull)。你想想看,这其实跟你去餐厅吃饭一个道理——推模式是服务员把菜端到你桌上,拉模式是你自己去厨房窗口取。

  • 推模式(Push):数据源主动把数据发到采集端。优点是实时性好,缺点是采集端扛不住突发流量。适合日志采集、埋点上报。
  • 拉模式(Pull):采集端主动去数据源取数据。优点是可控性强,你可以自己控制节奏。缺点是实时性差,适合数据库同步、API轮询。

实际项目中,我建议混合使用。比如日志采集用推模式,数据库同步用拉模式。别死磕一种,灵活点。

1.5 知识体系总览

下面这张图是我自己画的,把本章的核心逻辑串起来了。你看一眼就能明白数据采集系统到底在干什么:

数据源层 应用日志 数据库变更 API接口 物联网设备 用户埋点 采集层 采集代理(Agent) 消息队列(Kafka) 传输通道(gRPC) 处理层 数据清洗 格式转换 过滤去重 实时计算 存储层(HDFS / ClickHouse / ES) 推模式 拉模式

注意:这张图展示的是通用架构。实际项目中,每一层都可能根据业务场景做裁剪或增强。比如物联网场景,采集层前面可能还要加一层协议网关。别照搬,要理解背后的设计思想。

1.6 小结

数据采集系统,说白了就是一条数据管道。从数据源到存储,中间经过采集、缓冲、传输、处理四个环节。架构怎么选、组件怎么搭、模式怎么定,全看你的数据量和实时性要求。

我见过太多人一上来就上Kafka、上Flink,结果数据量一天才几万条,纯属杀鸡用牛刀。也见过有人用单机脚本扛百万级数据,最后系统天天崩。嗯,这里面的度,得靠经验去把握。

下一章,我会带你深入采集代理的选型与配置,聊聊Filebeat、Logstash、Flume到底该怎么选。到时候见。


专注资料整理