實時數(shù)倉混沌演練實踐
一、背景介紹
目前實時數(shù)倉提供的投放實時指標(biāo)優(yōu)先級別越來越重要,不再是單獨的報表展示等功能,特別是提供給下游規(guī)則引擎的相關(guān)數(shù)據(jù),直接對投放運營的廣告投放產(chǎn)生直接影響,數(shù)據(jù)延遲或者異常均可能產(chǎn)生直接或者間接的資產(chǎn)損失。
圖片
從投放管理平臺的鏈路全景圖來看,實時數(shù)倉是不可或缺的一環(huán),可以快速處理海量數(shù)據(jù),并迅速分析出有效信息,同時支持投放管理平臺的手動控盤。實時節(jié)點事故,將可能導(dǎo)致整個投放鏈路無法正常運行,另外,投放規(guī)則引擎是自動化操作,服務(wù)需要24小時運行,所以需要配置及時有效的數(shù)據(jù)質(zhì)量監(jiān)控預(yù)警,能快速識別到波動異常或者不符合業(yè)務(wù)的數(shù)據(jù),從而計劃引入混沌工程,希望可以通過主動注入故障的方式、盡可能提前感知風(fēng)險、發(fā)現(xiàn)潛在問題,并針對性地進(jìn)行防范、加固,避免故障發(fā)生時所帶來的嚴(yán)重后果,提高實時數(shù)倉整體抗風(fēng)險能力。
二、演練范圍
為了能更細(xì)致反應(yīng)出混沌演練情況,根據(jù)演練的內(nèi)容不同,將實時數(shù)倉混沌分為兩部分:技術(shù)側(cè)和業(yè)務(wù)側(cè)。
技術(shù)側(cè)混沌:基于中間件、數(shù)據(jù)庫、JVM、基礎(chǔ)資源、網(wǎng)絡(luò)、服務(wù)等注入常見的異常,根據(jù)實際業(yè)務(wù)中梳理的應(yīng)用核心場景進(jìn)行混沌演練,檢驗系統(tǒng)的脆弱性和應(yīng)急響應(yīng)能力,從而提升團(tuán)隊的穩(wěn)定性保障處理能力。
圖片
業(yè)務(wù)側(cè)混沌:對于電商活動密集型的公司來說,各種到達(dá)率、曝光率,以及更加宏觀的 GMV、用戶拉新數(shù)、用戶召喚數(shù)等,都能表現(xiàn)出業(yè)務(wù)的健康程度,在實際生活中,為了描述一種穩(wěn)定狀態(tài),我們需要一組指標(biāo)構(gòu)成一種模型,而不是單一指標(biāo)。無論是否采用混沌工程,識別出這類指標(biāo)的健康狀態(tài)都是至關(guān)重要的,所以要圍繞它們建立一整套完善的數(shù)據(jù)采集、監(jiān)控、預(yù)警機(jī)制,當(dāng)業(yè)務(wù)指標(biāo)發(fā)生波動較大時,我們能搞快速感知、定位、修復(fù)止血。
圖片
過往數(shù)倉混沌工程均是技術(shù)側(cè),此次在投放鏈路已搭建完成主備鏈路的前提下,期望通可以通過多輪業(yè)務(wù)側(cè)混沌,提高系統(tǒng)整體的數(shù)據(jù)異動感知能力。
三、演練計劃
工欲善其事,必先利其器,在執(zhí)行混沌演練前,需要準(zhǔn)備好前置工作,制定合理的演練SOP、方案、計劃,對演練環(huán)境、腳本、數(shù)據(jù)、工具,場景及爆炸半徑等進(jìn)行可能性評估,在確認(rèn)可行性ok的情況下,約好關(guān)聯(lián)方時間,再進(jìn)行實踐操作。
圖片
本篇主要和大家分享基于業(yè)務(wù)側(cè)的實時數(shù)倉混沌演練過程:
1.編寫演練SOP
SOP是一種標(biāo)準(zhǔn)的作業(yè)程序,就是將某一事件的操作步驟和要求,進(jìn)行細(xì)化、量化及優(yōu)化,形成一種標(biāo)準(zhǔn)的操作過程,關(guān)于業(yè)務(wù)側(cè)混沌,尤其是實時數(shù)倉數(shù)據(jù)相關(guān)的演練,我們也是第一次做,目前在業(yè)界也沒有找到相關(guān)的演練指導(dǎo)參考,處于探索階段,為了方便項目進(jìn)度的順利進(jìn)行及后續(xù)演練操作更加規(guī)范、高效,在演練前期大家經(jīng)過溝通、討論后,項目前期梳理的SOP演練模板,如下:
圖片
2.演練方案調(diào)研
先收集實時數(shù)倉投放鏈路核心指標(biāo)范圍,在此基礎(chǔ)上,拉取一段時間內(nèi)的歷史數(shù)據(jù)進(jìn)行分析,找到每個指標(biāo)對應(yīng)的健康波動閥值,從而在配置相應(yīng)的DQC規(guī)則監(jiān)控,對于波動不在健康閥值的異常指標(biāo),在分鐘級別(預(yù)期15min)內(nèi)及時告警,并快速排查響應(yīng)。為此,在演練前期,我們經(jīng)歷過一系列的方案調(diào)研、探索,如下:
「下文提供的方案,指標(biāo)數(shù)據(jù)都是以設(shè)備激活數(shù)為例進(jìn)行分析」
方案一: 按照天維度,收集最近一段時間,同一天每個整點設(shè)備激活數(shù),占當(dāng)天大盤占比,統(tǒng)計出最小值、最大值,作為該指標(biāo)的健康波動閥值;
圖片
- 方案二: 按照天維度,收集一段時間內(nèi),同一天相鄰整點指標(biāo)波動數(shù)據(jù)找規(guī)律,比如每天上午9點到10點的波動數(shù)據(jù),然后分別通過一系列的數(shù)學(xué)分布方法進(jìn)行數(shù)據(jù)統(tǒng)計,從而希望找一個相對穩(wěn)定的波動區(qū)間;
圖片
- 方案三: 按照天維度,收集一段時間內(nèi),相鄰天整點指標(biāo)波動數(shù)據(jù)找規(guī)律,比如昨天上午9點到前天上午9點的波動數(shù)據(jù),然后分別通過一系列的數(shù)學(xué)分布方法進(jìn)行數(shù)據(jù)統(tǒng)計,從而希望找一個相對穩(wěn)定的波動區(qū)間;
圖片
- 方案四:在前面三種方案的基礎(chǔ)上,指標(biāo)在工作日和周末的波動可能不一樣,所以我們在日維度統(tǒng)計的基礎(chǔ)上,我們也調(diào)研了周維度同比波動分布情況,比如每周一上午9點到上午10點的波動數(shù)據(jù),然后分別通過一系列的數(shù)學(xué)分布方法進(jìn)行數(shù)據(jù)統(tǒng)計,從而希望找一個相對穩(wěn)定的波動區(qū)間;
圖片
- 方案五:同理,我們也調(diào)研了周維度環(huán)比波動分布情況,比如本周一上午9點到上周一上午9點的波動數(shù)據(jù),然后分別通過一系列的數(shù)學(xué)分布方法進(jìn)行數(shù)據(jù)統(tǒng)計,從而希望找一個相對穩(wěn)定的波動區(qū)間;
圖片
- 方案六:基于主備鏈路,在source源相同的情況下,經(jīng)過實時數(shù)倉計算出的指標(biāo),在同一段時間兩條鏈路sink出來的結(jié)果數(shù)據(jù),正常應(yīng)該是保持一致,或者波動較小,比如10分鐘延遲的主備鏈路,波動不超過10%,平均差異做到一致性做到90%以上。
方案1到5,都嘗試過一遍,每個方案場景數(shù)據(jù)通過最大值、最小值、平均值、各百分位分布、方差、標(biāo)準(zhǔn)差等統(tǒng)計出來的數(shù)據(jù)分析,很難找到一個相當(dāng)穩(wěn)定的波動規(guī)律,也無法框定指標(biāo)具體的閥值區(qū)間,實際演練過程,如果設(shè)置的波動告警閥值過大,真實生產(chǎn)上業(yè)務(wù)數(shù)據(jù)波動異常時,無法及時告警發(fā)現(xiàn);設(shè)置過小,將導(dǎo)致告警頻繁,對其準(zhǔn)確性、有效性可能存在質(zhì)疑,而且,實時投放的核心指標(biāo)有幾十個,每個指標(biāo)對應(yīng)的健康閥值都不一樣,要收集、分析成本非常高,從演練的效果上看,也不是很明顯。
整體評估下來,演練主要采用的是方案六:涉及到的實時投放核心指標(biāo)數(shù)共收集29個,一段時間內(nèi)(15min),主備鏈路指標(biāo)波動差異不超過10%。
3.演練方式
紅藍(lán)對抗演練,將團(tuán)隊分為紅(防)藍(lán)(攻)兩組。
測試人員組成藍(lán)軍:負(fù)責(zé)制定混沌演練方案,執(zhí)行目標(biāo)系統(tǒng)故障注入,詳細(xì)記錄演練過程;
實時數(shù)倉開發(fā)為紅軍:負(fù)責(zé)發(fā)現(xiàn)故障、應(yīng)急響應(yīng)、排除故障,同時驗證系統(tǒng)在不同故障場景下的容錯能力、監(jiān)控能力、人員響應(yīng)能力、恢復(fù)能力等可靠性能力。
圖片
四、演練流程
整體演練過程,大致分為三個階段:準(zhǔn)備階段、攻防階段及復(fù)盤階段。
圖片
1.準(zhǔn)備階段
- 方案準(zhǔn)備完評審?fù)ㄟ^后,確認(rèn)好鏈路計劃;
- 藍(lán)軍按計劃根據(jù)事先制定的攻擊方案,提前準(zhǔn)備好相應(yīng)的測試數(shù)據(jù)、腳本;
- 紅軍按計劃根據(jù)事先制定的攻擊方案,在演練前,提前確保環(huán)境可用,并進(jìn)行監(jiān)控防御、應(yīng)急響應(yīng)措施。
2.攻防階段
- 藍(lán)隊根據(jù)事先制定的攻擊方案,模擬真實的攻擊行為,按照約定的時間在演練鏈路(備用鏈路)進(jìn)行攻擊,進(jìn)行故障注入,同時記錄好相應(yīng)的操作步驟,方便后續(xù)報告梳理;
- 紅隊在藍(lán)軍攻擊后,通過飛書/郵件告警等通知方式實時關(guān)注監(jiān)控系統(tǒng)運行情況,如有異常告警,需第一時間進(jìn)行問題排查定位,在評估修復(fù)方案;
- 在攻防對抗的過程中,藍(lán)軍可根據(jù)紅軍的防御措施進(jìn)行調(diào)整和改進(jìn)攻擊策略,盡力突破系統(tǒng)的防御并達(dá)到既定目標(biāo),同時紅軍也可分析藍(lán)軍的攻擊手法和行為模型,不斷改進(jìn)防御措施來加強(qiáng)防御。
3.復(fù)盤和改進(jìn)階段
- 在混沌演練結(jié)束后,進(jìn)行總結(jié)和評估,分析紅隊和藍(lán)隊的表現(xiàn),評估系統(tǒng)的安全性和抗攻擊能力;
- 總結(jié)經(jīng)驗教訓(xùn),總結(jié)成功的防御措施和失敗的攻擊手法,以便于改進(jìn)系統(tǒng)的安全策略;
- 根據(jù)評估結(jié)果和總結(jié)經(jīng)驗,制定改進(jìn)計劃,修補(bǔ)系統(tǒng)中的漏洞和薄弱點,提升系統(tǒng)的抗風(fēng)險能力。
五、攻防實戰(zhàn)
本次演練共計有29個指標(biāo)波動case,整體演練操作大同小異。
圖片
以其中case17 “召回商品收藏uv在某個渠道下整點波動異?!睘槔?,具體的演練操作流程如下。
1.數(shù)據(jù)準(zhǔn)備
- 通過后臺數(shù)據(jù)庫,拉出生產(chǎn)主(備)鏈路,某個渠道(如`media_id` = '2')下某個整點(如`hour` = 10)下,召回商品收藏uv對應(yīng)的整體統(tǒng)計值N。
--渠道小時整點維度下,商品收藏uv匯總數(shù)據(jù)
select
`指標(biāo)名稱`,
`日期`,
'2' as `指標(biāo)ID`,
`小時段`,
sum(`指標(biāo)值`)
from table_a
where
date = date_format(now(), '%Y%m%d')
and `指標(biāo)名稱` in ( '商品收藏uv' )
and `小時段` = 10
AND `指標(biāo)id` = '2'
GROUP BY
`指標(biāo)名稱`,
`日期`,
`小時段`
order by
指標(biāo)名稱;
- 拉出備用鏈路,某個渠道(如`media_id` = '2')下某個整點(如`hour` = 10)下,具體的一條明細(xì)數(shù)據(jù),記錄商品收藏uv對應(yīng)的值為n,把n改為n+0.1N,后續(xù)注入進(jìn)備用鏈路,從而使得主備波動差異在10%。
-- 明細(xì)數(shù)據(jù)
select
t.指標(biāo)名稱,t.賬戶id,t.計劃ID,t.設(shè)備類型,t.指標(biāo)值
from
(
select
`賬戶id`,
`計劃id`,
`指標(biāo)名稱`,
`指標(biāo)值`,
`設(shè)備類型` ,
row_number() over (partition by 指標(biāo)名稱 order by 指標(biāo)值 desc ) as rn
from table_a
where
date = date_format(now(), '%Y%m%d')
and `指標(biāo)名稱` in ('商品收藏uv')
and `設(shè)備類型` = '召回'
and `小時段` = 10
AND `指標(biāo)id` = '2'
) t
where
t.rn = 1
ORDER BY 指標(biāo)名稱;
整理后得到需要注入的數(shù)據(jù)數(shù)據(jù),見標(biāo)黃部分。
圖片
2.故障注入odps
- 將需要注入的數(shù)據(jù)導(dǎo)入odps。
導(dǎo)入前,需要在datawork空間中新建測試表du_qa_dw_dev.hundun_case,用于導(dǎo)入演練數(shù)據(jù)
-- drop table if EXISTS du_qa_dw_dev.hundun_case;
CREATE TABLE IF NOT EXISTS hundun_case
(
message STRING COMMENT '消息內(nèi)容'
)
COMMENT '混沌演練'
;
- 往du_qa_dw_dev.hundun_case表里灌數(shù)。
圖片
圖片
- 驗證數(shù)據(jù)導(dǎo)入是否成功。
圖片
3.odps同步到kafka
執(zhí)行flink同步腳本,將odsp du_qa_dw_dev.hundun_case表表數(shù)據(jù)同步到對應(yīng)的kafka topic中。
flink任務(wù)腳本:
--SQL
--********************************************************************--
--odps同步到kakfa腳本,用于實時數(shù)倉混沌演練異常注入使用
--********************************************************************--
-- 基本函數(shù)
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平臺查詢數(shù)據(jù)
執(zhí)行完flink同步任務(wù)后,可通過后臺查詢,對應(yīng)的數(shù)據(jù)是否同步成功。
圖片
5.異常注入通知
在異常注入完成后,可以通過飛書群通知,告知紅軍,如收到告警,需第一時間群告知。
藍(lán)軍:藍(lán)軍已完成數(shù)據(jù)準(zhǔn)備,請紅軍在演練前確保環(huán)境OK且已完成規(guī)則配置,另外務(wù)必將演練時間計劃及時同步通知到下游關(guān)聯(lián)方;
藍(lán)軍:已完成注入。
6.告警觸發(fā)通知
- 紅軍在演練前,可通過監(jiān)控平臺提前配置好防御規(guī)則。
圖片
- 在異常注入后,如符合預(yù)期,在15min內(nèi)發(fā)現(xiàn)指標(biāo)波動異常,紅軍需及時同步到演練群中。
中危**雙鏈路主備一致監(jiān)控
服務(wù)名:**** 環(huán)境:****** 告警時間:****** 觸發(fā)條件:**雙鏈路比對波動異常,持續(xù)10分鐘 告警詳情:指標(biāo):prd_collect_uv主對比備下降:[-10%] 主:1066 備:956
業(yè)務(wù)域:實時數(shù)倉
應(yīng)用負(fù)責(zé)人:***
- 如不符合預(yù)期,未在15min內(nèi)發(fā)現(xiàn)指標(biāo)波動異常,紅軍需及時定位、跟進(jìn)問題,并在修復(fù)后,溝通后續(xù)演練驗證修復(fù)結(jié)果。
紅軍:15min內(nèi)未收到告警,定位中
紅軍:原因已找到,由于***造成,導(dǎo)致告警數(shù)據(jù)沒有及時發(fā)出,正在修復(fù)處理
紅軍:已修復(fù),請紅軍重新發(fā)起攻擊
7.演練過程記錄
收集、匯總記錄演練過程中的每個操作,含時間點、執(zhí)行人、操作等,如下:
圖片
六、演練總結(jié)
七、未來展望
實時數(shù)倉業(yè)務(wù)側(cè)的混沌演練,從0到1,在經(jīng)過一系列的探索實踐后,通過主備鏈路比對方式,演練期間對于異常波動的指標(biāo),可以快速識別感知,從演練結(jié)果上,取得了不錯的成效,但也存在一定的局限性,如:
- 演練期間,通過人工注入的異常數(shù)據(jù),如無法快速清除,可能影響到備用鏈路使用。
- 對于沒有備鏈路的實時指標(biāo)波動,需要制定更精細(xì)化的可行方案,找尋指標(biāo)健康波動范圍。
這些都需要團(tuán)隊進(jìn)一步去探索、解決,同時在演練的過程中,我們將不斷積累、豐富演練case、完善演練庫,后續(xù)計劃通過引入工具(平臺)、建立演練協(xié)助機(jī)制、定期定時演練等手段,使混沌演練更加自動化、規(guī)范化、常態(tài)化,提高實時數(shù)倉整體數(shù)據(jù)穩(wěn)定。