数据库路由组件设计

  1. 业务背景
  2. 技术调研
    1. 基于代理
    2. 基于组件
  3. 方案设计

业务背景

业务体量的增加,原先的库表存储不能支撑海量的并发请求。需要考虑分库分表。
初期的分库分表还是中期的分库分表迁移,出发点现有技术无法实现个性化的业务需求,并且自研组件小而精,易于迭代维护,后续也可能加入其他的功能

水平拆分:
直接拆分数据库
垂直拆分:
拆分数据表

技术调研

分库分表的组件

基于代理

在应用和数据之间加一个代理层,应用程序所有的数据请求都交给代理层处理,代理层负责分离读写请求,将它们路由到对应的数据库中。类似的中间件有Mysql Router,Atlas,MaxScale,MyCat。

基于组件

基于独立的jar包就可以开发,不用部署,运维成本低,不需要代理层的二次转发请求,性能很高,比较经典的就是Sharding-JDBC

方案设计

  • 如何在组件中实现动态数据源切换
  • 如何实现比较均匀的路由散列算法
  • 如何拦截并修改SQL

image-20240306111639672
主要包括

  • aop切面编程:拦截需要使用DB路由的方法,这里采用自定义注解
  • 数据库连接池配置:分库分表需要按需配置数据库连接源,在这些连接池的集合中进行动态数据源切换
  • 路由哈希算法设计:在路由设计时,需要根据分库分表字段进行路由计算,让数据均匀地分布至各个库表之中,参考HashMap的扰动函数设计
  • mybatis拦截器:实现sql动态拦截和修改

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。