随着互联网电商系统订单量爆发式增长,原有一个库一个订单表无法满足公司业务,需要重新考虑记录订单数据问题。
现在公司订单数据情况:
前端一套订单库放在IDC机房(通过VPN连接到公司局域网服务器)
后端两套订单库(放在公司机房),一套是写的库,一套是只读数据库,两套库以写的库为主库进行同步到从库只读库
现有订单库包含:订单及订单相关的表;优惠券表,促销表,商品表,地区等基础数据表,财务表,仓库系统表,运输物流系统,表用户系统表
1.简单办法:初步讨论需要对订单历史数据进行归档
2.最终办法:实现订单数据库水平和垂直进行分库分表,彻底解决互联网公司订单爆发式增长导致数据库服务器的资源不够用
订单一套表分别为:1.订单主表,2.订单商品明细表,3.订单支付明细表,4.订单商品商品促销折扣明细记录表,5.订单发票表
分别设计两套表:一套是记录订单维度5张表数据(按照订单Guid转换64位整型唯一长整型)
另外一套:用户订单关系表(记录订单主要信息和用户信息及取模维度(是按用户取模还是按照订单取模));
原订单库分成16个库,每个库有16套表,订单表有256个表去存储订单数据;
按照原订单Guid 转换64位长整型对256进行取模得到具体是哪个表tbIndex,然后数据库id: tbIndex/16 = dbIndex
然后把前端生成的订单数据256个表数据同步到后端一个数据库,就会有插入主键重复的问题出现;
分库分表:是按照订单主表的Guid来取模,确定是16个库哪个库256个表的那个表;
一套表都是按照订单Guid进行取模;
引起问题:
1.提交订单出现网络异常(服务端创建成功,返回到客户端因为网络异常导致客户端得到的反馈信息是没有成功,客服端继续点提交),
重复提交订单导致DB保存重复的订单信息,如果订单Guid在客户端生成,每次提交都会有个新的Orderid号出现,导致服务端一直以为是新订单(订单Guid即使是有唯一索引也会出现,记录在不同表去了,同步数据到后端库就会有);然后把前端生成的订单数据256个表数据同步到后端一个数据库,就会有插入主键重复的问题出现;
解决办法:对应订单及订单明细表的主键要是全局唯一,及时客户端重复提交也要保证提交的订单Guid及订单明细表的唯一主键要唯一不变化;
如果Guid一直唯一全局不变,即使客户端重复提交到创建订单服务 只认为是一个订单,创建时候会提示保存重复,或者创建提示已下成功。
2.由于公司订单大部分来自天猫超市平台;拉取天猫订单数据到公司数据库是以天猫超市店铺名为UserId;导致天猫订单全部散列到256各个表里面;
小用户的订单也会散列到不同表中;对于一个小用户来说根据用户去查询订单信息就需要 检索256个标示,至少要查询16次,其中每次要聚合16个表union all 查询;因为有16个库每个库有16个表
解决办法:分库分表还要以用户维度进行分库分表。用户订单关系表(记录订单主要信息和用户信息及取模维度(是按用户取模还是按照订单取模));
如果是大用户在订单维度分库分表: 按照订单Guid去取模,按照订单Guid散列,这样大用户的订单会均匀散列到256各个表中;在用户维度取模方式为大用户按照订单Id维度取模,小用户按照用户Id取模;这样能集中知道小用户的订单在用户维度分库分表是存储在一张表,能取到订单信息 去关联查询 订单维度分库分表去分别查询订单信息。
3.数据需要同步,数据库修改需要数据库中间件,消息发布订阅功能。
4.很多涉及到订单查询的服务全部要使用聚合256表去查询订单数据;