简介:这份《资源数据采集技术方案要点》是一份面向在线预订类旅游网站数据采集系统规划与设计人员的方案文档,重点解决海量信息环境下人工搜集旅游资讯费时费力、易遗漏、易出错的问题。压缩包内共1个文件,为doc格式文档,整体大小744KB。文档按标准方案结构展开,涵盖项目概况、系统建设目标与原则、总体框架与技术路线、系统设计规范及详细设计等内容;其中对可扩充性、低耦合性、高效性等建设原则作了具体说明,并采用Java跨平台技术路线,通过数据库入库、SQL同步或txt/xml交换等方式实现采集系统与其他系统的协同。读者可借此了解Web数据采集系统的完整设计思路,也可作为撰写同类技术方案或招标文件的参考模板。该资源已有65人学习,适用于系统架构师、研发工程师及项目管理人员。
1. 资源数据采集技术方案:先想清楚要采什么,再写文档
很多人拿到"资源数据采集"这个题目,上来就画架构图、选技术栈,评审会上却被第一句就问住:"这里的资源到底指什么,采到什么程度算完?"服务器CPU、数据库连接数、云账号下的实例清单、业务系统的接口配额,都叫资源,采集通道和数据形态却完全不是一回事。标题里带".doc",说明最终产物是一份要过评审、要归档、甚至要作为招标附件的正式文档,它不负责炫技,只负责把采集边界、数据模型、采集通道、质量保障这四件事用书面语言钉死。这份技术方案适合运维平台、CMDB、多云管理、数据中台里负责资源接入的工程师,也适合要把方案转成交底材料交付给研发和测试的人。
2. 资源数据采集的指标建模:把"资源"翻译成可落地的指标树
2.1 资源盘点:先分清三类资源边界
资源数据采集的第一步不是写代码,是盘点。常见做法是把资源分成三类:基础设施资源,包括物理机、虚拟机、网络设备、存储设备,关注CPU、内存、磁盘、流量;平台资源,包括数据库、中间件、容器集群,关注连接数、队列长度、副本数;业务资源,包括应用实例、接口、许可证,关注实例数、配额、运行状态。三类资源的采集手段和指标粒度完全不同,混在同一张表里往下写,评审和后续开发都会失控。
我一般会直接在方案里放一张"资源边界表"收口,包含资源大类、资源子类、采集对象示例、数据归属部门四个字段。这张表同时也是后期验收的对照依据,哪些资源在范围内、哪些不在,边界不用靠口头解释。见过一份方案把"所有设备"列为采集范围,结果评审追问网络设备里的老旧型号怎么采时,现场没人能答上来,整份方案被退回。边界表的价值就在这里,它逼着方案作者把模糊的范围承诺变成可核对的对象清单。
2.2 指标树与采集项清单:从指标树拆到可执行的采集项
边界确认后,把每个资源拆成指标树。以一台虚拟机为例,顶层是计算、存储、网络三棵子树,计算下面挂CPU使用率、负载、运行时长,存储下面挂磁盘空间、IOPS,网络下面挂入流量、出流量。方案里指标树不用画得很花哨,但采集项清单必须细到"这条数据从哪个命令、哪个API、哪个OID来"。
下面这份YAML是评审稿里比较实用的一种采集项定义方式,每个字段都能被开发和测试直接引用:
resources: - resource_type: vm category: infrastructure collect_items: - metric: cpu_usage mean: CPU使用率 method: agent command: top -bn1 | grep 'Cpu(s)' | awk '{print $2}' unit: "%" interval: 300 - metric: load_avg mean: 系统1分钟平均负载 method: agent command: cat /proc/loadavg | awk '{print $1}' unit: load interval: 300 - resource_type: mysql category: platform collect_items: - metric: threads_connected mean: 当前连接数 method: sql command: SHOW GLOBAL STATUS LIKE 'Threads_connected' unit: count interval: 60这份定义的逻辑是:每种资源类型挂一组采集项,method区分采集通道,sql、agent、snmp各自对应不同执行路径,interval单独设周期,unit做单位统一。command字段里写的是实跑命令,而不是"采集CPU使用率"这种描述,两者的差别在于后者到了开发手里还要再猜一次实现方式。
采集项清单还要过一遍评审,重点看三个参数:interval是否合理、unit是否统一、command在目标环境是否有执行权限。很多方案死在command写得太理想,比如拿虚拟化平台的API去采物理机指标,目标主机上根本没有对应命令,甚至没有sudo权限。这类问题应该在清单阶段暴露,而不是等联调才发现。
2.3 采集周期与数据量估算:方案里必须算这笔账
采集周期不能一刀切,常见分级:秒级5到30秒,面向告警;准实时1到5分钟,面向监控图表和趋势分析;离线15分钟到1小时,面向报表和容量规划。周期定完要立刻算数据量,这比选存储引擎更能说明方案是否严谨。
估算公式是:单条数据大小乘采集频率乘资源数量乘保留时长。举个例子,1000台主机,每台每5分钟采一轮,每轮20个指标,一天86400除以5等于288轮,每天单台产出5760条,1000台合计576万条,按每条指标序列40字节估算,一天原始数据约230MB,一个月不到7GB。这个量级对时序数据库不是压力,但采集周期从5分钟改成1分钟,月度增量直接到35GB,存储预算就要在方案里另行说明。评审人看到这个对比,对方案的计算能力会更有信心。这份估算表应列入方案附件,至少包含指标数、采集频率、单条大小、月度存储增量四列。
3. 资源数据采集通道与协议选型:Agent、无Agent与API直连怎么组合
3.1 三种采集模式的适用边界
资源数据采集通道的选型,核心不是选某个现成框架,而是选通道组合。常见的有三类。Agent模式,在目标主机上装采集端,能拿到操作系统内部细粒度数据,比如进程级CPU、内存分片,适合基础设施和需要深度指标的场景;无Agent模式,走SNMP、SSH、WinRM等远程协议取数,适合网络设备和不便安装软件的主机;API直连模式,对接云控制台、虚拟化平台、业务系统的开放接口,适合云资源清单和平台资源。
三种模式没有绝对的优劣,只有边界。Agent能采到的指标最全,但有安装和升级成本,采中间件指标时还往往要额外账号;无Agent部署最轻,但受协议限制,SNMP标准库拿不到进程序列;API直连数据最干净,但依赖对方的限流策略和接口版本。方案里我一般给出的组合原则是:有标准管理API的资源优先走API,需要细粒度指标的主机走Agent,只有网络设备和哑设备走SNMP。这样从架构上就减少需要维护的采集通道数量。
3.2 协议与端口清单:评审会必问的一张表
方案里必须附协议与端口清单,否则运维评审会在第一个环节卡住。下面是一张可以直接套用的组合表:
| 资源类型 | 采集方式 | 协议 | 默认端口 | 安全备注 |
|---|---|---|---|---|
| Linux主机 | Agent | HTTP | 10080 | 采集端上报,示例端口 |
| Windows主机 | Agent | HTTP | 10081 | 采集端上报,示例端口 |
| 网络设备 | 无Agent | SNMP | 161/UDP | 配置只读团体字,禁用写权限 |
| 网络设备 | 无Agent | SSH | 22 | 仅巡检场景,使用专用账号 |
| 虚拟化平台 | API直连 | HTTPS | 443 | 最小权限API账号 |
| 云资源 | API直连 | HTTPS | 443 | 关注接口限流与分页 |
| MySQL | SQL查询 | MySQL协议 | 3306 | 只读账号,禁用PROCESS权限 |
这张表的要点在安全备注列。SNMP只读团体字、数据库只读账号、云API限流,这些是评审人大概率追问的项,提前写在表里比现场解释有说服力。端口不要写死,部署环境差异很大,每个端口段留一行"实际以防火墙策略为准"的说明即可。
3.3 采集调度与幂等设计:错峰、重试与去重
通道定了之后写调度。常见做法是自研轻量调度器,或依赖定时任务加消息队列,关键要满足三条原则:错峰、重试、幂等。下面是最小调度逻辑的Python示例,方案里用这段说明调度时序:
import time import random def dispatch(tasks): for task in tasks: # 错峰:在周期内加随机偏移,避免整点采集风暴 time.sleep(random.uniform(0, task.interval * 0.1)) for attempt in range(3): try: payload = task.collect() # 幂等写入:资源ID+指标名+采集时间构成唯一键 store.write( payload, dedup_key=(task.resource_id, task.metric, task.collect_time)) break except Exception: backoff = 2 ** attempt time.sleep(backoff)这段代码要讲清三个设计点。第一,offset随机偏移,让上千个采集任务不在同一秒打向被采端,否则目标主机和采集服务都会出现瞬间尖峰。第二,重试次数上限固定为2次,退避时间等差递增,避免故障时反复重试放大压力。第三,dedup_key由资源ID、指标名、采集时间组成,支持重复执行不产生重复数据,这是资源数据采集中最基本也最重要的幂等保障。
还有一个容易被忽略的点:采集端要记录每轮采集的元数据,包括开始时间、结束时间、成功条数、失败条数与失败原因。这组数据既是采集服务的性能指标,也是第4章要讲的对账机制的判断依据,方案里要单独写一节说明元数据落盘格式,否则对账机制设计就是空中楼阁。
4. 资源数据采集的数据清洗、落库与校验:方案里最容易漏掉的三件事
4.1 分层落库:原始层、明细层、汇总层各放什么
采集到的数据不要直接喂给业务方,常见的落库设计是分三层。原始层存采集端上报的原样数据,保留7到30天用于回溯;明细层做单位换算、标签标准化、脏数据剔除;汇总层按5分钟、1小时、1天预聚合,供图表和报表查询。分层的目的,是让下游查询不直接面对海量原始序列,同时保证原始数据可追溯,任何一次汇总口径出问题都能回到明细层核对。
明细层的建表语句在方案里是这样表达:
CREATE TABLE resource_metric_detail ( resource_id VARCHAR(64) COMMENT '资源唯一标识', metric_name VARCHAR(64) COMMENT '指标名', metric_value DOUBLE COMMENT '指标值', unit VARCHAR(16) COMMENT '单位', collect_time DATETIME COMMENT '采集时间', report_time DATETIME COMMENT '上报时间', source_type VARCHAR(32) COMMENT '采集通道:agent/snmp/api', PRIMARY KEY (resource_id, metric_name, collect_time) ) ENGINE=InnoDB COMMENT '资源指标明细表';表结构围绕一条规则:主键由资源ID、指标名、采集时间三字段组成,正是上一章说的幂等写入的落库形态。source_type字段记录数据来自哪个采集通道,排障时能快速判断一条数据的来源。注意report_time和collect_time分开存,两者差值就是采集延迟,这个字段在评审时经常被问到,直接决定你对"数据新鲜度"有没有量化衡量。
4.2 数据质量规则与校验脚本:脏数据要在源头拦截
资源数据采集最常见的脏数据有四类:值越界、单位混用、时间戳漂移、重复上报。方案里要定义一套校验规则并落在采集链路中,不能等数据入库后再补救。推荐做法是采集端做基础校验,入库前做业务规则校验,两道过滤各管一段。
下面是一个入库前校验函数的Python示例:
def validate_metric(record, rule): if not (rule.min_value <= record.value <= rule.max_value): return False, "value_out_of_range" if abs(time.time() - record.collect_time) > rule.max_delay: return False, "time_skew" if record.unit != rule.expected_unit: return False, "unit_mismatch" if record.dup_seen(record.resource_id, record.metric_name, record.collect_time): return False, "duplicated" return True, "ok"校验规则中的min_value、max_value和expected_unit,直接从第2章的指标定义生成,不要另维护一套规则表,否则指标清单和校验规则会越改越不一致。校验不通过的数据不能直接丢弃,要进异常队列并记录原因,异常见两条路径处理:值越界和单位问题回退给指标负责人修订规则,时间偏移问题提示检查目标主机的时钟同步。
4.3 增量采集与对账机制:用元数据保证不漏采
全量采集只在初次接入时执行,日常运行以增量为主。增量判断依据是采集端记录的last_collect_time,每次启动带上上次完成时间,服务端按资源ID和采集时间去重。这个机制的前提是目标主机时钟一致,方案里要把NTP时钟同步写成前置依赖,否则增量窗口错乱会产生漏采或重复。
对账机制是整个方案里最容易被砍、但最有说服力的一环。具体做法:每轮采集完成后,采集端上报本轮元数据,服务端对比目标资源清单,计算覆盖率,即成功采集数除以应采数。覆盖率低于阈值就触发补采,连续失败的资源进入告警。实现不需要复杂系统,一条汇总SQL加一个告警规则就能跑:
SELECT source_type, COUNT(*) AS total, SUM(CASE WHEN collect_status = 'success' THEN 1 ELSE 0 END) AS success_cnt, ROUND(SUM(CASE WHEN collect_status = 'success' THEN 1 ELSE 0 END) / COUNT(*), 4) AS coverage_rate FROM collect_task_log WHERE report_date = CURRENT_DATE GROUP BY source_type HAVING coverage_rate < 0.98;这段SQL按采集通道分组统计当日覆盖率,低于98%就列入告警。阈值不要定100%,因为偶发网络抖动导致个别失败是常态,方案里写98%或99%更贴现实。MySQL 8.0可以在HAVING里直接引用SELECT别名,其他数据库要把覆盖率表达式写全。对账机制在方案里必须存在,否则资源清单和实际采集结果永远对不上号,评审时一句"你怎么知道你没漏采"就足够让方案打回。
5. 资源数据采集方案评审前自检:用一页Checklist验证技术方案切题性
一份采集技术方案过不过评审,通常不取决于某个采集组件多先进,而在于是否切题,也就是评审人关心的采集边界、安全权限、存储成本、故障兜底,方案有没有正面回应。这里给一份自检清单,评审前逐条打勾:
| 检查项 | 通过标准 | 常见打回原因 |
|---|---|---|
| 采集边界 | 资源分类表写清在采与不在采 | 一张大表列所有资源,责任不清 |
| 指标粒度 | 每个指标有单位、周期、来源命令 | 只有指标名没有采集命令 |
| 协议端口 | 端口表含安全备注 | 未提只读账号和限流 |
| 数据量估算 | 有存储增量计算公式 | 只写"预计数据量较大" |
| 幂等保障 | 唯一键与去重策略明确 | 重复采集导致数据翻倍 |
| 对账机制 | 有覆盖率计算和补采流程 | 采完不管,漏了不知道 |
| 安全权限 | 采集账号最小权限 | 用管理员账号采集 |
这里单独说一个和标题里".doc"直接相关的问题:很多项目最终要交付Word评审稿,但从在线文档或新版WPS导出doc时,表格样式、自动目录和代码块字体经常损坏。我一般建议交付前专门做一次导出检查,重点是三处:目录能不能右键更新、表格是否跨页断裂、代码块是否保持等宽字体和浅色背景。这三项是Word评审稿里出现率最高的排版问题,也是最容易被内容评审之外的人挑刺的地方。
最后一个验证技巧,价值比前面所有排版建议都高:方案里任何一条采集命令,都要在预发环境用最小权限账号实际跑一遍,把真实输出、耗时、失败报错整理成附录。评审人看到的不再是"可以执行"这三个字,而是带时间戳的实测结果;这条实测记录同时会成为开发排期评估和测试用例设计的输入。评审前把附录实测记录和自检清单放在方案最前面,评审问题的走向会从"你确定能采到吗"变成"这个指标为什么是这个输出",后者才是技术方案评审该有的状态。
本文还有配套的精品资源,点击获取