百亿数据毫秒响应级交易系统读写分离存储数据设计

时间:2022-09-04 20:02:09

刚完成了一个存储百亿级数据,响应时间要求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表。

虽然麻烦,但是可以基本可以实现不停机扩容。