日期:2014-05-16  浏览次数:20696 次

特殊场景下数据库无缝扩容

?????? 去年做了一个优化类项目,当时接收时,基本上oracle-db io已经被这个应用占据了79%的load,随着业务发展,DB响应已经到了无法忍受的地步。

?????? 具体场景为:实时监听买卖订单消息,订单保存45天,这些订单会每条都更加用户维度进行分析,分析规则比较复杂,基本有单笔订单,该用户近45天订单全量分析,分析完后给出该订单是否为真假,如果真的订单并且未结束,再汇总出总金额,需要实时计算。

????? 当时高峰期每秒进来订单量在300多,总计每天订单增长数维持在1KW,45天大体订单在4.5个亿。

????? 当时查询性能基本上已经慢到一个用户如果订单量>1000基本上响应时间在5秒以上。后续又来的业务需求,订单状态会发生变化,用户订单也时刻在发生变化,那么我们需要的金额就会时刻在变化,一旦变化就力度非常大,就需要预警。

????? 怎么办?a.新需求

????????????????? b.每天访问量越来越大,性能。

????????????????? c.公司搞大型活动订单高峰期预计比平时高5倍。

?????

????? 拆库是必然的,而且业务发展非常快,至少预估3年可扩展。

????? 拆库成本很高,数据迁移,停机。。。。

????? 半年后如果再次性能存在问题,再搞一次拆库实在不方便,而且还需要评估一些公司大型活动的冲击。

能否有种可以支持半年然后,可以无缝扩容一次,1年后再扩容一次。。。。

? 一.部署图

??? 存储集群:采用Mysql 作为数据库存储为例

??? 应用服务器:主要包括

a. 业务逻辑处理

b. 数据存取路由

c. 数据存取处理

??? 业务逻辑处理、数据存取处理两层基本实现与传统的处理没有区别,下面详细阐述数据? 路由的实现



?

?二. 数据存取路由

a) 规则算法

这里采用的是针对用户(UserId)hash 值取余数(Key 值) , 传统的规则算法是当前需要分n 个库,分母就是n ,本专利采用小于n *2t )的最大质数为分母,t 的值为你预估的无缝成倍扩容次数; 譬如当前需要划分16 个库能支撑应用性能,假设取t=8 ,那16 *28 =4096. 也就是说无缝扩容至少可以支持到4096 个库,4093 为最大的小于16 *28 =4096 的质数。

b) 路由映射关系

??? 维护一份(