如何避免這10類常見故障?B站資料庫架構設計做了這5步……
# 一分鐘精華速覽 #
今年3月GitHub在一週內出現了多次服務不可用的情況,每起事件持續時長在 2-5 小時,據有媒體統計,GitHub在一週中多次中斷影響的開發者數量高達 7300 萬。事後GitHub 高階工程副總裁 Keith Ballinger 發文表示,「我知道這會影響許多客戶的生產力,我們也非常重視這一點。過去幾周發生的宕機事件根本原因是我們的‘MySQL1’叢集中的資源爭奪,在負載高峰期,影響了 GitHub 大量服務和功能。」 資料庫故障對企業系統服務的影響可見一斑,今天我將結合B站自身的實戰經驗來跟大家說說資料庫故障治理相關的心得:
資料延遲包含資料庫的主從延遲和依賴binlog的資料訂閱服務的延遲。 1.2.1 主從複製延遲 主從複製延遲是線上經常出現的問題之一,對於讀寫分離的業務來說,從庫延遲的影響可能是致命的。導致主從延遲的原因一般有:
上面講述了常見的資料庫故障,下面我們來說說如何從資料庫架構設計上來規避故障,這裡會結合B站的一些實踐來跟大家分享。
「好文推薦」 👉 美圖SRE:一次線上大事故,我悟出了故障治理的3步9招 👉監控告警怎麼搭建比較合理? 👉故障覆盤後的告警如何加出效果? 👉阿里雲彈性計算SRE實踐:億級呼叫量下的預警治理 📢點選【閱讀原文】直達TakinTalks穩定性社群,獲取更多實戰資料!
今年3月GitHub在一週內出現了多次服務不可用的情況,每起事件持續時長在 2-5 小時,據有媒體統計,GitHub在一週中多次中斷影響的開發者數量高達 7300 萬。事後GitHub 高階工程副總裁 Keith Ballinger 發文表示,「我知道這會影響許多客戶的生產力,我們也非常重視這一點。過去幾周發生的宕機事件根本原因是我們的‘MySQL1’叢集中的資源爭奪,在負載高峰期,影響了 GitHub 大量服務和功能。」 資料庫故障對企業系統服務的影響可見一斑,今天我將結合B站自身的實戰經驗來跟大家說說資料庫故障治理相關的心得:
作者介紹
B站DBA Leader-王志廣十年以上資料庫運維經驗,曾在多家大型網際網路公司任職,主導和參與了多家資料庫私有云建設、資料庫多活、資料庫架構從商業資料庫到開源資料庫的遷移。目前主要專注於B站資料庫多活、資料庫服務治理等。
溫馨提醒:本文約4900字,預計花費8分鐘閱讀。
回覆 “交流” 進入讀者交流群;
一、什麼是資料庫故障
資料庫故障顧名思義就是資料庫相關的故障,它在學術上沒有明確的定義,故各公司一般以對應用的影響範圍來量化定義資料庫故障。如下圖所示:二、常見的資料庫故障有哪些?
故障治理就得對症下藥,所以治理的第一步就是明確常見的資料庫故障有哪些,今天就MySQL、快取兩個大方向來跟大家一起梳理一下。1、MySQL
作為在網際網路公司廣泛使用的傳統意義上的資料庫,MySQL的故障可以分為以下幾種: 1.1 例項不可用 資料庫作為一種特殊的應用,在其生命週期內無法保證100%可用。資料庫例項不可用的原因一般有:
- 硬體故障:硬體故障是生產環境中無法避免問題。常見的硬體故障包含了CPU、記憶體、磁碟、主機板等。
- 系統故障:系統故障包含作業系統bug和資料庫bug。
- 網路故障:網路故障包含網路裝置故障和專線故障。
- 其他:如資源分配不合理導致的OOM。
資料延遲包含資料庫的主從延遲和依賴binlog的資料訂閱服務的延遲。 1.2.1 主從複製延遲 主從複製延遲是線上經常出現的問題之一,對於讀寫分離的業務來說,從庫延遲的影響可能是致命的。導致主從延遲的原因一般有:
- 主庫執行了一個非常大的資料變更事務;
- 主庫變更頻率過快, 導致從庫跟不上;
- 使用原生的表結構變更語句進行大表的DDL ;
- 從庫配置引數較低、硬體效能較差;
- 從庫負載過高,導致效能變差 ;
- 從庫MDL 鎖 ;
- 主從之間網路問題 ;
- 主從複製Bug (多執行緒複製 bug 最為常見)。
- 上游從庫延遲
- Kafka效能瓶頸
- canal類元件效能瓶頸
- 未開啟雙一引數,在宕機場景下丟失;
- 未使用半同步複製,在宕機場景下丟失;
- 使用三方工具進行DDL的某些特殊場景下可能會丟, 比如pt-osc、gh-ost;
- 誤操作、誤刪除資料或者蓄意刪除,也就是常說的運維人員刪庫跑路。
- 新業務上線 SQL 效率較差或者沒有合適的索引;
- 業務場景發生改變, 邊緣場景被觸發;
- 資料傾斜, 導致未走合適的索引;
- Innodb buffer pool 命中率低, 觸發大量物理讀;
- 優化器 bug, 導致未走最優索引宿主機磁碟異常。
- 突發流量;
- 上游快取失效;
- 大型活動中流量超過預期。
2、快取
常見的快取故障包含以下幾種:快取穿透、快取擊穿、快取雪崩,下面展開詳細說說。 2.1 快取穿透 快取穿透是指查詢一個根本不存在的資料,快取層和持久層都不會命中。在日常工作中出於容錯的考慮,如果從持久層查不到資料則不寫入快取層,快取穿透將導致不存在的資料每次請求都要到持久層去查詢,失去了快取保護後端持久的意義。 造成快取穿透的原因有兩個。
- 自身業務程式碼或者資料出現問題(例如:set 和 get 的key不一致)。
- 一些惡意攻擊、爬蟲等造成大量空命中。
- 當前key是一個熱點key(例如一個秒殺活動),併發量非常大。
- 重建快取不能在短時間完成,可能是一個複雜計算,例如複雜的SQL、多次IO、多個依賴等。在快取失效的瞬間,有大量執行緒來重建快取,造成後端負載加大,甚至可能會讓應用崩潰。
- 資料庫瞬間被大量的流量打死
- 該服務介面訪問時間過長,導致耗盡了執行緒資源,從而引起整個系統的崩潰。
三、B站在資料庫故障治理方面做了啥?
上面講述了常見的資料庫故障,下面我們來說說如何從資料庫架構設計上來規避故障,這裡會結合B站的一些實踐來跟大家分享。
1、高可用
高可用(High Availability)是系統架構設計中必須考慮的因素之一,它通常是指,通過設計減少系統不能提供服務的時間。所以在做資料架構設計時一定要考慮HA 能力,無論是選用叢集模式(MGR、PXC 等),或是使用傳統主從複製加上其他高可用元件(Orchestrator、MySQL Replication Manager、MHA等),都可以幫我們在例項不可用時把損失最小化。
2、擴容
- 垂直擴容:增大 buffer pool、 cpu 限制等配額,需要平臺側完善 Quota 管理和變更能力。
- 水平擴容:對於MySQL來講, 應急快速水平擴容只能用於讀負載,我們會有一些異地機房的例項,一般情況下用作災備以及離線用途, 在極端場景下可以通過平臺操作一鍵接入讀負載池;對於 TiDB 來講,我們把計算節點放入 k8s,通過k8s 的HPA能力進行水平彈性伸縮。
3、多活建設
- 異地災備: 當主機房的例項全部不可用時進行切換,一般是由高可用元件觸發切換,高可用元件本身應該是一個分散式跨機房的架構。 比如在B 站, 我們的高可用元件是三機房投票決策的,同時應當注意避免跨機房專線異常造成的誤判以及誤切換熔斷策略。
- 同城雙活: 主庫在同城某一個 zone,從庫則分佈在同城的不同 zone,每個 zone 的讀請求實現單元內閉環,寫請求則跨 zone 訪問對應的主庫,需要在資料庫proxy 或者sdk層實現請求路由的自動感知和判斷。
- 異地多活: 依賴業務單元化改造,讀寫請求全部單元內閉環,要求整體架構具備單元流量排程以及異常流量矯正的能力。屬於同一個 global cluster 的叢集間通過 DTS 進行雙向資料同步,DTS 層需要解決資料迴環問題以及衝突檢測機制,對於資料衝突的場景提供不同的策略,比如覆蓋策略、暫停同步策略等。對於衝突資料也可以考慮寫入訊息佇列,便於業務側矯正處理,同時應具備全域性發號器主鍵填充能力,避免雙向同步的主鍵衝突。
- 兩地三中心: 可以簡單理解為同城多活加上異地災備架構,其中災備機房應當根據災難承受程度和資料保護程度來權衡地理距離。
4、Proxy資料庫代理
- 讀寫分離
- 攔截
- 限流
- 熔斷
5、慢查詢預警
6、一個具體的小案例分享
下面分享一個針對複製bug的處理過程。
問題背景:
業務研發收到多起建立預約的問題反饋,如:建立預約後拉取不到預約詳情
查詢從庫未讀取到相關資料
核心處理步驟:
- 後續優化:
- 增加心跳錶以規避複製bug導致的常規復制監控不可用。
- 基於高可用、心跳錶、資料庫負載(QPS、CPU、網路等)等資訊,實現在從庫異常情況下將流量切換到主庫和資料訂閱的資料來源切換到主庫。
- 說明:
四、資料庫故障演練應該怎麼做?
五、總結與展望
回覆【0922】訂閱故障演練內容
回覆【交流】進入讀者交流群
回覆【7161】獲取「B站多活容災建設」資料
宣告:本文由公眾號「TakinTalks穩定性社群」聯合社區專家共同原創撰寫,如需轉載,請後臺回覆“轉載”獲得授權。 更多故障治理內容「好文推薦」 👉 美圖SRE:一次線上大事故,我悟出了故障治理的3步9招 👉監控告警怎麼搭建比較合理? 👉故障覆盤後的告警如何加出效果? 👉阿里雲彈性計算SRE實踐:億級呼叫量下的預警治理 📢點選【閱讀原文】直達TakinTalks穩定性社群,獲取更多實戰資料!
「其他文章」
- B站容量管理:遊戲賽事等大型活動資源如何快速提升10 倍?
- 虎牙SRE談可觀測:如何做到比使用者和老闆更早發現業務異常?
- 中國人壽業務穩定性保障:“1 1 N” 落地生產全鏈路壓測
- 電商系統的高質量容量保障是怎樣“煉成”的?
- 微盟全鏈路壓測:如何幫助電商業務實現 10 倍效能提升?
- 哈囉出行高質量故障覆盤法:“3 5 3”(附模板)
- 去哪兒是如何做到大規模故障演練的?|TakinTalks
- 開發任務都完不成,哪有空搞穩定性?先看看這 13 條建議|TakinTalks 論道
- 如何避免這10類常見故障?B站資料庫架構設計做了這5步……
- 阿里雲彈性計算SRE實踐:億級呼叫量下的預警治理六要素
- 美圖SRE:一次線上大事故,我悟出了故障治理的3步9招