剛完成了一個存儲百億級數據,響應時間要求10毫秒內的交易系統數據存儲設計方案,現在有空整理一下思維。
一、分庫分表
1.實時數據和歷史數據分離
分為ABC表,AB表每日日切,只存儲1天數據,每到24點切另外1張表。C表存儲歷史數據,T-1數據日終批量AB表遷移至C表
這樣實現動態數據和靜態數據之間的分離。
2.數據離散先垂直划分、再水平划分
(1)垂直划分第一層 根據業務相互之間的數據隔離,分開不同用途的表(使用不同的表名X)。
(2)垂直划分第二層 根據業務的實體進行划分(我們這里為商戶,某些大商戶獨占一個實體序號Y)
(3)水平划分第一層 對於交易量大的實體根據流水號進行水平離散(離散序號Z)
因此一個表名由此構成: A/B/C_X_Y_Z
二、實時交易
對於高tps的交易,保證足夠的離散數量,3000萬/日的交易量,水平離散數量要到48以上。
對於凌晨數據遷移的批量,涉及查找日期為T-1日期的歷史數據,需根據遷移狀態表進行判斷,如果正在遷移,需要拒絕交易,否則允許查詢。
三、歷史數據遷移
使用存儲過程,提供2種方法,對於交易量大的表,使用oracle分區交換技術,其它使用fetch bulk批量提交方法遷移數據。
注意:分區交易交換時,不僅要注意全局索引、分區索引失效的問題,還要考慮統計信息的問題。
1.分區交換的技術細節如下:
(1)將普通表統計信息export到1個中間的表
(2)檢查需要交換的分區是否存在,數據是否為空,如果非空,拒絕
(3)分區交換
(4)檢查分區表全局索引和本地索引是否失效,如果失效,重建索引
(5)檢查普通表索引是否失效,如果失效,重建索引
(6)從中間表導統計信息到普通表
(7)對普通表鎖定統計信息
2.普通fetch bulk批量提交數據遷移數據的技術細節如下:
(1)使用fetch bulk從普通表插入數據到分區表
(2)強制對普通表進行統計信息收集
(3)批量刪除或者truncate普通表
(4)對普通表鎖定統計信息
三、擴容
1.每筆流水數據都在聯機交易時存儲交易特征計算出來並取mod 4800的hash值。
例如離散了 48張表,將這個mod 4800的值 再mod48,(數值為0,48,96,144)為0表,(1,49,97,145)為1表。
現在要擴充成96張表,mod 96,(數值為0,96)為0表,(1,97)為1表,需要把原表0中數值為48的數據遷移至48表,49的數據遷移至49表。
雖然麻煩,但是可以基本可以實現不停機擴容。