简介:这是一份面向企业IT运维与大数据平台规划人员的解决方案文档,聚焦OLTP与OLAP系统融合趋势下的大数据运维体系设计。内容从组织架构切入,系统对比了开发和运维纵向一体化、完全分离以及均衡三种交维模式,剖析各自适用场景与利弊,并给出故障分级方法,将故障划分为灰、蓝、黄、橙、红五个等级,同时结合时间、影响范围、数据完整性等维度说明判定标准。文档还覆盖故障升级流程、短信通知对象示例,以及数据采集平台接口及时性保障策略,包含具体时段达成率目标与数据质量检查思路,可直接参考落地。资源为1个docx文档,约298KB,便于阅读与复用。该文档已有150人学习浏览,适合正在搭建或优化大数据运维体系的技术团队参考。
1. 大数据运维规划:OLTP的运维经验救不了OLAP
企业IT部门里,CRM挂了是天大的事,BI这类OLAP系统挂了却往往能容忍很长时间,这个反差我在传统企业里见了太多次。但随着OLTP系统迫切需要OLAP的分析力,OLAP又需要嵌入OLTP流程中去发挥价值,两个系统正在快速融合,边界越来越模糊。每年双11前,阿里的大数据平台运维人员会非常忙,哪怕只是实时大屏的数字显示,背后都需要极强的运维保障能力;而很多企业搞大型营销活动只关注OLTP稳定,OLAP运维人员悠闲得多,这就是数字化企业和非数字化企业的差距。大数据运维规划没法照搬OLTP那套体系:可用性要求不同、交接对象不同、故障影响面不同,必须单独设计。这篇文章按组织架构、故障分级、采集与作业保障、改进反推四个方向展开。
2. 运维组织架构三种模式:纵向一体化、完全分离与均衡模式怎么选
2.1 纵向一体化:效率最高,但规模卡在标准缺失
我在按业务条线纵向一体化的BI团队里待过六七年。每个人按业务条线划分,为自己这条线的所有数据全面负责:需求自己做、开发自己做、维护自己做,连业务沟通都是自己上。这种模式的效率确实高,因为写产出代码的人就是看监控的人,数据出问题,开发能直接从模型层定位到接口层,不需要转述,也不需要拉会。对人的锻炼价值也最大,一个长期跑这条线的人,基本能把业务口径、数据血缘、调度依赖讲得一清二楚。
但纵向一体化的天花板非常明显:缺乏标准。每个人的处理过程不透明,换一个人接手,可能连告警规则藏在哪个配置里都不知道。没有统一标准就没法做运维承诺,也就没办法对业务方形成明确SLA,团队规模一扩大,这套玩法立刻撑不住。它适合小团队和业务快速迭代期,但当系统规模上千、接口上万时,问题会集中在少数人身上,其他人接不住。
2.2 开发和运维完全分离:短期有效,长期缺乏成长性
系统庞大之后,IT部门为了稳定,会制定大量标准化规范和流程,把运维从开发中剥离出来,形成横向切割。这个思路从OLTP迁移过来很自然,因为OLTP的服务组合是可以穷举的,标准化程度高,交接时能说清楚。但OLAP完全不同:数据的指标和维度组合几乎是无穷的,把一张表交给运维,如果没有业务理解,这张表就是一堆字段名。
数据维护里最大的一类工作——数据质量稽核,本质上需要代码级的溯源能力,得能顺着产出SQL一路查到源系统。只懂封装的数据运维人员能做的只有监控告警、作业调度启停,遇到数据问题基本只能转述给开发。一个问题的解决流程被拉得很长:业务反馈给运维,运维转述给开发,开发查到一半发现要问业务口径,再拉会。这种模式短期看有效,因为复用了OLTP已有的流程经验,但长期看缺乏成长性,运维满意度上不去,运维人员自己的技能也涨不了。
我一直认为,运维才是系统改进的核心驱动力,而不是由项目规划人员指东打西。规划人员提出的东西往往离实际运维问题相差很远。谁对系统有真正发言权?如果稳定是企业最核心的诉求,专业能力最强的人应该放到运维,而不是开发或规划。
2.3 均衡模式:中台类资产交维,创新类自管
第三种模式是我目前比较认同的方向:维护要有的放矢。中台类的系统、产品或数据做交维,创新、探索、变动类的系统或数据不交维,谁做的谁自己管。什么是中台类?企业真正沉淀下来的资产,成熟一个纳入一个——基础平台、标签库、基础模型、融合模型都算。
对于交维对象,运维团队要能提出合理的监控和告警要求并部署,要能自行处理大多数故障,要能提出持续优化建议,在未来系统改进上具有主导发言权。判断一个对象能不能交维,我一般用下面这张表过一遍:
| 交维对象 | 成熟度要求 | 运维团队能力要求 |
|---|---|---|
| 基础平台(BDI等) | 具备高可用与容灾切换能力 | 能独立完成容灾演练与故障恢复 |
| 标签库/基础模型 | 数据口径稳定,产出任务已纳入统一调度 | 能读懂血缘,能独立做数据质量稽核 |
| 融合模型 | 稳定运行多个周期无重大口径变更 | 能解释指标波动原因并定位到源头 |
| 创新/探索类应用 | 不交维 | 原开发团队自管 |
这里有个常见误区:把所有应用都纳入运维,结果运维团队什么都接不住。衡量的标准是交维对象的稳定性,以及运维团队能否在大多数故障场景下独立闭环,而不是交维表格填得满不满。
2.3.1 交维前自动检查
交付动作不能靠人肉逐项确认,我一般会在交维前跑一个自动检查脚本,核心是卡血缘文件和监控配置:
#!/bin/bash # 交维前检查:确认交付物齐全且包含关键监控配置 required=("data_dict.md" "lineage.json" "sla.yaml" "monitor.yaml") missing=0 for f in "${required[@]}"; do if [ ! -f "handover/${f}" ]; then echo "[MISSING] ${f}" missing=1 fi done [ $missing -eq 0 ] && echo "[READY] 交维包完整,可进入纳管评估流程。"这段脚本做的事情是卡住交维门槛。lineage.json是血缘描述文件,没有血缘,运维接手后根本没法做影响分析,一张表挂了都不知道哪些下游应用会受影响;monitor.yaml里如果连数据量波动告警都没配,这个对象就不具备交维条件。跑一遍只要几秒,比靠人逐项确认可靠得多,也能逼着开发团队把交接文档补齐。
3. 故障分级与升级流程:灰蓝黄橙红五级怎么定
3.1 对象分级:核心、重要、一般的划分原则
故障分级的前提是管理对象分级。数据运维涉及平台、应用和数据三类对象,每类都应该按重要性划分核心、重要、一般三个等级。以下是一个划分示例:
| 管理对象 | 等级 | 划分理由 |
|---|---|---|
| BDI 采集平台 | 核心 | 挂了数据就采不进来,平台保障优先 |
| 变现类应用 | 重要 | 涉及直接收入,收入优先原则 |
| 生产报表数据 | 重要 | 与重要应用强相关,数据与应用一致性原则 |
| 一般数据分析 | 一般 | 对内支撑,时效要求相对宽松 |
这张表的设计背后有三个原则:平台保障原则、收入优先原则、数据与应用一致性原则。血缘分析在这里非常关键——要知道哪些数据跟哪些应用相关,才能判定数据的重要等级。表的等级需要动态维护,每次纳管一个新的平台、数据或应用,就得同步更新,而不是建完表就丢在那里不管。
3.2 故障等级判定:时间维度加数据完整性
故障分级我们划分为灰、蓝、黄、橙、红五个层级。首先考虑时间维度,即异常持续时间;但时间维度不足以表示故障严重程度,还需要加上影响范围,特别要增加数据完整性这个指标——数据大范围延迟即使没有一个投诉,也是较大故障。以下是一套示例判定标准:
| 故障等级 | 判定条件(示例) |
|---|---|
| 灰 | 延迟小于 15 分钟,无业务影响 |
| 蓝 | 延迟 15~30 分钟,或个别非重要接口失败 |
| 黄 | 延迟 30 分钟~2 小时,或一般应用数据延迟 |
| 橙 | 延迟 2~8 小时,或重要应用数据异常/部分缺失 |
| 红 | 延迟超过 8 小时,或核心平台不可用、核心数据不完整 |
阈值需要企业根据自身情况校准,我一般建议拿历史故障回放一遍,调整到与实际事故严重程度基本吻合再用。判定的逻辑适合做成小函数,直接挂在告警平台里:
def fault_level(delay_minutes: int, affected_level: str, data_incomplete: bool = False) -> str: # affected_level 取值为 core/important/normal,对应对象分级结果 if data_incomplete and affected_level in ("core", "important"): return "RED" if affected_level == "core" else "ORANGE" if delay_minutes >= 480: return "RED" if delay_minutes >= 120 or (affected_level == "core" and delay_minutes >= 60): return "ORANGE" if delay_minutes >= 30: return "YELLOW" if delay_minutes >= 15: return "BLUE" return "GREY"参数说明:delay_minutes是数据产出延迟的分钟数;affected_level是第一节管理对象分级的结果,core 对应核心对象;data_incomplete表示是否检测到数据空洞或大范围缺失。规则里有两个关键设计:一是数据不完整会直接把等级拉到橙/红,即使没人投诉——这对应「大范围延迟就是大故障」的原则;二是核心对象延迟到 60 分钟就提前进橙色,因为影响面大,不能等 120 分钟才升级。
3.3 升级流程与短信通知对象
有了故障等级,还要配套升级流程,明确什么时刻需要做什么事。常见做法如下:
| 时间点 | 动作 |
|---|---|
| 0~5 分钟 | 值班人员确认故障,判定初始等级,登记台账 |
| 15 分钟 | 黄级以上通知运维负责人,进入协同排查 |
| 30 分钟 | 橙色以上通知应用负责人与开发侧,准备回滚或补数方案 |
| 60 分钟 | 红色故障通知部门负责人,由负责人决策是否启动容灾 |
短信通知对象也要跟着故障等级走:
| 故障等级 | 短信通知对象 |
|---|---|
| 灰/蓝 | 值班运维 |
| 黄 | 值班运维 + 运维负责人 |
| 橙 | 值班运维 + 运维负责人 + 数据产品/应用负责人 |
| 红 | 上述全部 + 部门负责人/管理层 |
故障严重的时候,需要让老板知道。短信通知的名单不是写死的,每次纳入新平台或新应用,都要同步更新通知矩阵,避免出现「应用已经换了负责人,故障短信还发给上一个」的情况。
4. 数据采集与作业调度保障:把及时性变成可验收的达成率
4.1 BDI 采集接口:2000多个接口的分级与分时段目标
数据采集是数据运维的地基,采集不及时,下游所有作业和报表都会跟着延迟。我这边 BDI 采集平台当前有 2000 多个采集接口,复杂度不算低:
| 接口类型 | 数量 | 说明 |
|---|---|---|
| 分钟/小时/月接口 | 400+ | 高频接口,优先保障 |
| 日接口(重要级) | 300+ | 直接影响重要应用 |
| 日接口(一般级) | 约 1200 | 要有保障底线 |
| 涉及数据源 | 155 个库 | 依赖面广,需逐源核对 |
接口重要性不同,及时性要求就必须分开定。以下是一个保障目标示例:2 点前完成 58% 的重要级接口,4 点前完成 78%,6 点前完成 85%,8 点前完成 88%,12 点前完成 100%。考虑到集群计算性能时有波动,各时段达成率目标设定为 90% 以上。
| 时间点 | 重要接口累计达成率目标 | 全部接口达成率底线 |
|---|---|---|
| 2 点 | 58% | 90% |
| 4 点 | 78% | 90% |
| 6 点 | 85% | 90% |
| 8 点 | 88% | 90% |
| 12 点 | 100% | 90% |
再重要的接口也要有底线,再不起眼的接口也要有保底要求。很多企业数据几个月没采集都没人发现,就是因为缺乏明确的保障要求和监控指标。数据准确性方面也类似,每个数据接口采集都要设置数据量波动性检查、空值检查,不能只看跑没跑完。
4.2 DACP 作业保障:762个作业的重要级识别
大数据模型和应用数据的生成,我这边都纳入 DACP 管理,包括融合模型、挖掘模型和数据应用大作业,共计 762 个。其中月作业 189 个,日作业 573 个,日作业里重要级作业 333 个。作业的及时性保障同样按时间点卡:
| 时间点 | 重要作业累计达成率目标 |
|---|---|
| 4 点 | 15% |
| 8 点 | 65% |
| 12 点 | 85% |
针对重要应用涉及的作业,还应设置应用结果数据的质量检查机制,提前发现问题。特别是变现类应用,所有数据都要做波动性告警。这里多说一句:做这个是因为对外变现出现过多次数据异动导致客户投诉,所以宁可多做一步,尽量未雨绸缪,虽然不能解决所有问题,但能做一步算一步。
4.3 用 SQL 统计分时段达成率
达成率目标定完之后,关键是每天能看到实际值。以下是用 SQL 按目标时间分桶统计的重要接口达成率:
-- 统计 BDI 重要接口分时段达成率,按目标完成时间分桶 WITH finish_log AS ( SELECT interface_id, importance, -- 重要/一般,来自接口配置表 target_time, -- 该接口当日目标完成时间,接口级配置 actual_finish_time FROM bdi_collection_log WHERE dt = CURRENT_DATE ) SELECT CASE WHEN target_time <= '02:00' THEN 't2_before' WHEN target_time <= '04:00' THEN 't4_before' WHEN target_time <= '06:00' THEN 't6_before' WHEN target_time <= '08:00' THEN 't8_before' WHEN target_time <= '12:00' THEN 't12_before' ELSE 'after_12' END AS time_bucket, COUNT(*) AS total_cnt, ROUND(100.0 * SUM( CASE WHEN actual_finish_time <= target_time THEN 1 ELSE 0 END ) / COUNT(*), 2) AS on_time_rate FROM finish_log WHERE importance = '重要' GROUP BY 1 ORDER BY 1;这段 SQL 的关键在于target_time是从接口配置表带出来的,每个接口独立配置自己的目标完成时间,不是统一按凌晨 2 点或 4 点算。time_bucket把接口按目标时间分桶,对应「2 点前完成 58%」这类约定;on_time_rate计算的是该时段内应完成接口中实际按时完成的比例。每天早晨跑一遍,和约定目标对比,哪个桶没到线当天就排查,不用等月度复盘。
5. 从告警反推改进:把故障台账变成运维规划的输入
故障分级和达成率统计只是第一步,真正有价值的是让运维数据反向驱动系统改进。运维最怕的不是出事,而是完全的事务驱动,总是救火,投更多的人救火,却很少有人能从运维角度提出真正的问题和改进要求。100 个接口的时候不做规划和管理,到 1 万个接口的时候,积重难返。
每次故障处理完之后,我建议在台账上回填几个固定字段:根因分类、恢复动作、本次故障是否可被现有告警提前发现。根因分类我一般固定用这几类:调度依赖配置错误、数据源异常、SQL 性能劣化、模型口径变更、资源不足。每季度按根因做一次聚合,重点看两个指标:根因占比,以及「本可被告警提前发现但没发现」的占比。
这两个指标决定改进动作的方向。如果占比最高的是调度依赖配置错误,那要改的是 DACP 里的作业依赖关系,而不是加监控;如果大量故障是「本可被提前发现」,说明监控规则覆盖不到位,优先补数据量波动和空值检查;只有确认是 SQL 性能劣化,才值得投入去做任务优化。这样改进就不是拍脑袋,而是由故障数据说话。
对象分级表同样需要动态维护。新增一个应用时,跑一遍血缘分析,把涉及的表、接口、作业全部标记为对应等级,体现的是数据和应用一体化的思想。我一般会把血缘分析任务挂到发布流程里,每次新应用上线,自动生成一张待分级数据清单,交给运维与数据产品在 48 小时内确认等级,并同步更新监控告警配置和短信通知矩阵。这样分级和监控始终跟业务同步,不会出现「应用上线两个月,告警还没配」的空窗。
本文还有配套的精品资源,点击获取