02. 分库分表
数据库的拆分
单点容易出现故障,性能方面也可能成为瓶颈,因此需要将单点改造拆分成多个点。当单点数据库的每秒访问量达到数万级别,可能会发现数据库服务器的磁盘
阿里巴巴《
数据库层面的可靠性保障,通常的措施是通过主备来解决可用性问题,通过分片来解决性能问题。
拆分维度
数据库构架设计中主要有
-
Shared Everthting: 一般是针对单个主机,完全透明共享CPU/MEMORY/IO ,并行处理能力是最差的,典型的代表SQLServer -
Shared Disk:各个处理单元使用自己的私有
CPU 和Memory ,共享磁盘系统。典型的代表Oracle Rac ,它是数据共享,可通过增加节点来提高并行处理的能力,扩展能力较好。其类似于SMP (对称多处理)模式,但是当存储器接口达到饱和的时候,增加节点并不能获得更高的性能。 -
Shared Nothing:各个处理单元都有自己私有的
CPU/ 内存/ 硬盘等,不存在共享资源,类似于MPP (大规模并行处理)模式,各处理单元之间通过协议通信,并行处理和扩展能力更好。典型代表DB2 DPF 和hadoop ,各节点相互独立,各自处理自己的数据,处理后的结果可能向上层汇总或在节点间流转。
我们常说的

互联网当下的数据库拆分过程基本遵循的顺序是:垂直拆分、读写分离、分库分表
垂直拆分能更清晰化模块划分,区分治理,水平切分能解决大数据量性能瓶颈问题,分布式改造主要是将这两者结合起来,对传统架构进行全面的改造。垂直拆分就是将原来一个整体的系统按业务模块拆分成多个系统,系统内部数据是自包含的,不会与别的系统共用数据库,系统与系统之间的交互通过暴露和调用服务来实现。前面讲的垂直拆分只是把系统按业务模块划分到不同的子系统,数据库也分到了不同系统,但没有解决单表大数据量的问题,而水平切分就是要把一个表按照某种规则把数据划分到不同表或数据库里。简单的说就是做分库分表。
数据模型分类
在做分库分表之前我们需对数据模型进行分类,分为“流水型数据”
流水型数据:像流水一样不断增长的数据,各条数据间是独立的。如支付订单、交易流水、帐务流水(入帐
状态型数据:代表一个对象当前的状态的数据。如会员信息、客户信息、帐户信息、会计帐。
配置型数据:系统中用作为配置的数据。如产品、手续费率、分支机构信息、支付路由规则、会计科目等。
流水型数据会不断产生,且各条数据间是独立的,天然适合进行分库分表。
状态型数据读写比相当,每一次写操作必须基于前一个正确的状态,可以评估一下数据量的大小,数据量如果大或者要实现单元化架构,也需要进行分库分表,提高并发处理能力,同时方便隔离故障影响。
配置型数据,读多写少,强依赖读,弱依赖写,不要求严格的读一致性,且配置型数据一般数据量不会很大,不需要进行分库分表设计。但是业务处理中往往又需要用到,传统架构的老系统可能使用了一些关联表操作,关联到了配置数据,分库后其它数据与配置不在一个库,不能进行关联表操作,由于配置型数据不要求严格的读一致性的特点,可以将配置型数据加载到分布式缓存里,由业务代码来做“join”。
那么分库分表按照什么规则来拆分呢?通常不会按实体

一种推荐做法是,在用户创建的时候给该用户随机或一定规则(如地区)生成一个两位的分片号
所以数据水平拆分除了需要一个强大的分库分表数据访问中间件,还需要一个分布式序列生成器。当然这个生成器也可以是集成在分库分表数据访问中间件中的一个功能。