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


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

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

  • 相关阅读:
    [bzoj5278][Usaco2018 Open]Out of Sorts
    CF480Div2掉分记
    [bzoj3759]Hungergame
    [bzoj4184]shallot
    [原]Golang FileServer
    golang thrift 源码分析,服务器和客户端究竟是如何工作的
    golang thrift 总结一下网络上的一些坑
    德州扑克AI WEB版
    德州扑克AI实现 TexasHoldem Poker
    德州扑克游戏
  • 原文地址:https://www.cnblogs.com/qwcbeyond/p/6624485.html
Copyright © 2020-2023  润新知