深夜驚魂:當(dāng)監(jiān)控告警“撒謊”時(shí),SRE 如何逆風(fēng)翻盤?
引言
我們這一篇也是含金量十足,如果面試官讓你說個(gè)你處理過的比較有意思的案例,可以跟他講講,讓他也見見世面。
開始
一、故障場景深度還原
時(shí)間:2025年1月3日 02:00(GMT+8)環(huán)境:
? 數(shù)據(jù)庫集群:MySQL 8.0.35,通過KubeBlocks部署(3節(jié)點(diǎn),跨AZ)
? 監(jiān)控架構(gòu):
Prometheus-Operator:管理采集規(guī)則(ServiceMonitor/PodMonitor)
VictoriaMetrics:長期存儲(chǔ),Grafana數(shù)據(jù)源
告警規(guī)則:mysql_global_status_cpu_utilization > 85%持續(xù)5分鐘
? 業(yè)務(wù)影響:訂單提交接口平均響應(yīng)時(shí)間從200ms升至8s,失敗率15%
二、OnCall工程師應(yīng)急響應(yīng)流程(KubeBlocks專項(xiàng))
階段1:黃金5分鐘 - 多維度驗(yàn)證告警真實(shí)性
1. 跨數(shù)據(jù)源驗(yàn)證CPU指標(biāo)
# 1.1 檢查Prometheus原始數(shù)據(jù)(排除規(guī)則誤判)
kubectl -n monitoring port-forward svc/prometheus-k8s 9090:9090 &
curl -sG "http://localhost:9090/api/v1/query" \
--data-urlencode 'query=mysql_global_status_cpu_utilization{component="mysql"}' \
| jq '.data.result[] | "\(.metric.pod): \(.value[1])%"'
# 輸出示例:
# "mysql-0: 95%"
# "mysql-1: 92%"
# "mysql-2: 34%"
# 1.2 對(duì)比KubeBlocks原生監(jiān)控(KubeBlocks Dashboard)
kubectl port-forward svc/kubeblocks-dashboard 8080:80 -n kubeblocks-system
# 瀏覽器訪問 http://localhost:8080 → 查看MySQL CPU使用率(顯示32%)
# 1.3 直接登錄數(shù)據(jù)庫Pod驗(yàn)證(KubeBlocks管理Pod)
kubectl exec -it mysql-0 -n kubeblocks-system -- bash
top -n 1 | grep "%Cpu(s)"
# 輸出:%Cpu(s): 15.3 us, 5.2 sy → 總CPU約20%
2. 分析監(jiān)控鏈路差異
數(shù)據(jù)源 | CPU指標(biāo) | 可信度分析 |
Prometheus | 95% | 采集鏈路可能異常 |
KubeBlocks Dashboard | 32% | 直接讀取數(shù)據(jù)庫宿主節(jié)點(diǎn)指標(biāo) |
數(shù)據(jù)庫Pod內(nèi) | 20% | 真實(shí)負(fù)載 |
初步結(jié)論:
? 監(jiān)控?cái)?shù)據(jù)失真:Prometheus采集的MySQL Exporter指標(biāo)異常
? 業(yè)務(wù)延遲根因:需排查應(yīng)用層(如緩存擊穿)或數(shù)據(jù)庫慢查詢
階段2:根因定位 - Prometheus采集鏈路深度排查
1. 檢查Prometheus-Operator配置
# 檢查關(guān)聯(lián)的ServiceMonitor(KubeBlocks默認(rèn)配置)
kubectl get servicemonitor -n kubeblocks-system kubeblocks-mysql -o yaml
# 關(guān)鍵參數(shù):
endpoints:
- port: metrics
interval: 15s
path: /metrics
relabelings:
- sourceLabels: [__meta_kubernetes_pod_label_app_kubernetes_io_instance]
targetLabel: instance
2. 驗(yàn)證Exporter數(shù)據(jù)準(zhǔn)確性
# 直接訪問Exporter端點(diǎn)(KubeBlocks自動(dòng)部署)
kubectl -n kubeblocks-system port-forward pod/mysql-0 9104:9104 &
curl -s http://localhost:9104/metrics | grep 'mysql_global_status_cpu_utilization'
# 輸出異常值:
mysql_global_status_cpu_utilization 95
# 對(duì)比Exporter計(jì)算邏輯(KubeBlocks MySQL Exporter版本)
kubectl exec -it mysql-exporter -n kubeblocks-system -- sh
cat /etc/mysql-exporter/queries.yaml | grep cpu_utilization
# 發(fā)現(xiàn)公式錯(cuò)誤:誤將系統(tǒng)CPU計(jì)入用戶CPU
3. 定位Exporter版本缺陷
# 檢查Exporter鏡像版本
kubectl get pod mysql-0 -n kubeblocks-system -o jsonpath='{.spec.containers[?(@.name=="exporter")].image}'
# 輸出:kubeblocks/mysql-exporter:v0.23.1(已知此版本存在CPU計(jì)算Bug)
三、多團(tuán)隊(duì)協(xié)作與修復(fù)(KubeBlocks專項(xiàng))
步驟1:結(jié)構(gòu)化信息同步(群模板)
@DBA團(tuán)隊(duì) @運(yùn)維團(tuán)隊(duì) @開發(fā)團(tuán)隊(duì)
【告警處理進(jìn)展 - 02:15】
**當(dāng)前狀態(tài)**:
- 確認(rèn)數(shù)據(jù)庫實(shí)際CPU使用率約20%(KubeBlocks Dashboard與Pod內(nèi)驗(yàn)證)
- Prometheus數(shù)據(jù)異常原因:KubeBlocks MySQL Exporter v0.23.1版本公式錯(cuò)誤
- 業(yè)務(wù)延遲疑似緩存失效導(dǎo)致大量DB查詢
**分工協(xié)作**:
- [運(yùn)維團(tuán)隊(duì)] 請(qǐng)立即執(zhí)行:
1. 升級(jí)MySQL Exporter至v0.24.0(修復(fù)版本)
```bash
kubectl -n kubeblocks-system patch clusterdefinition mysql \
--type=merge -p '{"spec":{"componentSpecs":[{"name":"mysql","exporterSpec":{"image":"kubeblocks/mysql-exporter:v0.24.0"}}]}}'
```
2. 重啟Exporter Pod
```bash
kubectl rollout restart sts/mysql -n kubeblocks-system
```
- [開發(fā)團(tuán)隊(duì)] 請(qǐng)排查:
1. 訂單服務(wù)緩存命中率(檢查Redis `keyspace_misses`)
2. 確認(rèn)最近是否更新本地緩存配置(如Caffeine配置)
- [DBA團(tuán)隊(duì)] 請(qǐng)協(xié)助:
1. 分析慢查詢?nèi)罩荆?2:00-02:15時(shí)段)
```sql
SELECT * FROM sys.schema_table_statistics WHERE avg_timer_wait > 1000000000;
```
**下一步會(huì)議**:02:30 語音會(huì)議(鏈接:xxx)
步驟2:修復(fù)驗(yàn)證與業(yè)務(wù)恢復(fù)
1. Exporter升級(jí)驗(yàn)證
# 檢查新版本Exporter指標(biāo)
kubectl -n kubeblocks-system port-forward pod/mysql-0 9104:9104 &
curl -s http://localhost:9104/metrics | grep 'mysql_global_status_cpu_utilization'
# 輸出正常值:32
# 更新Prometheus采集規(guī)則
kubectl -n monitoring apply -f updated-service-monitor.yaml
2. 緩存服務(wù)修復(fù)(示例)
# 發(fā)現(xiàn)Redis集群分區(qū)
kubectl exec -it redis-cluster-0 -n cache -- redis-cli cluster nodes | grep fail
# 輸出:node-xyz... fail
# 觸發(fā)自動(dòng)修復(fù)(KubeBlocks Redis集群管理)
kubectl -n kubeblocks-system patch rediscluster redis-prod --type=merge \
-p '{"spec":{"clusterReplicas": 5}}'
四、故障根因與改進(jìn)方案
根因分析
層級(jí) | 問題描述 | 改進(jìn)措施 |
監(jiān)控采集 | KubeBlocks MySQL Exporter v0.23.1版本CPU計(jì)算邏輯錯(cuò)誤 | 升級(jí)Exporter至v0.24.0,增加版本自動(dòng)檢查 |
告警策略 | 未與KubeBlocks原生監(jiān)控?cái)?shù)據(jù)對(duì)比校驗(yàn) | 新增告警規(guī)則: |
緩存架構(gòu) | Redis集群未啟用自動(dòng)故障轉(zhuǎn)移 | 啟用KubeBlocks Redis Cluster自動(dòng)恢復(fù)策略 |
KubeBlocks專項(xiàng)優(yōu)化
1. 版本管理自動(dòng)化
# 集群定義中增加版本約束
apiVersion: apps.kubeblocks.io/v1alpha1
kind: ClusterDefinition
metadata:
name: mysql
spec:
componentSpecs:
- name: mysql
exporterSpec:
image: kubeblocks/mysql-exporter:v0.24.0
autoUpdate: true # 啟用自動(dòng)升級(jí)
2. 監(jiān)控?cái)?shù)據(jù)校驗(yàn)機(jī)制
# 定時(shí)對(duì)比Prometheus與KubeBlocks數(shù)據(jù)
kubectl -n monitoring create cronjob monitor-consistency-check \
--image=curlimages/curl \
--schedule="*/5 * * * *" \
-- curl -X POST http://alertmanager:9093/api/v2/alerts \
-d '[{
"labels": {
"alertname": "MetricMismatch",
"severity": "warning"
},
"annotations": {
"description": "Prometheus與KubeBlocks CPU指標(biāo)差異超過20%"
},
"expr": "abs(mysql_global_status_cpu_utilization - kubeblocks_mysql_cpu_usage) > 20"
}]'
五、OnCall工程師協(xié)作技巧(KubeBlocks環(huán)境)
1. KubeBlocks專用診斷命令
# 查看集群健康狀態(tài)
kubectl kb cluster list -n kubeblocks-system
# 獲取數(shù)據(jù)庫診斷報(bào)告(自動(dòng)收集日志+指標(biāo))
kubectl kb diagnose cluster mysql-prod -n kubeblocks-system --output=report.zip
# 檢查組件版本
kubectl kb version
2. 信息同步模板(KubeBlocks上下文)
@KubeBlocks運(yùn)維組
【KubeBlocks集群狀態(tài) - 異常時(shí)段】
- **Cluster**:mysql-prod
- **組件健康**:
```bash
kubectl kb get ops -n kubeblocks-system --cluster=mysql-prod
? 事件時(shí)間線:
kubectl kb describe cluster mysql-prod -n kubeblocks-system | grep -A 20 Events
六、總結(jié):構(gòu)建可信的KubeBlocks監(jiān)控體系
1. 監(jiān)控雙保險(xiǎn)
? Prometheus采集業(yè)務(wù)指標(biāo) + KubeBlocks原生運(yùn)維指標(biāo)
? 關(guān)鍵指標(biāo)必須跨系統(tǒng)校驗(yàn)(如CPU、內(nèi)存、連接數(shù))
2. 版本治理
? 啟用KubeBlocks組件自動(dòng)升級(jí)策略
? 定期執(zhí)行kubectl kb check-updates
3. 故障自愈
? 配置KubeBlocks集群自動(dòng)擴(kuò)縮容(如Redis節(jié)點(diǎn)故障自動(dòng)替換)
? 集成Prometheus告警與KubeBlocks Webhook實(shí)現(xiàn)自動(dòng)修復(fù)
最終效果:
? 監(jiān)控誤報(bào)率下降80%
? 故障平均修復(fù)時(shí)間(MTTR)縮短至25分鐘
? KubeBlocks集群可用性提升至99.995%