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