对于分库分表来说,具体有两种方式:垂直拆分和水平拆分
。
垂直拆分主要是业务的细化和独立,和业务联系比较密切。所以本文只讨论更通用的水平拆分。
为什么分库分表
- 降低单机 MySQL 的性能
- 降低单表或者单库的数据量,减少数据库的查询压力
- 突破单机的容量限制 分库分表的方式
范围区分(range)
:按月按区按其他的等特殊的属性维度进行分片预定义范围
:预估有多少数据的容量,对数据进行范围的分配,0-100->A 101-200->B取模 Hash
:对指定的字段进行取模运算,匹配对应的库和表。
分库分表带来的问题
- 数据的维护成本高
- 跨库的业务join
- 分布式事务的性能低下
- 自增 id 的生成问题
- 非分片字段查询的轮询的浪费
- 多节点排序问题
分库分表的中间件
对于分库分表的中间件有很多,Shardingsphere,Tddl,MyCat,cobar。从架构上分,主要分为两种:JDBC应用方式
和Proxy模式
。
JDBC应用模式
是基于客户端的分片,有客户端根据Sql
和规则,决定具体执行的 sql 的服务器。代表有Shardingsphere,Tddl
JDBC应用模式 优点:
- 性能好
- 支持跨数据库(mysql oralce mssq)
缺点:
- 不能跨语言
- 对开发不够友好,增加开发难度
Proxy模式
代理模式是基于 MySQL
做一层转发代理,有代理根据规则来分发具体的SQL 到服务器上。
优点:
- 跨语言
- 开发无感知
缺点:
- 性能比较差,增加了网络请求
- 不支持跨数据库