读写分离、垂直拆分、水平拆分、分库分表

  1. 1 读写分离
    1. 1.1 为什么要读写分离
  2. 2 分库
    1. 2.1 数据库垂直拆分
    2. 2.2 数据库水平拆分
  3. 3 分表
    1. 3.1 表垂直拆分
    2. 3.2 表水平拆分

1 读写分离

将数据库分为主从库,一个主库master用于写数据,多个从库slave轮询读取数据,主从库之间通过某种通讯机制数据同步,是一种常见的数据库架构。
数据库主从架构

1.1 为什么要读写分离

多数业务数据操作读多写少,随着量的增长,数据库的读会首先成为瓶颈,如果希望线性提升数据库的读写性能,就需要让读尽可能不相互影响。在使用读写分离之前我们应该首先考虑使用缓存能否解决问题,然后再考虑对数据库进行读写分组。读写分离意味着将一体的结构进行分散,在海量高并发请求下要考虑如下问题:

  • 1 如果保证master的高可用,故障转移,熔断限流?
  • 2 读写操作的区分规则,代码层面如何处理好读和写,尽量业务无感知?
  • 3 数据一致性的容忍度,网络的不确定性会导致数据同步是一个不可忽视的问题。

2 分库

数据库垂直拆分、水平拆分统称分库,是指按照特定条件和维度,将同一个数据库中的数据拆分到多个数据库(主机)上以达到分散单库(主机)负载的效果,降低数据集的大小,以空间换时间提升性能。

2.1 数据库垂直拆分

根据业务对数据库中的表进行分组,同组的放到一个新的数据库(逻辑上,并非实例)中,需要从实际业务出发将大业务分割为小业务,比如商城的整个业务中用户相关表,订单相关表,物流相关表各自独立分类形成用户系统数据库,订单系统数据库,物流系统数据库,如下图:
数据库垂直拆分

好处:

  • 业务清晰,职责单一;
  • 易维护,易扩展;
  • 数据服务化;

坏处:

  • 提高了复杂度,形成跨库事务;
  • 引发"木桶效应",任何一个短板可能影响整个系统;
  • 部分表关系不能join,只能通过服务调用来维系,甚至由于网络问题导致数据不一致;
    在需要分库的情况下,通常优先考虑垂直拆分;

2.2 数据库水平拆分

数据库垂直拆分后遇到单机数据库性能瓶颈后,就可以考虑数据库水平拆分。之所有先垂直拆分再水平拆分,是因为垂直拆分后数据业务清晰且单一,更加方便指定水平的标准。比如对商城业务垂直拆分后的用户系统进行水平拆分,就比对整个商城业务水平拆分好找维度,我们可以根据用户注册时间、用户的区域或者用户ID的范围、hash等条件,然后关联相关表的记录将数据进行拆分,如果放在整个商城业务上,你是以用户维度还是订单维度都不太好考虑。下面例子根据每100万为区间对用户系统水平拆分如下:
数据库水平拆分

好处:

  • 单个库的容量可控;
  • 单条记录保证了数据完整性;
  • 数据关系join;
  • 避免跨库事务;

坏处:

  • 拆分规则对编码有一定影响;
  • 不同业务的分区交互需要统筹设计;

3 分表

分表也分为垂直拆分和水平拆分;

3.1 表垂直拆分

表垂直拆分就是纵向地把表中的列分为多个表,把表从"宽"变"窄",一般遵循如下几点:

  • 冷热分离,把常用的列放在一个表,不常用的放在另一个表;
  • 大字段单独存放;
  • 关联关系的列紧密放在一起;
    数据库水平拆分

3.2 表水平拆分

表水平拆分和库水平拆分思想上是一致的,只不过粒度不同,表结构维持不变,拆分后数据集的并集等于拆分前的数据集。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至yj.mapple@gmail.com

文章标题:读写分离、垂直拆分、水平拆分、分库分表

文章字数:1k

本文作者:melonshell

发布时间:2020-01-22, 17:03:33

最后更新:2020-01-22, 23:38:28

原始链接:http://melonshell.github.io/2020/01/22/tech1_db_split/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏

相册