一、背景介绍
目前实时数仓提供的投放实时指标优先级别越来越重要,不再是单独的报表展示等功能,特别是提供给下游规则引擎的相关数据,直接对投放运营的广告投放产生直接影响,数据延迟或者异常均可能产生直接或者间接的资产损失。
从投放管理平台的链路全景图来看,实时数仓是不可或缺的一环,可以快速处理海量数据,并迅速分析出有效信息,同时支持投放管理平台的手动控盘。实时节点事故,将可能导致整个投放链路无法正常运行,另外,投放规则引擎是自动化操作,服务需要24小时运行,所以需要配置及时有效的数据质量监控预警,能快速识别到波动异常或者不符合业务的数据,从而计划引入混沌工程,希望可以通过主动注入故障的方式、尽可能提前感知风险、发现潜在问题,并针对性地进行防范、加固,避免故障发生时所带来的严重后果,提高实时数仓整体抗风险能力;
二、演练范围
为了能更细致反应出混沌演练情况,根据演练的内容不同,将实时数仓混沌分为两部分:技术侧和业务侧。
技术侧混沌:基于中间件、数据库、jvm、基础资源、网络、服务等注入常见的异常,根据实际业务中梳理的应用核心场景进行混沌演练,检验系统的脆弱性和应急响应能力,从而提升团队的稳定性保障处理能力;
业务侧混沌:对于电商活动密集型的公司来说,各种到达率、曝光率,以及更加宏观的 GMV、用户拉新数、用户召唤数等,都能表现出业务的健康程度,在实际生活中,为了描述一种稳定状态,我们需要一组指标构成一种模型,而不是单一指标。无论是否采用混沌工程,识别出这类指标的健康状态都是至关重要的,所以要围绕它们建立一整套完善的数据采集、监控、预警机制,当业务指标发生波动较大时,我们能搞快速感知、定位、修复止血;
过往数仓混沌工程均是技术侧,此次在投放链路已搭建完成主备链路的前提下,期望通可以通过多轮业务侧混沌,提高系统整体的数据异动感知能力;
三、演练计划
工欲善其事,必先利其器,在执行混沌演练前,需要准备好前置工作,制定合理的演练sop、方案、计划,对演练环境、脚本、数据、工具,场景及爆炸半径等进行可能性评估,在确认可行性ok的情况下,约好关联方时间,再进行实践操作;
本篇主要和大家分享基于业务侧的实时数仓混沌演练过程。
1、编写演练SOP
SOP是一种标准的作业程序,就是将某一事件的操作步骤和要求,进行细化、量化及优化,形成一种标准的操作过程,关于业务侧混沌,尤其是实时数仓数据相关的演练,我们也是第一次做,目前在业界也没有找到相关的演练指导参考,处于探索阶段,为了方便项目进度的顺利进行及后续演练操作更加规范、高效,在演练前期大家经过沟通、讨论后,项目前期梳理的sop演练模板,如下:
故障case编号 | 优先级 | 故障注入目标 | 故障case名 | 故障场景描述 | 预案执行步骤 | 预案执行后影响范围 | 业务是否有损 | 修复方案/风险项 | 异常注入人员 | 告警规则 | 预期告警时间 | 预期恢复时长 | 修复人员 | 紧急止血人员 | 备注 |
2、演练方案调研
先收集实时数仓投放链路核心指标范围,在此基础上,拉取一段时间内的历史数据进行分析,找到每个指标对应的健康波动阀值,从而在配置相应的dqc规则监控,对于波动不在健康阀值的异常指标,在分钟级别(预期15min)内及时告警,并快速排查响应。为此,在演练前期,我们经历过一系列的方案调研、探索,如下:
下文提供的方案,指标数据都是以设备激活数为例进行分析
-
方案一: 按照天维度,收集最近一段时间,同一天每个整点设备激活数,占当天大盘占比,统计出最小值、最大值,作为该指标的健康波动阀值;
hour | activate | 占比 |
0 | 3226 | 4.00% |
1 | 1895 | 2.00% |
2 | 1288 | 2.00% |
... | ... | ... |
23 | 4704 | 6.00% |
-
方案二: 按照天维度,收集一段时间内,同一天相邻整点指标波动数据找规律,比如每天上午9点到10点的波动数据,然后分别通过一系列的数学分布方法进行数据统计,从而希望找一个相对稳定的波动区间;
hour | 整点段最小波动 | 整点段最大波动 | 整点段平均波动 | 10分位整点段平均波动 | 50分位整点段平均波动 | 60分位整点段平均波动 | 70分位整点段平均波动 | 80分位整点段平均波动 | 85分位整点段平均波动 | 90分位整点段平均波动 | 方差 | 标准差 | 3倍标准差 |
0 | -0.78 | -0.03 | -0.5406666666666666 | -0.745 | -0.5933333333333333 | -0.57 | -0.53 | -0.46 | -0.37 | -0.275 | 0.031240919540229884 | 0.1767510100119088 | 0.5302530300357264 |
1 | -0.66 | 0.08 | -0.42451612903225805 | -0.558 | -0.46499999999999997 | -0.446 | -0.423 | -0.34400000000000003 | -0.32300000000000006 | -0.2919999999999999 | 0.019892258064516125 | 0.1410399165644823 | 0.4231197496934469 |
2 | -0.67 | 0.44 | -0.41387096774193555 | -0.5585 | -0.44875 | -0.441 | -0.42825 | -0.4205 | -0.3965 | -0.381 | 0.043951182795698915 | 0.2096453738952971 | 0.6289361216858913 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
23 | -0.58 | -0.17 | -0.3151612903225806 | -0.538 | -0.29000000000000004 | -0.267 | -0.2365 | -0.216 | -0.20650000000000002 | -0.19099999999999998 | 0.014379139784946239 | 0.11991305093669428 | 0.35973915281008284 |
-
方案三: 按照天维度,收集一段时间内,相邻天整点指标波动数据找规律,比如昨天上午9点到前天上午9点的波动数据,然后分别通过一系列的数学分布方法进行数据统计,从而希望找一个相对稳定的波动区间;
hour | 整点段最小波动 | 整点段最大波动 | 整点段平均波动 | 10分位整点段平均波动 | 50分位整点段平均波动 | 60分位整点段平均波动 | 70分位整点段平均波动 | 80分位整点段平均波动 | 85分位整点段平均波动 | 90分位整点段平均波动 | 方差 | 标准差 | 3倍标准差 |
0 | -0.773114 | 3.200922 | 0.21444786666666674 | -0.657368 | 0.031301 | 0.104161 | 0.28786 | 0.528356 | 0.724594 | 0.829 | 0.7717444871665335 | 0.8784898901902819 | 2.6354696705708456 |
1 | -0.803183 | 2.547603 | 0.25961056666666665 | -0.743263 | 0.102797 | 0.125122 | 0.318659 | 0.865063 | 1.01671 | 1.576939 | 0.6630587225086677 | 0.8142841779800635 | 2.4428525339401905 |
2 | -0.81362 | 2.11065 | 0.21154479999999998 | -0.581095 | -0.024264999999999995 | 0.175219 | 0.259156 | 0.638452 | 0.898515 | 1.332611 | 0.5530644190700966 | 0.7436830098033009 | 2.2310490294099026 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
23 | -0.762343 | 3.269681 | 0.12010636666666666 | -0.468608 | 0.015683000000000002 | 0.034022 | 0.11752000000000001 | 0.215743 | 0.3283475 | 0.41175 | 0.5405322608907229 | 0.7352089913016047 | 2.205626973904814 |
-
方案四:在前面三种方案的基础上,指标在工作日和周末的波动可能不一样,所以我们在日维度统计的基础上,我们也调研了周维度同比波动分布情况,比如每周1上午9点到上午10点的波动数据,然后分别通过一系列的数学分布方法进行数据统计,从而希望找一个相对稳定的波动区间;
hour | 整点段最小波动 | 整点段最大波动 | 整点段平均波动 | 10分位整点段平均波动 | 50分位整点段平均波动 | 60分位整点段平均波动 | 70分位整点段平均波动 | 80分位整点段平均波动 | 85分位整点段平均波动 | 90分位整点段平均波动 | 方差 | 标准差 | 3倍标准差 |
0 | -0.774958 | 0.867538 | -0.01263125000000001 | -0.7004498 | -0.0014979999999999993 | 0.07395519999999998 | 0.2406737999999997 | 0.5246976 | 0.5863455999999998 | 0.7253950000000001 | 0.27286583441445655 | 0.5223656137366399 | 1.5670968412099198 |
1 | -0.798913 | 3.727114 | 0.1947505416666667 | -0.70562 | -0.117344 | 0.1728504 | 0.28317799999999976 | 0.48062440000000045 | 0.6363572 | 1.2186656000000013 | 1.0252637080776503 | 1.0125530643268283 | 3.037659192980485 |
2 | -0.719335 | 2.896022 | 0.15818920833333336 | -0.6935798 | -0.03337200000000001 | 0.05926519999999995 | 0.28266419999999925 | 0.4158912000000007 | 0.8114451999999993 | 1.3396888000000007 | 0.8056290955726936 | 0.8975684350358439 | 2.692705305107532 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
23 | -0.808882 | 1.939822 | -0.11559370833333334 | -0.606189 | -0.147945 | -0.07347080000000009 | -0.006031200000000019 | 0.06592340000000002 | 0.09116459999999993 | 0.2029716000000002 | 0.29404872333378085 | 0.5422625962887178 | 1.6267877888661533 |
-
方案五:同理,我们也调研了周维度环比波动分布情况,比如本周1上午9点到上周1上午9点的波动数据,然后分别通过一系列的数学分布方法进行数据统计,从而希望找一个相对稳定的波动区间;
hour | 整点段最小波动 | 整点段最大波动 | 整点段平均波动 | 10分位整点段平均波动 | 50分位整点段平均波动 | 60分位整点段平均波动 | 70分位整点段平均波动 | 80分位整点段平均波动 | 85分位整点段平均波动 | 90分位整点段平均波动 | 方差 | 标准差 | 3倍标准差 |
0 | -0.257387 | 0.389745 | 0.005656625000000003 | -0.2326038 | -0.0374 | 0.04274439999999996 | 0.07304799999999996 | 0.10002840000000002 | 0.1571835999999998 | 0.2358556 | 0.031654237479548916 | 0.1779163777721121 | 0.5337491333163363 |
1 | -0.321893 | 0.581836 | 0.008232833333333342 | -0.28061339999999996 | -0.020979 | 0.01599759999999998 | 0.08596580000000001 | 0.09417820000000006 | 0.15484979999999984 | 0.25778160000000006 | 0.04783497729057972 | 0.2187120876645361 | 0.6561362629936083 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
22 | -0.22998 | 0.372808 | 0.014956999999999998 | -0.173144 | -0.036925 | 0.033748199999999985 | 0.09734479999999986 | 0.13897660000000006 | 0.16320899999999997 | 0.24842040000000015 | 0.02855305715947826 | 0.1689764988377918 | 0.5069294965133755 |
23 | -0.211981 | 0.351222 | -0.0021385000000000015 | -0.16758459999999997 | -0.02027 | 0.0028815999999999755 | 0.03700359999999997 | 0.11460360000000001 | 0.11953 | 0.14464840000000004 | 0.019898521766434783 | 0.14106212023939943 | 0.42318636071819826 |
-
方案六:基于主备链路,在source源相同的情况下,经过实时数仓计算出的指标,在同一段时间两条链路sink出来的结果数据,正常应该是保持一致,或者波动较小,比如10分钟延迟的主备链路,波动不超过10%,平均差异做到一致性做到90%以上;
方案1到5,都尝试过一遍,每个方案场景数据通过最大值、最小值、平均值、各百分位分布、方差、标准差等统计出来的数据分析,很难找到一个相当稳定的波动规律,也无法框定指标具体的阀值区间,实际演练过程,如果设置的波动告警阀值过大,真实生产上业务数据波动异常时,无法及时告警发现;设置过小,将导致告警频繁,对其准确性、有效性可能存在质疑,而且,实时投放的核心指标有几十个,每个指标对应的健康阀值都不一样,要收集、分析成本非常高,从演练的效果上看,也不是很明显;
整体评估下来,演练主要采用的是方案六:涉及到的实时投放核心指标数共收集29个,一段时间内(15min),主备链路指标波动差异不超过10%;
3、演练方式
红蓝对抗演练,将团队分为红(防)蓝(攻)两组
测试人员组成蓝军:负责制定混沌演练方案,执行目标系统故障注入,详细记录演练过程;
实时数仓开发为红军:负责发现故障、应急响应、排除故障,同时验证系统在不同故障场景下的容错能力、监控能力、人员响应能力、恢复能力等可靠性能力。
四、演练流程
整体演练过程,大致分为三个阶段:准备阶段、攻防阶段及复盘阶段;
1、准备阶段:
-
方案准备完评审通过后,确认好链路计划;
-
蓝军按计划根据事先制定的攻击方案,提前准备好相应的测试数据、脚本。
-
红军按计划根据事先制定的攻击方案,在演练前,提前确保环境可用,并进行监控防御、应急响应措施。
2、攻防阶段:
-
蓝队根据事先制定的攻击方案,模拟真实的攻击行为,按照约定的时间在演练链路(备用链路)进行攻击,进行故障注入,同时记录好相应的操作步骤,方便后续报告梳理;
-
红队在蓝军攻击后,通过飞书/邮件告警等通知方式实时关注监控系统运行情况,如有异常告警,需第一时间进行问题排查定位,在评估修复方案;
-
在攻防对抗的过程中,蓝军可根据红军的防御措施进行调整和改进攻击策略,尽力突破系统的防御并达到既定目标,同时红军也可分析蓝军的攻击手法和行为模型,不断改进防御措施来加强防御。
3、复盘和改进阶段:
-
在混沌演练结束后,进行总结和评估,分析红队和蓝队的表现,评估系统的安全性和抗攻击能力。
-
总结经验教训,总结成功的防御措施和失败的攻击手法,以便于改进系统的安全策略。
-
根据评估结果和总结经验,制定改进计划,修补系统中的漏洞和薄弱点,提升系统的抗风险能力。
五、攻防实战
本次演练共计有29个指标波动case,整体演练操作大同小异。
故障case编号 | 故障case名 | 故障场景描述 | 故障影响到的直接任务名 | 故障注入目标topic |
1 | 召回激活设备数在某个渠道下整点波动异常 | ads_dewu_***_test下的召回激活设备数指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
2 | 召回app浏览时间段在某个渠道下整点波动异常 | ads_dewu_***_test下的召回app浏览时间段指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
3 | 召回支付gmv在某个渠道下整点波动异常 | ads_dewu_***_test下的召回支付gmv指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
4 | 召回商品点击量在某个渠道下整点波动异常 | ads_dewu_***_test下的召回商品点击量指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
5 | 召回商品访问uv在某个渠道下整点波动异常 | ads_dewu_***_test下的召回商品访问uv指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
6 | 召回用户花销cost在某个渠道下整点波动异常 | ads_dewu_***_test下的召回用户花销cost指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
7 | 召回优惠券使用uv在某个渠道下整点波动异常 | ads_dewu_***_test下的召回优惠券使用uv指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
8 | 召回订单gmv在某个渠道下整点波动异常 | ads_dewu_***_test下的召回订单gmv指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
9 | 召回商品喜欢uv在某个渠道下整点波动异常 | ads_dewu_***_test下的召回商品喜欢uv指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
10 | 召回登陆uv在某个渠道下整点波动异常 | ads_dewu_***_test下的召回l登陆uv指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
11 | 召回客户生命周期价值在某个渠道下整点波动异常 | ads_dewu_***_test下的召回客户生命周期价值指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
12 | 召回nsau量在某个渠道下整点波动异常 | ads_dewu_***_test下的召回nsau量t指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
13 | 召回订单uv在某个渠道下整点波动异常 | ads_dewu_***_test下的召回订单uv指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
14 | 召回24小时订单量在某个渠道下整点波动异常 | ads_dewu_***_test下的召回24小时订单量指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
15 | 召回12小时订单量在某个渠道下整点波动异常 | ads_dewu_***_test下的召回12小时订单量指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
16 | 召回支付ue金额在某个渠道下整点波动异常 | ads_dewu_***_test下的召回支付ue金额指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
17 | 召回商品收藏uv在某个渠道下整点波动异常 | ads_dewu_***_test下的召回商品收藏uv指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
18 | 召回用户实付gmv在某个渠道下整点波动异常 | ads_dewu_***_test下的召回用户实付gmv指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
19 | 召回用户注册数在某个渠道下整点波动异常 | ads_dewu_***_test下的召回用户注册数指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
20 | 召回rta_weighting支付成功量在某个渠道下整点波动异常 | ads_dewu_***_test下的召回rta_weighting支付成功量指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
21 | 召回商品分享uv在某个渠道下整点波动异常 | ads_dewu_***_test下的召回商品分享uv指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
22 | 召回登陆时长在某个渠道下整点波动异常 | ads_dewu_***_test下的召回登陆时长指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
23 | 召回商品关注uv在某个渠道下整点波动异常 | ads_dewu_***_test下的召回商品关注uv指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
24 | 召回商品收藏点击pv在某个渠道下整点波动异常 | ads_dewu_***_test下的召回商品收藏点击pv指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
25 | 召回商品收藏曝光pv在某个渠道下整点波动异常 | ads_dewu_***_test下的召回商品收藏曝光pv指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
26 | 召回商品有效关注uv在某个渠道下整点波动异常 | ads_dewu_***_test下的召回商品有效关注uvt指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
27 | 召回商品有效流量数在某个渠道下整点波动异常 | ads_dewu_***_test下的召回商品有效流量数指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
28 | 召回商品浏览量在某个渠道下整点波动异常 | ads_dewu_***_test下的召回商品浏览量指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
29 | 召回次日用户留存数在某个渠道下整点波动异常 | ads_dewu_***_test下的召回次日用户留存数指标, 维度:小时,账户 | dwd_***_test | kafka集群 ads_dewu_***_test |
以其中case17 “召回商品收藏uv在某个渠道下整点波动异常”为例,具体的演练操作流程如下:
1、数据准备
(1)通过后台数据库,拉出生产主(备)链路,某个渠道(如`media_id` = '2')下某个整点(如`hour` = 10)下,召回商品收藏uv对应的整体统计值N;
--渠道小时整点维度下,商品收藏uv汇总数据
select `指标名称`, `日期`, '2' as `指标ID`, `小时段`, sum(`指标值`)
from table_a
where date = date_format(now(), '%Y%m%d')
and `指标名称` in ( '商品收藏uv' ) and `小时段` = 10
AND `指标id` = '2'
GROUP BY `指标名称`, `日期`, `小时段`
order by 指标名称;
(2)拉出备用链路,某个渠道(如`media_id` = '2')下某个整点(如`hour` = 10)下,具体的一条明细数据,记录商品收藏uv对应的值为n,把n改为n+0.1N,后续注入进备用链路,从而使得主备波动差异在10%;
-- 明细数据
select t.指标名称,t.账户id,t.计划ID,t.设备类型,t.指标值
from
(
select `账户id`, `计划id`, `指标名称`, `指标值`, `设备类型` ,
row_number() over (partition by 指标名称 order by 指标值 desc ) as rn
from table_a
where date = date_format(now(), '%Y%m%d') and `指标名称` in ('商品收藏uv')
and `设备类型` = '召回'
and `小时段` = 10
AND `指标id` = '2'
) t
where t.rn = 1 ORDER BY 指标名称
;
(3)整理后得到需要注入的数据数据,见标棕色部分:
故障case编号 | 故障case名 | 注入对象 | 数据准备 | 测试结果 | |||||||||
整点指标统计基准数据 | 整点明细数据 | 波动数据值metric_value(10%) | 调整后 | ||||||||||
指标 | 维度 | 指标汇总值 | |||||||||||
指标名称 | 日期 | 指标id | 小时段 | sum(`指标值`) | 指标名称 | 设备类型 | 指标值 | ||||||
17 | 商品收藏uv在某个渠道下整点波动异常 | topic:ads_dewu_***_test | 商品收藏uv | 20230608 | 2 | 10 | 1066 | 商品收藏uv | 召回 | 1 | 107.6 | {"指标名称":"商品收藏uv"," 账户ID":"null","计划id":"null","指标值":107.6,"日期":"20230608","小时段":10,"指标ID":"2","设备类型":"召回","proctime":32516055223} |
2、故障注入odps
(1)将需要注入的数据导入odps
导入前,需要在datawork空间中新建测试表du_qa_dw_dev.hundun_case,用于导入演练数据
-- drop table if EXISTS du_qa_dw_dev.hundun_case;
CREATE TABLE IF NOT EXISTS hundun_case
(
message STRING COMMENT '消息内容'
)
COMMENT '混沌演练'
;
(2)往du_qa_dw_dev.hundun_case表里灌数
(3)验证数据导入是否成功;
3、odps同步到kafka
执行flink同步脚本,将odsp du_qa_dw_dev.hundun_case表表数据同步到对应的kafka topic中
flink任务脚本:
--SQL
--********************************************************************--
--odps同步到kakfa脚本,用于实时数仓混沌演练异常注入使用
--********************************************************************--
-- 基本函数
CREATE FUNCTION JsonParseField AS 'com.alibaba.blink.udx.log.JsonParseField';
CREATE FUNCTION jsonStringUdf AS 'com.alibaba.blink.udx.udf.JsonStringUdfV2';
---同步账号表
CREATE TABLE `source` (
message VARCHAR
) WITH (
'connector' = 'du-odps',
'endPoint' = '***',
'project' = '***',
'tableName' = 'hundun_case_01',
'accessId' = '*******',
'accessKey' = '*******'
);
CREATE TABLE `kafka_sink` (
`messageKey` VARBINARY,
`message` VARBINARY,
PRIMARY KEY (`messageKey`) NOT ENFORCED
) WITH (
'connector' = 'du-kafka',
'topic' = '********',
'properties.bootstrap.servers' = '*******',
'properties.compression.type' = 'gzip',
'properties.batch.size' = '40960',
'properties.linger.ms' = '1000',
'key.format' = 'raw',
'value.format' = 'raw',
'value.fields-include' = 'EXCEPT_KEY'
);
INSERT INTO kafka_sink
SELECT
cast(MD5(message) as VARBINARY),
cast(message as VARBINARY)
FROM source
;
4、kafka平台查询数据
执行完flink同步任务后,可通过后台查询,对应的数据是否同步成功
5、异常注入通知
在异常注入完成后,可以通过飞书群通知,告知红军,如收到告警,需第一时间群告知;
蓝军:蓝军已完成数据准备,请红军在演练前确保环境OK且已完成规则配置,另外务必将演练时间计划及时同步通知到下游关联方;
蓝军:已完成注入;
6、告警触发通知
(1)红军在演练前,可通过监控平台提前配置好防御规则;
(2)在异常注入后,如符合预期,在15min内发现指标波动异常,红军需及时同步到演练群中:
中危**双链路主备一致监控
服务名:**** 环境:****** 告警时间:****** 触发条件:**双链路比对波动异常,持续10分钟 告警详情: 指标:prd_collect_uv主对比备下降:[-10%] 主:1066 备:956
业务域:实时数仓
应用负责人:***
(3)如不符合预期,未在15min内发现指标波动异常,红军需及时定位、跟进问题,并在修复后,沟通后续演练验证修复结果;
红军:15min内未收到告警,定位中
红军:原因已找到,由于***造成,导致告警数据没有及时发出,正在修复处理中
红军:已修复,请红军重新发起攻击
7、演练过程记录
收集、汇总记录演练过程中的每个操作,含时间点、执行人、操作等,如下:
时间 | 负责人 | 操作 |
**时**分**秒 | 蓝军 | 数据准备完成 |
**时**分**秒 | 蓝军 | 故障注入: (1) 注入数据同步到odps (2)启动flink任务,开始将数据同步到到kafka topic:ads_dewu_***_test (3) 任务结束,数据同步到kafka 注入完成 |
**时**分**秒 | 告警平台 | 告警发出:未收到告警,不符合预期 |
**时**分**秒 | 红军 | 问题跟进: 未及时触发告警,未收到告警信息,需排出原因; |
**时**分**秒 | 红军 | 问题定位:蓝军注入的账户id数据异常,导致监控任务存在被击穿情况,未及时触发告 |
**时**分**秒 | 红军 | 问题修复进展: (1)研发修复后,重新注入数据,后台可以查看到告警数据,到飞书没有及时告警出来,需联系告警平台同事看下 (2)告警有延时,超过1h收到 (3)联系告警平台处理后,通知蓝军重新注入验证 |
**时**分**秒 | 蓝军 | 重新完成注入 |
**时**分**秒 | 红军 | (1)在预期时间内,在演练群里发出告警信息 (2)流量注入恢复:观察是否可以接收数据 |
六、演练总结
结论 | 方案 | 现场记录 |
结果符合预期,但过程发生了很多意外 |
|
|
七、未来展望
实时数仓业务侧的混沌演练,从0到1,在经过一系列的探索实践后,通过主备链路比对方式,演练期间对于异常波动的指标,可以快速识别感知,从演练结果上,取的了不错的成效,但也存在一定的局限性,如:
(1)演练期间,通过人工注入的异常数据,如无法快速清除,可能影响到备用链路使用;
(2)对于没有备链路的实时指标波动,需要制定更精细化的可行方案,找寻指标健康波动范围;
这些都需要团队进一步去探索、解决,同时在演练的过程中,我们将不断积累、丰富演练case、完善演练库,后续计划通过引入工具(平台)、建立演练协助机制、定期定时演练等手段,使混沌演练更加自动化、规范化、常态化,提高实时数仓整体数据稳定;
更多技术好文,可关注微信‘得物技术’公众号