读写分离
一主多从,主从同步,读写分离,互联网大部分业务读多写少,一般读会先成为性能瓶颈。读写分离解决读写高并发问题,有以下特点:
- 简单易操作
- 线性提升读性能
- 消除读写锁提升写性能
- 冗余从库实现读高可用,写依旧单点
水平切分
水平切分是为了解决并发量高、数据量大的问题,具体方案是分库或分表,建议分库:
- 分表公用一个库,依然是一个数据库文件,存在IO竞争
- 分库可迁移到不同的实例,性能更高,扩展性更好
水平切分解决数据量大的问题,一般按主键id的范围或Hash值切分,有以下特点:
- 多实例结构相同,共同组成全局数据,但互相独立
- 多实例线性提升写性能
按范围切分要求主键递增,各实例间数据量不均、请求不均,优点是扩容简单,Hash切分则刚好相反,扩容可能导致数据迁移。
水平切分主键/非主键查询
水平切分非主键访问,可建立非主键到主键的二级索引或索引外置,通过二次查询查找数据,也可不用索引而通过基因法快速定位,参考
跨库分页
全局唯一id
水平切分不能用分区表原因:
架构师之路
读写分离+水平切分
综合两者优点:
- 线性提升读性能
- 线性提升写性能
数据库中间件
目前基本使用基于客户端的sharding-jdbc或基于中间件服务的sharding-proxy
垂直切分
垂直切分多个实例结构不同,往往通过业务主键关联构成全局数据。垂直切分降低了单库数据量,进而降低磁盘IO提升吞吐量,一般与业务结合紧密:
- 长度短,访问频率高放一起
- 长度长,访问频率低放一起
列增加方案
版本号+通用ext列
- 可随时动态扩展属性,迁移方便
- ext无法索引
扩展行key-value
- 一行变多行,不方便多列查询