常用数据库分库分表技术介绍

目录

物理分表

逻辑分表

分库

分库&分表

跨地域分库

总结


今天主要讲讲,一个网站的分库分表是有哪些方法,不同纬度的做法有哪些。

首先,一个最简单的网站结构如下,一台服务器和一个数据库就能搭建一个完整的网站,用户通过Internet访问对应的域名,就能使用该网站提供的服务。

常用数据库分库分表技术介绍

                                                                                 最原始的网站架构

物理分表

这个时期,用户也不太多,不需要超高的带宽、超强的计算资源和存储资源。一台小型服务器和数据库服务器就可以应对。同时为了降低成本,使用开源的数据库,这里以MySQL为例子。网站使用单数据库,所有的表都存储在同一个DBMS中。并且数据库服务器中使用单个磁盘进行数据存储。其形式如下图所示。

常用数据库分库分表技术介绍

                                                                                数据库内部结构

在上图中,一个数据库存使用单磁盘进行存储,所有的表都在同一个数据库中,每一个表对应一个存储文件。

随着用户不断的增多,数据量不断的增加,IO的消耗越来越严重,单表的数据查询量也越来越大,性能急剧下降,单数据库单磁盘单存储文件的方式已经不能满足网站的性能要求了。并且这种情况下,磁盘一旦发生故障,整个网站将不可用。这种情况可以购买高性能高质量的硬盘来解决,但是对于小公司,这种成本的投入,代价有点高。基于这种情况考虑,并且伴随着硬件技术和数据库技术的不断发展,逐渐演进出磁盘阵列、物理分区等低成本的存储解决方案。

常用数据库分库分表技术介绍

                                                                                磁盘阵列、物理分区

数据库不再是使用单磁盘来保存数据,而是使用磁盘阵列的方式进行数据保存,这样既能突破单磁盘的IO的性能瓶颈,提高吞吐,又能达到数据容灾的效果,如果某一块磁盘出现故障,内部的数据也不会全量丢失,网站依然可用。目前磁盘阵列技术可分为RAID0~10这几个等级,常用的有RAID0、RAID1、RAID5、RAID10这四种等级,不同等级的磁盘阵列,其数据容灾和性能是不一样的。具体的可以参考:        http://www.hack520.com/169.html

 

除了硬件上的变化,软件上也有相应的变化,原来的每一张表,由单个文件的存储,变成了由多个文件存储。这样减轻了每次数据搜索的数据量,提升了搜索性能。本文以MySQL为例,在MySQL中,物理分区是在5.1版本开始支持的,一共支持四种物理分区方式,分别是:RANGE分区、LIST分区、HASH分区、KEY分区。在这几种分区方式中,最常用的是RANGE方式。

随着研发对应用的流量特征的深入,发现大部分数场景下,对数据库的读操作比写操作多。在这种场景下,怎么去扩展读呢?在这种背景下,又催生出读写分离的技术。用一组数据库专门做读操作,一组服务做写操作。

常用数据库分库分表技术介绍

                                                                                读写分离

用作写的数据库需要实时将数据的变更同步给读的数据库。在数据库没有支持数据同步之前,可通过额外的数据同步程序进行数据库之间的数据同步。在数据库原生支持数据同步之后,采用数据库本身的同步机制进行数据同步。以MySQL为例,原生支持三种同步机制:全同步、半同步、异步。每一种同步机制又与数据的安全性和一致性成一定关系。

逻辑分表

通过磁盘阵列技术、物理分区技术和读写分离技术的应用,从数据库本身去解决性能问题,在一定程度上解决了数据量过大导致的性能下降问题,但是在单表上的并发依然存在性能问题。如果一张表存有1亿条数据,而这1亿条数据同时进行更新,在这种情况下,对关系型数据库来讲,将是一场史诗般的灾难。于是开发人员又从逻辑层去考虑如何增加数据库的并发度。

从逻辑层去增加并发,主要从表的并发上入手。如何去解决单表并发的问题呢?一般的做法是从空间和时间角度去分析哪些数据行、数据列是热点数据,将热点数据拆分成若干的低热点数据。而这个拆分过程就叫做表分割,常见的表分割手段有水平分割和垂直分割,水平分割又可以分为按某列字段或者按时间序列进行分割。

常用数据库分库分表技术介绍

                                                                                表分割

 

先从空间角度分析,如果在表行上频繁的进行操作,如查询用户这样的操作,那么可以按照一定规则进行水平拆分。把用户分成若干组,每一组使用一张表进行存储。在实际操作中,分组的方式也有很多,最常用的方式有两种:线性分段和散列。以按照用户user_id为分组条件,其分组的方式如下。

常用数据库分库分表技术介绍

线性分段的方式,按照用户的user_id尾号进行切分,分成一组组用户,每组用户用一张表存储。

散列的方式,按照用户的user_id进行取模,按照余数的映射空间,将用户分成若干组。

线性分段的方式,不需要计算,用户空间与表空间是对等的。而散列需要进行取模计算,用户空间与表空间在一定范围内是不对等的,相当于缩小了用户空间。两种方式在数据的整体分布上,没有较大的差异,不会出现数据倾斜的现象。

如果是一张表中,某几列的操作比较频繁,或者存储数据量比较大,那么可以针对这几列作垂直拆分,形成主表和子表两张表。主表和子表通过主表的唯一键进行关联。

常用数据库分库分表技术介绍

                                                                                垂直分割

通过垂直拆分就能解决某几列频繁操作或字段过大导致性能低的问题。 如果通过垂直拆分的方式还没达到性能要求,我们可以结合水平拆分,对主表或者子表再次进行拆分,形成如下的表关系结构。 

常用数据库分库分表技术介绍

                                                                                垂直拆分与水平拆分结合

上图两次水平拆分都是以user_id按照线性分段进行拆分的,也可以是第一次按线性分段,第二次按照散列去做。或者第一次以user_id做分组,第二次以其他列进行分组的手法。无论采取哪种手法,都是以降低数据热度为目的。

从空间角度分析表的操作特点,根据表操作的特点去按照一定的规则在不同纬度上进行表的分割,将热点数据分成若干低热点的数据,以提高数据库的性能。那么接下来,再从时间角度去分析,如何对表进行拆分,以提高数据库的性能。

一般情况下,在逻辑层很少在时间上进行对表进行拆分,最常见的方式有两种:按某个时间点拆分和按某个时间单元拆分。

常用数据库分库分表技术介绍

                                                                                按时间水平拆分

按某个时间点拆分,常见的做法是当数据量达到某一个阈值的时候,对之前存储的数据,按某一个时间点进行切割成两张表。具体的时间点选取需要结合数据的操作频次和数据的特性考虑。这种拆分方式比较简单,易操作,直接形成冷热两种数据。

另一种拆分方式,是按某个时间单元拆分进行拆分。每一张表代表一个时间周期的数据。如下图所示,一张表代表一天的数据。下图在按照一定空间规则拆分的同时,增加时间纬度的拆分。这种做法不仅降低了热点数据的热度,而且动态的对数据进行了冷热的分类。

常用数据库分库分表技术介绍

                                                                                按时间单元水平拆分

按某个时间单元拆分进行拆分,不好之处在于查询数据的时候,需要带有时间戳。如果查询某一时间段的数据,需要查询多张表。

通过逻辑层对表在空间与时间两个纬度进行拆分,在一定程度上提高了并发处理性能。拆分不仅解决了热点数据问题,也解决了大字段、单表数据量大等问题。

分库

上述所说的提高数据库性能的方案都是基于单库去进行的。单库能力再强,也会达到性能的上限。如果网站服务一直如下图那样的结构,将面临四种问题。

常用数据库分库分表技术介绍

                                                                                网站架构

1.外网络资源问题:带宽资源问题、超长距离访问延迟问题、南北网络访问问题。

2.内网络资源问题:应用不断增多,内网带宽、延迟等问题。

3.连接资源问题:单数据的连接是有上限的,连接资源成瓶颈。

4.存储资源问题:单数据库的性能是有上限的,随着数据不断存储,性能降低。

首先解决后三个问题,单库存在性能上限,在网络和连接上也存在限制,那么我们可以对数据库进行水平扩张,使用多库。每个库放一部分数据,从而打破单库带来的问题。

常用数据库分库分表技术介绍

 

                                                                                多数据库架构

多库能够解决2、3、4问题,那么我们怎么去分库呢?常见的分库方法:按照用户区分,将某个用户分到某个库中;按照表功能分,不同功能的表分到不同的数据库中;按照操作分,读操作一个库,写操作一个库。在实际操作中,往往会将这三种方式综合起来进行分库,即:按用户+按表功能+按操作。

常用数据库分库分表技术介绍

                                                                                分库方式

 

分库&分表

按用户的方式分库,借鉴分表的方式,对数据在数据库层进行线性分段或者散列。将数据切分成若干组,然后每一个数据库存储一组数据,这就是所谓的分库。工业上,常常与分表结合应用,即分库又分表,从整体上提升数据处理性能。

常用数据库分库分表技术介绍

                                                                                线性分段方式分库

比如将原来的单库扩展成四个库,则每个库有原来单库四分之一的数据。按照线性分段的方式,则用user_id最后两位数除以25,根据得到的结果寻找对应数据库。这种做法,最终号段与DB编号是正相关的。保持了原来数据的线性关系。再根据分库得到的分组再进行分表,每个库内部的数据按照user_id分若干组。

下面再介绍一种常见的分库分表,对数据进行多次散列。这种处理方式的效果是,很大的数列空间被压缩在一个很小的数列空间中。DB号段与user_id号段成非正相关。

常用数据库分库分表技术介绍

                                                                                散列方式分库

除了上述讲的两种分库分表方式,还有其他的两种方式:线性分库与散列分表、散列分库与线性分表。基本分库分表的方式组合如下表所示。

常用数据库分库分表技术介绍

                                                                                分库分表组合方式

按操作分库,这种方式,需要做库与库之间的数据同步。用作写的数据库需要实时将数据的变更同步给读的数据库。在数据库没有支持数据同步之前,可通过额外的数据同步程序进行数据库之间的数据同步。在数据库原生支持数据同步之后,采用数据库本身的同步机制进行数据同步。以MySQL为例,原生支持几种同步机制:全同步、半同步、异步。(GTID)每一种同步机制又与数据的安全性和一致性成一定关系。

常用数据库分库分表技术介绍

                                                                                读写分离

跨地域分库

上述的分库方法都是基于数据特性,进行的分库分表。在现实生活中我们还需要考虑网络传输、容灾等问题,所以基于这些问题,又会加入地域条件,进行划分。比较典型的网络架构,比如移动的BOSS系统,按照省份进行建设,省份网络又会汇集到更高层的网络。比如分为两个数据中心,北数据中心和南数据中心,地域性质的分库。

常用数据库分库分表技术介绍

                                                                                划分地域分中心

在汇集的过程,会用到一些与地域强关联的信息,如LBS信息、手机归属作为路由条件,分发到不同地域的数据库中。

常用数据库分库分表技术介绍

                                                                                按不同规则路由

不同的地域的数据库,又会分按照机房进行机房层级的分库。机房A是一套数据库、机房B是一套数据库。

常用数据库分库分表技术介绍

                                                                                按机房分库

总结

所以一个大型的互联网的数据库分库分表结构如下图所示。

常用数据库分库分表技术介绍

                                                                                整体架构

一个大的数据池被层层分割。

常用数据库分库分表技术介绍

                                                                                分库分表粒度

分库分表就介绍到这里,下一期将分库分表的如何路由。


—— ????完,来一顿火锅???? ——


转载标明出处,需要联系作者,请在后台留言,非常感谢!

常用数据库分库分表技术介绍

                                                                             —— 公众号:CreateLink ——