刚完成了一个存储百亿级数据,响应时间要求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表。
虽然麻烦,可是能够基本能够实现不停机扩容。