Sharding-JDBC
分库分表的几种方式
垂直分表、垂直分库、水平分表、水平分库
垂直分表
按照字段拆分,增加页内能存储的的行数据来减少IO的次数,以及减少对行锁竞争
垂直分库
按照业务拆分,减少业务间的耦合,转库专用,不同业务的库可以部署在不同服务器减少对硬件资源的压力
水平分库
解决单库数据量大问题,把单库数据平摊到多个库,可以用ID取模或者hash确定数据在哪个数据库,减小单库的压力
和垂直分库对比
垂直分库是根据业务把不同业务的表拆分到不同数据库
水平分库是把相同业务的表复制一份到不同数据库
水平分表
解决单表数据量大问题,把单表数据平摊到多个表,减小单表数据量,减少IO
总结
在系统设计的时候,就要根据需求,设计好垂直分库分表
在业务上线后,如果数据量增大,先考虑用缓存、读写分离、索引等方式优化,如果业务数据量持续增大,再考虑用水平分库分表
分库分表带来的一些问题
事务一致性问题
需要操作多个数据库的时候,需要分布式事务
跨界点关联查询
由于表在不同数据库内,在写SQL语句的时候无法通过联表查询
跨节点分页、排序函数
由于表在不同数据库内,在写SQL语句的时候需要查询多次,在内存中排序
主键避重
不同数据库主键重复问题,分布式ID
公共表
每个数据库都有一些公共表,公共表的数据一致性问题
Sharding-JDBC流程
SQL解析
将SQL语句根据单词拆分解析成语法树,树节点包括关键字、变量等
在这里就可以确定哪些是需要被替换的逻辑表
SQL路由
将逻辑表映射到真实的物理节点
尽量使用分片键进行路由,WHERE条件包括 = 、IN 、BETWEEN,否则会走全局路由(扫描所有库同名的所有表),联表的话不用分片键也会产生笛卡尔积
总的来说,分片键配合分片策略可以很好的减少SQL查询的行数,加快查询速度
SQL改写
将逻辑表改写为真实表
如果有排序条件,将排序条件补充到查询条件中
SQL执行
内存限制模式
不限制数据库连接数,多线程处理,加快查询速度
连接限制模式
限制数据库连接数,通常用于事务控制
结果归并
略
如何编写分库分表配置文件
配置数据源
配置主从关系
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 白兰!