深度 | 實時歷史資料庫儲存成本驚人,怎麼破?
作者:胡刀 阿里雲運維專家
舟濟 阿里雲解決方案架構師
實時歷史庫需求背景
-
儲存成本巨大 ,進而導致成本遠大於收益,比如釘釘聊天資訊資料量在高度壓縮後接近50PB,很難想象這些資料不做壓縮會帶來多大的資金開銷 -
效能挑戰巨大 ,隨著資料量越來越大,即使針對資料做了分散式儲存,單例項容量超過大概5T以後效能也會急劇下滑,進而影響到近期活躍資料的查詢效能,拖垮整個叢集
-
運維難度巨大 ,比如針對海量資料下發一個表資料結構變更操作,很難想象全部完成需要多長時間
實時歷史庫場景需求分析
-
成本可控 ,歷史資料的儲存成本無法接受和線上庫一樣線性增長
-
實時查詢 ,歷史資料的查詢RT要做到與線上活躍庫幾乎一致
-
查詢頻次較低 ,一般來說,越“舊”的資料查詢頻率越低
-
統一查詢入口 ,不管是活躍資料還是歷史資料,查詢入口保持一致
-
改造成本需要儘可能低 ,最好能做到不做任何應用程式碼修改,可以認為歷史庫對程式開發人員來說是完全透明的
-
可能存在歷史資料更新需求
-
資料規模較大 ,一般在100TB以上
X-Engine引擎介紹
與傳統的InnoDB引擎不同,X-Engine使用分層儲存架構(LSM-Tree)。分層儲存有兩個比較顯著的優點:
-
需要索引的熱點資料集更小,寫入效能更高 。
-
底層持久化的資料頁是隻讀的,資料頁採用緊湊儲存格式,同時預設進行壓縮,儲存成本更低。
實時歷史庫方案,為何選擇 X-Engine
2.寫入效能更強,X-Engine相比同為LSM-tree架構的Rocksdb,有超過10倍的效能提升。
3.在儲存層引入資料複用技術等,最佳化Compaction的效能,降低傳統LSM-tree架構中Compaction動作對系統資源的衝擊,保持系統效能平穩
4.引入多個層級Cache,同時結合Cach回填和預取機制,利用精細化訪問機制和快取技術,彌補傳統LSM-tree引擎的讀效能短板,X-Engine的點查詢能力幾乎與Innodb持平
實時歷史資料庫架構設計和實現
總體 架構思路
基於上文對實時歷史庫和X-Engine的介紹,阿里雲資料庫團隊推出以X-Engine引擎為歷史資料儲存核心,同時生態工具DTS作為線上/歷史資料流轉通道,DMS作為歷史資料無風險刪除的完整“實時線上-歷史庫”方案,針對不同的業務場景和客戶需求,在具體實現上可能會有所不同,我們提供了多種實時歷史庫方案的具體實現。主體架構圖如下,核心思路為:
-
久經考驗的Innodb引擎作為OLTP線上庫核心引擎,主要處理高頻查詢/更新請求,滿足線上活躍資料高併發,高效能,強範圍查詢的業務需求
-
阿里巴巴資料庫團隊自研的高壓測儲存引擎X-Engine作為歷史庫核心引擎,主要響應歷史資料入庫/查詢/更新請求,滿足歷史資料冷熱資料頻次不一,低儲存成本,高效能的業務需求(範圍查詢可能效能受限)
-
統一DB接入層,根據設定的業務時間屬性將請求分別轉發至不同的儲存引擎。針對特殊場景下的跨引擎訪問,在應用層做聚合展示
-
線上-歷史資料透過阿里雲提供的生態體系工具做歷史資料遷移和過期資料刪除,確保鏈路更為穩定可靠
線上庫/歷史庫拆分方案
源端為DRDS叢集
a.資料同步鏈路走RDS
• RDS數量較多可支援API批次建立和配置
• 鏈路穩定性更好
• 需要保證源端目標端庫表數量一致,資料路由規則一致
b.資料同步鏈路走DRDS
• 資料同步效能較差
• 源端DRDS擴容會影響到DTS同步鏈路
• 源端目標端的例項數量和資料路由規則可自由配置
源端為多個RDS
a.目標端為多個RDS
• 執行後期歷史庫節點磁碟容量存在風險
b.目標端為DRDS叢集
-
可能涉及到業務程式碼輕量改造,目標端不走分庫分表鍵效能無法保證
-
可將多個線上庫業務合併至一套歷史庫叢集,架構更加簡潔
-
DTS鏈路也分為走RDS和DRDS兩種
-
實現簡單靈活
-
混用儲存引擎,在資料庫核心引數最佳化上難以兼顧兩者效能
-
歷史資料compact階段可能對整個例項產生效能抖動
-
同一例項下的庫或者表無法重名,涉及到輕量業務改造
DMS賦能線上庫過期資料刪除
線上庫的過期資料刪除既要保障刪除效率,也要保證刪除過程中對線上庫不會造成效能上的抖動,新版DMS支援建立“歷史資料清理”的資料變更任務,透過該任務可以非常方便地完成以下工作
• 大事務拆分,減少事務執行過程中鎖表時間過長,避免主備延遲
• 清理遭遇異常中斷可重試
• 支援檢視任務執行狀態和失敗原因分析
• 配置方面簡潔
如果沒有使用DMS生態工具,也自行實現過期資料刪除,但實現較為複雜。一般較為通用的設計思路為將表的主鍵按照大小做拆分,保證一次刪除"恰當數量"的資料,既保證刪除效率又不影響線上服務
-
初始化數值Y=select min(id) from $table_name
-
到了業務低峰期以後,DELETE FROM $table_name WHERE date_col< SUBDATE(CURDATE(),INTERVAL 180 DAY) and id >= Y and id <=
Y+100000 ,執行成功後程式碼層重新賦值 Y=Y+100000 -
程式sleep 3s,重複步驟b
-
時間到了業務高峰期以後,停止執行,記錄下當前的數值Y,第二天執行時直接從Y開始注意
-
程式碼上注意不要出現高併發刪除的情況,即步驟b還沒跑完,新的步驟b又進來了 -
程式sleep的具體秒數,要透過測試,取一個最合適的數值,主要看主備是否存在較大延遲,3只是估值 -
100000也是一個估值,實際取值最好也透過測試,取一個效率最高,對業務影響最小的數值。因為drds的序列不是單點遞增1的,所以這裡的10w不代表10w條記錄。 -
假設刪除程式中途崩潰了,或者執行很多天後發現部分資料沒有刪除。 那麼可以手工先刪除一小部分殘留的資料,比如預估下id<100w的記錄還有多少條,不多的話直接執行DELETE FROM logs_trans WHERE reqdate < SUBDATE(CURDATE(),INTERVAL 30 DAY) and id<100w 然後初始化整個程式,這樣保證重新初始化以後不會做很多無用功,即反覆執行刪除條目很少的sql
極端場景分析
在臨界時間處理上,實時歷史庫方案可能遭遇極端場景導致業務可能存在歷史庫的髒讀問題,假設線上庫資料儲存180天
-
更新179天前23時59分59秒的資料,請求路由至線上庫
-
資料同步鏈路異常中斷或鏈路存在延遲,該更新請求未能及時到達歷史庫
-
這時業務查詢該資料時,由於已經資料已經"舊"到超過180天,請求路由至歷史庫,由於鏈路異常,歷史庫查到了髒資料
• 建議過期資料刪除設定保守一點,比如臨界時間為180天,過期資料只刪除190天以後的資料,方便在極端場景下對比源端目標端的資料情況進行資料訂正
最佳實踐參考
1.X-Engine如何支撐釘釘躍居AppStore第一
2.淘寶萬億級交易訂單背後的儲存引擎
3.將DRDS中的InnoDB引擎轉換為X-Engine引擎
連結: https://help.aliyun.com/document_detail/161316.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69977734/viewspace-2700239/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 儲存所有歷史提交資料下遷移git倉庫Git
- wps沒儲存關閉了怎麼恢復資料 wps歷史版本怎麼恢復
- 資料成本:雲端儲存成本高嗎如何節省資料儲存成本
- 明解資料庫------資料庫儲存演變史資料庫
- 使用SQL SERVER儲存過程實現歷史資料遷移SQLServer儲存過程
- 資料庫mysql儲存遇到禁用怎麼辦?資料庫MySql
- 掌玩科技×OceanBase:HTAP實時資料分析,降低80%儲存成本
- SAP WM 有無儲存WM Level歷史庫存的Table?
- Druid:實時分析資料儲存UI
- 資料儲存(1):從資料儲存看人類文明-資料儲存器發展歷程
- 國泰產險引入阿里雲Lindorm資料庫 實現儲存成本降低75%阿里ORM資料庫
- 資料庫mysql儲存是什麼?可以存什麼?資料庫MySql
- 資料庫儲存時間到底該用什麼型別?資料庫型別
- 大資料儲存平臺之異構儲存實踐深度解讀大資料
- [20180322]檢視統計資訊的儲存歷史.txt
- 實現報表資料分庫儲存
- 怎樣在資料庫中儲存貨幣資料庫
- Flutter持久化儲存之資料庫儲存Flutter持久化資料庫
- 【資料庫】資料庫儲存過程(一)資料庫儲存過程
- C/C++ Qt 資料庫與Chart實現歷史資料展示C++QT資料庫
- 為什麼不用資料庫儲存圖片?資料庫
- 資料庫儲存過程資料庫儲存過程
- gitlab資料庫儲存位置Gitlab資料庫
- 雲資料儲存需要協助解決資料成本困境
- java+pgsql實現儲存圖片到資料庫,以及讀取資料庫儲存的圖片JavaSQL資料庫
- win10執行記錄不儲存怎麼辦 win10執行儲存歷史記錄設定方法Win10
- 人類儲存方式的變革史
- 從資料儲存發展史看IPFS/Filecoin
- Prometheus時序資料庫-磁碟中的儲存結構Prometheus資料庫
- 自研資料庫CynosDB儲存系統如何實現即時恢復資料庫
- 現在後端都在用什麼資料庫儲存資料?後端資料庫
- 資料庫學習筆記1(資料管理歷史)資料庫筆記
- 聚焦資料時代新儲存需求,浪潮儲存的新儲存之道
- 頭歌資料庫實驗六:儲存過程資料庫儲存過程
- 報表資料分庫儲存
- MySQL資料庫操作、儲存引擎MySql資料庫儲存引擎
- MySql資料庫——儲存過程MySql資料庫儲存過程
- chrome devtool 開發者工具 控制檯歷史、斷點歷史 匯出全部、儲存Chromedev斷點