目录
一、分库分表定义
分库:将一个独立的数据库拆分成多个数据库,比如单库按业务拆分成订单、资金、合同库
分表:大数据量表拆分成多个数据表
二、分库分表场景
2.1 分库分表时机
微服务:基于业务,需要分拆
读写分离:写主库,读从库
建索引,优化查询,性能无法提升
2.2 为什么需要分库分表
分库:
磁盘存储:业务量剧增,单机磁盘容量不足,多个数据库,分摊磁盘容量
并发连接支持:高并发场景,多个库分担连接压力(MySQL默认100,最大16384)
分表:
数据量比较多,单表超过500w ,查询sql变慢,索引优化无效果
三、分库分表方式
垂直分片
核心理念是专库专用
拆分前:一个数据库由多个数据表构成,每个表对应着不同的业务
拆分后:按业务将表进行归类,分布到不同的数据库中,从而将压力分散至不同的数据库
水平分片
不再将数据根据业务逻辑分类,而是通过某个字段(或某几个字段),根据某种规则将数据分散至多个库或表中,每个分片仅包含数据的一部分
常用主键分片策略:
取余\取模、范围分片、时间、枚举值分片(比如按地区)、自定义业务规则
四、分库分表带来的问题
1、事务一致性问题:原本单库保证数据一致,分库分表后,不同库不同机器,带来分布式事务问
--分布式事务Spring Cloud Seata
2、跨节点关联查询问题: 表分到不同库,无法关联查询
--字段冗余:违反mysql范式,多存放字段
生成宽表、ES存储等,汇集数据
单表查,组装数据
3、跨节点分页、排序函数 :limit、order by 排序等问题,需要汇总所有分片结果来分页、排序
--代码中处理或者生成新表ES等大数据中间件查询
4、主键重复:单库主键自增无用,需要设计全局分布式唯一主键
--uuid
mysql单调递增
redis自增
雪花算法
美团leaf
ShardingSphere的SQL使用限制:使用限制
五、常见分库分表组件优缺点
Proxy代理层分片 :
1、altas 长时间无维护
优点:
1、DB动上下线
2、支持ip过滤,简单权限控制
3、记录所有sql,实现简单审计功能
缺点:
1、不支持跨库分表
2、性能消耗
3、不支持配置参数动态修改
2、mycat:
优点:多语言使用,不用调整代码
缺点: 多一层转发,效率低
目前社区不活跃
3、shardingshpere:
优点:服务中集成,效率好
缺点:
1、需要引入jar包,代码修改
2、仅支持java语言