美文网首页MySQL实战干货大型网站架构PHP经验分享
亿级订单数据分库分表设计方案(满足多维度查询:订单号、用户、商家

亿级订单数据分库分表设计方案(满足多维度查询:订单号、用户、商家

作者: 路上阳光 | 来源:发表于2019-08-06 18:05 被阅读18次

根据业务初步预估订单业务量,每天500万的数据。我们将订单数据划分为了2大类型:分别为热数据和冷数据。

热数据:1个月内的订单数据,查询实时性较高;
冷数据:归档订单数据,查询频率不高;
根据实际业务场景,用户基本不会操作或查询2个星期以上的数据,如果这部分数据存储在DB中,那么成本会非常高,而且也不方便维护。另外,如果有特殊情况需要访问归档数据,可以走离线数据查看。

对于这2类数据,规划如下:

热数据:使用MySQL进行存储,分库分表;

冷数据:ES 或 TiDB或Hive存储;

按业务垂直拆分

按照订单使用者拆分为3个数据库,客户端、商家端、渠道端,目的是分散压力,提高吞吐量,互不影响


业务分库

有人会问,下单的时候该怎么办呢?
下单时只写客户库,写成功后,往消息队列里面发送两个消息,一个是写商家库、一个是写渠道库

分表策略

在订单表中,可以将uid(用户ID)字段作为sharding key。假设单个库需要分配 10 张表可以满足业务需要,可以简单地取模计算出订单分配到哪张表。

一旦确定sharding key,就只能根据sharding key定位到子表进而查询该子表下的数据;如果确实想根据user_id 去查询相关订单,那么需要先根据user_id 查询映射到的order_id list,然后再根据order_id list 再查询。

分库策略

数据库分表能够解决单表数据量很大的时候数据查询的效率问题,但是无法给数据库的并发操作带来效率上的提高,因为分表的实质还是在同一个数据库Server上进行的操作,很容易受数据库Server IO 性能的限制。

因此, 可以将数据进行分库操作,可以解决单台数据库Server的性能瓶颈。

分库策略与分表策略的实现很相似,最简单的都是可以通过取模的方式进行路由。

uid % 数据库数量,如:109005 % 16 = 13,分配到第13个数据库

分库分表结合使用策略

数据库分表可以解决单表海量数据的查询性能问题,分库可以解决单台数据库的并发访问压力问题。有时候,我们需要同时考虑这两个问题,因此,我们既需要对单表进行分表操作,还需要进行分库操作,以便同时扩展系统的并发处理能力和提升单表的查询性能,就是我们使用到的分库分表。

如果分库和分表都使用同一个拆分键进行 Sharding 时,根据拆分键的键值按总的分表数(分库数x分表数)取余。

分库分表

整体架构

亿级订单数据分库分表设计方案(满足多维度查询:订单号、用户、商家、渠道)

将订单请求分为查询和更新请求,更新请求比较简单,就是根据分库分表规则写入db即可。

对于查询请求,我们需要计算出查询的是热数据还是冷数据,根据查询的时间范围计算出查询的是热数据还是冷数据。或者无法确定热数据、冷数据,就都走ES 或TiDB。

另外架构图中的冷数据指的是近期1年的数据,如果是查询一年前的数据,建议直接离线查hive即可。

图中有一个定时Job,主要用来定时迁移订单数据,需要将冷数据分别迁移到ES和hive中。

相关文章

  • 订单表多维分库分表解决方案

    一、背景 订单分库分表不同于其他业务表分库分表,订单表的读写场景复杂,一般有买家维度、卖家维度、订单号维度3个主要...

  • 电商系统-核心架构思路

    #高并发下单主要包括以下几个方面: 分库分表 多应用实例全局唯一订单号 数据库连接 买家查询订单 卖家查询订单 扩...

  • 亿级订单数据分库分表设计方案(满足多维度查询:订单号、用户、商家

    根据业务初步预估订单业务量,每天500万的数据。我们将订单数据划分为了2大类型:分别为热数据和冷数据。 热数据:1...

  • 大众点评订单分库分表实践

    转载:大众点评订单分库分表实践 背景 订单单表早已突破两百G,因查询维度较多,即使加了两个从库,各种索引优化,依然...

  • 订单表的分库分表方案设计(大数据)

    订单表的分库分表方案设计(大数据) 一、两种方案分库分表 一般业界,对订单数据的分库分表,笔者了解,有两类思路:按...

  • MySQL百万级数据表or查询优化

    现象 目前公司的订单表有100多万条,使用订单号查询数据时,所需时间大多要10-30秒不等,查看了慢查询日志,发现...

  • Thinkphp5.0 查询返回json

    商城中通过订单号查询信息,但是订单号往往很长,以订单号(长的字段值)为where查询条件时候返回json数据,解决...

  • 初识分库分表

    1. 为什么要分库分表? 什么场景下需要分库分表? 单表数据上亿,查询性能下降; 解决大数据存储,提高访问性能; ...

  • Sharding-JDBC分库分表异常排查

    一、问题描述业务中设计到订单模块的拆分,测试过程中发现同一分库分表的key,其中订单项表的数据没有按照分库分表规则...

  • MongoDB联表查询

    创建表user、order 查询 联表查询 拆分orders 分组求和并返回字段数据 查询用户的订单信息(订单id...

网友评论

    本文标题:亿级订单数据分库分表设计方案(满足多维度查询:订单号、用户、商家

    本文链接:https://www.haomeiwen.com/subject/egvwdctx.html