数据库瓶颈
不管io瓶颈还是cpu瓶颈,导致数据库连接数增加,从而超过数据库阈值
单表容量超过2GB,单表数据量超过2ooo万数据量,考虑分库分表
分库分表
水平分库/水平分表
垂直分库/垂直分表---------------表为依据,根据业务属性不同,将不同的表拆分到不同库中
- 每个库结构一样
- 数据不一致,没有交集
- 所有库的并集是全量数据
分表:将一个数据库表拆分为多个表
分库分表工具
sharding-sphere:jar,前身是sharding-jdbc;
TDDL:jar,Taobao Distribute Data Layer;
Mycat:中间件。
分库分表策略
- 主键采用hash,数据被均匀分散在几个表内。如果扩容的话,需要进行数据迁移
- 某一段内数据放在一个表中,容易扩容。就是同一时刻会对单表造成压力
- 可以采用分组 + 主键hah算法。 新扩容的为新的组不影响之前数据
存在问题
事务问题: 1. 分布式事务解决 2.由应用程序+数据库共同完成
数据均匀问题: 轮训 id取模 hash取模 一致性hash
分布式id 雪花算法 redis的原子自增(不重复,不会变小)
跨库join问题 字段冗余:把需要字段放入主表,避免join操作
数据抽象:通过etl将数据汇合聚集,生成新的表
全局表:一些基础表,每个数据库都放一份
应用层组装:把基础数据查出来,通过程序组装