# 第10节:实现和使用分库分表
作者:小傅哥
博客:https://bugstack.cn (opens new window)
沉淀、分享、成长,让自己和他人都能有所收获!
- 分支:210922_xfg_dbRouter (opens new window)
- 组件:db-router-spring-boot-starter (opens new window)
- 描述:开发一个基于 HashMap 核心设计原理,使用哈希散列+扰动函数的方式,把数据散列到多个库表中的组件,并验证使用。
# 零、优秀作业
- 计算数据库位置的时候,用【int dbIdx = idx / dbRouterConfig.getTbCount() + 1】为什么是【dbRouterConfig.getTbCount()】标的数量呢?@拿笔小星 (opens new window)
- 问题排查 Error creating bean with name 'db-router-point' @归斯 (opens new window)
- 实现和使用分库分表 @一点江南 (opens new window)
- DB路由组件 @L、m (opens new window)
- 实现和使用分库分表 @BerserkD (opens new window)
- 实现和使用分库分表,开发自研数据库路由 @奥斯卡最佳配角 (opens new window)
- 实现自定义路由组件,学会springboot组件开发 @杨杨得亿🙉 (opens new window)
- 这章的目的是自定义路由实现分库分表 @Chin (opens new window)
- 数据路由组件的实现和引入组件实现分库分表 @Geroge Liu (opens new window)
- 实现和使用分库分表 @liuc (opens new window)
- 通过注解实现数据分散到不同库不同表的操作 @xbhog (opens new window)
- 领取整体流程(图一)和奖品领取信息的操作流程。@xbhog (opens new window)
- 分库分表路由组件开发细节流程梳理 @爱奋斗的小鲨鱼 (opens new window)
- DBRouter注解写好后,肯定要配备切面类DBRouterJoinPoint @SEN (opens new window)
- 因为一个用户表包含了几十甚至上百个字段,管理混乱所以需要分表,将该表拆分成多个表 @霍der~ (opens new window)
- 分析分库分表实现原理分析 @布丁迪厄 (opens new window)
- 主要对于分库分表路由组件进行了学习,跟着敲并尽力理解了所有的类与接口,理清楚它们之间的流程 @AD钙奶 (opens new window)
- 动态数据源切换的原理 @圈 (opens new window)
- 项目过程中遇到的bug以及经验总结 @锚 (opens new window)
- 在这一章节我们会学习到的技术:AOP、数据源切换、散列算法、哈希寻址、ThreadLocal @星期一 (opens new window)
- 总结一下db-Router,不得不说。太牛了。尤其是Java反射。真的是刷新了认知。@陈晓川 (opens new window)
- 路由组件执行流程分析 @twinkler (opens new window)
- 通过debug理清了路由组件的执行流程 @T (opens new window)
- 一个简单的路由组件的开发,将之前很多理论落实到了实际中,涉及面很广,但逻辑却不复杂,很是舒服。@错否 (opens new window)
- 一张组件执行sql路由的流程图和组件里的bean实例化顺序图 @double (opens new window)
- dbRouter实现分库分表,现在跟着代码一套做下来,很少会有bug, 或者说有bug也能快速地解决。相比于刚开始,一个bug卡半天算是小小的进步啦。 (opens new window)
- 扩展和完善数据库路由组件中编程式事务 @素质男孩 (opens new window)
- 梳理了两天路由组件的运行流程和相关的知识,感觉提升很大,提升主要是在架构和基础知识上,其中设计了大量的反射知识和aop的理论 @1 (opens new window)
# 一、开发日志
- 9月22日,新增数据库路由组件开发工程 db-router-spring-boot-starter 这是一个自研的分库分表组件。主要用到的技术点包括:散列算法、数据源切换、AOP切面、SpringBoot Starter 开发等
- 9月22日,完善分库中表信息,user_take_activity、user_take_activity_count、user_strategy_export_001~004,用于测试验证数据库路由组件
- 9月30日,基于Mybatis拦截器对数据库路由分表使用方式进行优化,减少用户在使用过程中需要对数据库语句进行硬编码处理
# 二、需求分析
如果要做一个数据库路由,都需要做什么技术点?
首先我们要知道为什么要用分库分表,其实就是由于业务体量较大,数据增长较快,所以需要把用户数据拆分到不同的库表中去,减轻数据库压力。
分库分表操作主要有垂直拆分和水平拆分:
- 垂直拆分:指按照业务将表进行分类,分布到不同的数据库上,这样也就将数据的压力分担到不同的库上面。最终一个数据库由很多表的构成,每个表对应着不同的业务,也就是专库专用。
- 水平拆分:如果垂直拆分后遇到单机瓶颈,可以使用水平拆分。相对于垂直拆分的区别是:垂直拆分是把不同的表拆到不同的数据库中,而水平拆分是把同一个表拆到不同的数据库中。如:user_001、user_002
而本章节我们要实现的也是水平拆分的路由设计,如图 1-1
那么,这样的一个数据库路由设计要包括哪些技术知识点呢?