背景
什么情况下需要分库分表
数据量比较大,不要遇到数据库问题就考虑分库分表,优先考虑软件和硬件的优化。
由于数据量较大,整体会达到几十个T。因此按照租户进行分库分表。
设计
要求
- 按照租户进行分库分表
- 最好sql无侵入
- 特定大租户可以单独指定
实现
阿里索引表方案
- 索引表维护库表关系
- 创建租户账号时分配库表,写入到数据库,加载到缓存。(分配可以采用列表索引自增,后序扩容可以采用列表项概率不均来制造倾斜)
- 数据库层调用通过threadlocal传递库表编号数据,分表编号拼接到sql,分库标号获取数据源,完成组装
会侵入sql
Apache ShardingSphere方案
- 确定分片键
- 编写表策略,根据分片键查询,优先查询redis
- 编写库策略,根据分片键查询,优先查询redis
- 使用mybatis
使用精准分片算法。结合mybatis,无sql侵入
扩展
额外封装一个数据路由starter,外部传入数据源,封装分片键和算法
扩容过程
- 更新库表索引关系
- 迁移旧表数据,使用阿里dts数据实时同步工具将旧表同步到新库
- 更新租户表对应的库表
- 更新缓存,路由到新库