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