在互联网公司或者一些并发量比较大的项目,虽然有各类项目架构设计、NoSQL、MQ、ES等解决比较高的并发访问,可是对于数据库来讲,压力面试
仍是太大,这时候即便数据库架构、表结构、索引等都设计的很好了,可是仍是扛不住的,主从复制经过读写分离缓解读负载。可是像淘宝这种项目,数据库
单一数据库确定是不行的,为了解决这个问题,就可使用分库分表架构
PS:这是一篇学习博客,本人没实操过,适合做为入门了解或者面试,若是深刻了解,请自行百度大佬的文章并发
分库分表的方式:函数
一、把一个实例的多个数据库拆分到不一样的实例,这个实例多是数据库集群工具
优缺点:性能
操做简单学习
可是若是写压力存在某个库,这样拆分仍是没法解决问题spa
二、把一个库中的表拆分到不一样的数据库架构设计
例如:把一个库中的订单表、商品表、购物车表分别拆分到不一样的数据库
三、水平拆分
在前面两种状况没法解决的状况下,就要使用水平拆分
对一个库中的相关表进行水平拆分到不一样实例的数据库,进行分片处理
分片处理是最后的方案,能在以前解决问题,就不要分片,分片以后会带来不少问题,也会变得复杂
分区键决定了分区后的性能,如何选择分区键:
一、分区键要能尽可能避免跨分片查询的发生
二、分区键要尽量使各个分片中的数据平均
如何存储不须要分片的表:
一、每一个分片存储一份相同的数据,数据量不大且不多更新的表
二、使用额外的节点同一存储
如何在节点上部署分片:
每一个分片使用单一数据库,且数据库名相同
将多个分片表存储在一个数据库中,在表名后加上分片号后缀
在一个节点中部署多个数据库,每一个数据库包含一个分片
如何分配分片中的数据:
按照分区键的Hash值取模来获取分片数据
按照分区键的范围来分配分片数据,通常日期类型可使用这种
使用分区键和分片的映射表来分配分片数据
如何生成全局ID:
使用auto_increment_increment(和分片数量一致)和auto_increment_offset参数,只适用于一个节点保存一个分片的场景
使用全局节点生成ID,先获取全局节点ID,再经过分区函数插入到对应的分片中,可是这个全局节点可能成为性能瓶颈
在Redis中建立全局ID,最优选择
能够经过工具OneProxy来进行数据库分片,原本想要手动操做的,可是发现oneProxy官网没了。。。