业务背景
业务体量的增加,原先的库表存储不能支撑海量的并发请求。需要考虑分库分表。
初期的分库分表还是中期的分库分表迁移,出发点现有技术无法实现个性化的业务需求,并且自研组件小而精,易于迭代维护,后续也可能加入其他的功能
水平拆分:
直接拆分数据库
垂直拆分:
拆分数据表
技术调研
分库分表的组件
基于代理
在应用和数据之间加一个代理层,应用程序所有的数据请求都交给代理层处理,代理层负责分离读写请求,将它们路由到对应的数据库中。类似的中间件有Mysql Router,Atlas,MaxScale,MyCat。
基于组件
基于独立的jar包就可以开发,不用部署,运维成本低,不需要代理层的二次转发请求,性能很高,比较经典的就是Sharding-JDBC
方案设计
- 如何在组件中实现动态数据源切换
- 如何实现比较均匀的路由散列算法
- 如何拦截并修改SQL
主要包括
- aop切面编程:拦截需要使用DB路由的方法,这里采用自定义注解
- 数据库连接池配置:分库分表需要按需配置数据库连接源,在这些连接池的集合中进行动态数据源切换
- 路由哈希算法设计:在路由设计时,需要根据分库分表字段进行路由计算,让数据均匀地分布至各个库表之中,参考HashMap的扰动函数设计
- mybatis拦截器:实现sql动态拦截和修改
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。