sharding sphere MySQL分库分表分享

目录:

分库分表是什么?

为什么需要分库分表?

如何制定分库分表方案?

实践demo演示

分库分表是什么?

单库单表 拆分为 N个库N个表

分为垂直拆分,水平拆分

什么是垂直拆分

按结构(表头/约束)拆分

垂直拆库

把单库中的不同业务的表, 拆分到不同库中

比如 原本单库的 用户表, 订单表

将用户表相关的表放到同一个库中 A库

将订单相关的表放到同一个库中 B库

垂直拆表

把表中的多个字段, 拆出来部分字段放到另一个表中

比如

A库B表的一行, 有 1 2 3 4 5 列

把 1 2 3 4 列 拆出来放到 A库C表中

B表剩下 1 5

C表 1 2 3 4, B表和C表以1这列为关联键

垂直拆分优点


  1. 业务系统解耦。
  2. 与微服务治理类似,便于集中管理,监控,扩展
  3. 高并发情况下提升IO,数据库连接数,单机硬件资源瓶颈

垂直拆分缺点


  1. 多表join
  2. 分布式事务处理复杂
  3. 单表数据总量无法解决(水平切分处理)

什么是水平拆分

按内容拆分

将1w行, 按照id的奇偶分成两个库, 奇数插入到A库的b表, 偶数插入到C库的b表

(b表的结构是一样的)

就是按照id的内容进行了拆分

水平拆分的优点

  1. 提高查询性能, 单表超过2kw,性能下降(如何举证?), 比如磁盘缓存, 控制变量, 两台相同实例的磁盘缓存比单台的实例的磁盘缓存要大, 命中缓存的比率会上升

水平拆分的缺点


  1. 实例增加, 成本增加
  2. 业务规则导致无法正确连表查询
  3. 分布式事务

sharding jdbc mybatis

优点:


  • 单表分库分表
  • 读写分离
  • 数据库的分布式事务

缺点:


  • 连表查询
  • 分页查询 归并引擎

为什么要分库分表?


  1. 单表数据量增大
  2. 单台服务器资源有限, 基于摩尔定律, 单个CPU的性能受限, 单台机器资源受限

如何定制分库分表方案


  1. 业务规则
  2. 直接使用分布式数据库(TiDB)

中间件选型


  • sharding-sphere
  • TDDL (淘宝半开源)
  • mycat

sharding-jdbc分表demo

分库是一样的, 这里只演示分表的demo

gitee: https://gitee.com/suveng/demo

环境说明

MySQL 5.7

Sharding-Sphere 4 (截止至 2021/1/4 sharding-sphere 5已经出了, 直接去apache官网可以搜到文档)

扩容问题

  1. 增加算法版本配置

看代码实现的思路

数据倾斜问题

  1. 一致性hash算法 + 权重配置

看代码实现的思路

todo


  • 读写分离特性问题探讨
  • 查询优化
  • sharding-proxy代理分享

注意点

  1. 读写分离

  • 没有事务时, 根据SQL去做读写分离
  • 有事务时, 一旦线程内使用了主库, 后续线程内的读写都是使用主库, 但是异步线程后就没有了这个限制了?
    • 怀疑: 和事务隔离级别有关系