http://wangbt5191-hotmail-com.iteye.com/blogs/1736589
目前笔者在主导公司一个已有产品的改造项目, 目前在方案讨论阶段。
先介绍下目前系统的现状, 目前系统中订单相关的数据日新增量已经到了百万级别,围绕订单相关的订单分拣, 打包,发货相关操作的transaction 达到近千万级别每日。 在做了历史归档以后, db 性能还是比较吃紧, 所以我们想到了分库分表的方案
这里是中间我所提出的问题和备选方案
或者说User 登录的User 表数据存储在什么地方。
这里有两个方案:
Pros and crons
pros: 实现简单
crons: 存在单点, 一旦引导库挂了, 所有用户都不可登录
Pros and crons
pros:不存在登录的单点问题;
corns:
经过讨论定下了第二套方案
我们以前DB中各表中的primary Key都是以Numberic 作为表字段类型, 辅以对ID 字段建sequence 来保证自增长来做到唯一的; 那么分库以后问题来了, 不同库中根据seq 生成的ID 会出现重复的, 这个对业务上是不允许的, 会导致数据正确性的问题;
这里有两个方案:
方案1.
在cache 中使用external_ID 为key
Pros and crons
pros: 增加的冗余字段external_ID 不需要做复杂的业务逻辑
crons:
方案2.
Pros and crons
pros:
crons:分库数据迁移过程中, 有若干业务表还没有Customer_ID字段冗余, 这个需要做前期的准备
经过讨论定下了第二套方案
根据我们现在的业务模型, 按照Customer_ID 做水平切分以后, 让客户相关的操作在一个request 访问的生命周期的DB hit 都落在一个db 实例上, 从而规避掉这个问题。
Talk is cheap, show me the code.
好吧, 我来上代码, 这个Demo 是基于mybatis 官网上的jpetstore 的例子, 这个例子做了以下几个功能点的演示:
1. 根据规则hit 到不同的db 实例(实例0 和实例1)上
2. 在db 实例0 上, 我们对product 表做了分表处理, 根据规则hit 不同的表
它的实现思路是:
1. 分库实现: 是改写SqlSessionDaoSupport 和MapperFactory Bean , 在SqlSessionDaoSupport 中的 SqlSession sqlSession 属性换成 List<SqlSession> sqlSessions, 在拿getSqlSession() 方法中写入规则来动态获取SqlSession;
2. 分表实现: 使用开源框架shardbatis, 详细信息可以参考http://seanhe.iteye.com/ 的博客