MySQL的分片(一)——分布式数据库概述

系统分析:OLAP or OLTP?

在互联网时代,海量数据的存储与访问成为系统设计与使用的瓶颈问题,对于海量数据处理,按照使用场景,主要分为两种类型:联机事务处理(OLTP)和联机分析处理(OLAP)。

  联机事务处理(OLTP)也称为面向交易的处理系统,其基本特征是原始数据可以立即传送到计算中心进行处理,并在很短的时间内给出处理结果。

  联机分析处理(OLAP)是指通过多维的方式对数据进行分析、查询和报表,可以同数据挖掘工具、统计分析工具配合使用,增强决策分析功能。 

MySQL的分片(一)——分布式数据库概述_第1张图片

OLTP和OLAP的比较。OLTP面向实时交易类,实时要求性高,查询分析功能偏弱。OLAP面向统计分析类,实时性要求一般,涉及到大范围扫描,JOIN,聚合查询等,要求有比较高的查询分析能力。

MySQL适合OLTP类型的系统,因为MySQL的分析支持比较弱,适合高并发的小的查询操作。在进行数据库技术选型及选择解决方案之前,必须对系统是OLTP还是OLAP做出准确的判断。

 

技术选型:关系型数据库 or NoSQL数据库 ?

针对上面两类系统有多种技术实现方案,存储部分的数据库主要分为两大类:关系型数据库与NoSQL数据库。

关系型数据库,是建立在关系模型基础上的数据库,其借助于集合代数等数学概念和方法来处理数据库中的数据。主流的Oracle、DB2、MS SQL Server和MysSQL都属于这类传统数据库。

NoSQL 数据库,全称为 Not Only SQL,意思就是适用关系型数据库的时候就使用关系型数据库,不适用的时候也没有必要非使用关系型数据库不可,可以考虑使用更加合适的数据存储。主要分为临时性键值存储 (memcached、Redis)、永久性键值存储(ROMA、Redis)、面向文档的数据库(MongoDB、 CouchDB)、面向列的数据库(Cassandra、HBase),每种NoSQL都有其特有的使用场景及优点。

Oracle,MySQL等传统的关系数据库非常成熟并且已大规模商用,为什么还要用NoSQL数据库呢?主要是由于随着互联网发展,数据量越来越大,对性能要求越来越高,传统数据库存在着先天性的缺陷,即单机(单库)性能瓶颈,并且扩展困难。这样既有单机单库瓶颈,却又扩展困难,自然无法满足日益增长的海量数据存储 及其性能要求,所以才会出现了各种不同的NoSQL 产品,NoSQL 根本性的优势在于在云计算时代,简单、易于大规模分布式扩展,并且读写性能非常高。

下面分析下两者的特点,及优缺点:

MySQL的分片(一)——分布式数据库概述_第2张图片

虽然在云计算时代,传统数据库存在着先天性的弊端,但是 NoSQL 数据库又无法将其替代,NoSQL 只能作为传统数据的补充而不能将其替代,所以规避传统数据库的缺点是目前大数据时代必须要解决的问题。如果传统数据易于扩展,可切分,就可以避免单机(单库)的性能缺陷,但是由于目前开源或者商用的传统数据库基本不支持大规模自动扩展,所以就需要借助第三方来做处理,那就是下面要讲的数据切分,下面就来分析一下如何进行数据切分。

数据切分:解决单库瓶颈

在同一个数据库中的数据分散存放到多个数据库(主 机)上面,以达到分散单台设备负载的效果。数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式。

 垂直切分

按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直(纵向)切分。

一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将表进行分类,分布到不同 的数据库上面,这样也就将数据或者说压力分担到不同的库上面,如下图:

MySQL的分片(一)——分布式数据库概述_第3张图片

系统被切分成了用户、订单交易、支付几个模块。

一个架构设计较好的应用系统,其总体功能肯定是由很多个功能模块所组成的,而每一个功能模块所需要的数据对应到数据库中就是一个或者多个表。而在架构设计中,各个功能模块相互之间的交互点越统一越少,系统的耦合度就越低,系统各个模块的维护性以及扩展性也就越好。这样的系统,实现数据的垂直切分也就越容易。

但是往往系统之有些表难以做到完全的独立,存在这扩库 join的情况,对于这类的表,就需要去做平衡,是数据库让步业务,共用一个数据源,还是分成多个库,业务之间通过接口来做调用。在系统初期,数据量比较少,或者资源有限的情况下,会选择共用数据源,但是当数据发展到了一定的规模,负载很大的情况,就需要必须去做分割。

一般来讲业务存在着复杂 join 的场景是难以切分的,往往业务独立的易于切分。如何切分,切分到何种程度是考验技术架构的一个难题。

下面来分析垂直切分的优缺点:

    优点:

  • 拆分后业务清晰,拆分规则明确;
  • 系统之间整合或扩展容易;
  • 数据维护简单。

    缺点:

  • 部分业务表无法 join,只能通过接口方式解决,提高了系统复杂度;
  • 受每种业务不同的限制存在单库性能瓶颈,不易数据扩展跟性能提高;
  • 事务处理复杂。

水平切分

另外一种则是根据 表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分。

相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中,如图:

MySQL的分片(一)——分布式数据库概述_第4张图片

拆分数据就需要定义分片规则。关系型数据库是行列的二维模型,拆分的第一原则是找到拆分维度。比如: 从会员的角度来分析,商户订单交易类系统中查询会员某天某月某个订单,那么就需要按照会员结合日期来拆分,不同的数据按照会员ID做分组,这样所有的数据查询 join 都会在单库内解决;如果从商户的角度来讲,要查询某个商家某天所有的订单数,就需要按照商户 ID 做拆分;但是如果系统既想按会员拆分,又想按商家数据,则会有一定的困难。如何找到合适的分片规则需要综合考虑衡量。

  几种典型的分片规则包括:

  • 按照用户ID求模,将数据分散到不同的数据库,具有相同数据用户的数据都被分散到一个库中;

  • 按照日期,将不同月甚至日的数据分散到不同的库中;

  • 按照某个特定的字段求摸,或者根据特定范围段分散到不同的库中。 如图,切分原则都是根据业务找到适合的切分规则分散到不同的库,下面用用户ID求模举例:

MySQL的分片(一)——分布式数据库概述_第5张图片

   优点:

  • 拆分规则抽象好,join 操作基本可以数据库做;
  • 不存在单库大数据,高并发的性能瓶颈;
  • 应用端改造较少;
  • 提高了系统的稳定性跟负载能力。

    缺点:

  • 拆分规则难以抽象;
  • 分片事务一致性难以解决;
  • 数据多次扩展难度及维护量大;
  • 跨库join性能较差;

    前面讲了垂直切分跟水平切分的不同跟优缺点,会发现每种切分方式都有缺点,但共同的特点缺点有:

  •  引入分布式事务的问题;
  • 跨节点 Join 的问题;
  • 跨节点合并排序分页问题;
  • 多数据源管理问题。

    针对这些问题的讨论和解决方案会在下一篇说到。

    数据切分解决传统数据库的缺陷,又有了 NoSQL 易于扩展的优点。

MySQL:做分布式数据库的优势

关于Oracle和MySQL的对比。

关于这两数据库的全方位的多维度的优劣对比,比较有经验的数据库开发人员应该能列举出很多来,我身为一名普通的应用开发人员,写不出什么硬核的分析对比,只能大概表达一些我的理解。

Oracle简单概括:功能,性能,稳定,人才;MySQL简单概括:灵活,简单,便宜,开源。

Oracle的发展历史是MySQL的两倍以上,现在已经是很成熟的商业数据库系统。Oracle为用户提供了非常丰富强大的功能,可编程和分析函数的支持都做到非常完善,还有无限的行级锁,最高级别的隔离级别,完全的事务支持,成熟的热备工具,稳定可靠但复杂的高可用配置,还有大批有经验的DBA人才,总之,如果你想要一个稳定可靠并且性能强大的数据库单集群,那Oracle是完美的。But,如果使用分布式解决方案,昂贵的Oracle也会给你带来惊人的license费用,Oracle的功能看上去丰富而全面,但是那都是要钱的,有时候我们并不需要其中的很多东西,Oracle缺少可定制化的灵活性。

MySQL有开源和灵活的优势,轻便的MySQL虽然功能性没有Oracle强大,但是作为数据库,最重要和核心的功能都做的很好。MySQL非常灵活,针对每个表都能指定不同的存储引擎,InnoDB引擎支持依赖于索引的行级锁;同时MySQL提供了简单高速的主从复制配置,能提供快速冗余的专业集群服务器;MySQL的开源特性,让互联网团队可以自研支持MySQL协议的代理中间件来支持实现MySQL的分布式集群,同时可以灵活定制修改MySQL细节功能,目前基于MySQL的分布式数据库基本都是采用这一方式。

下一篇将分享一些MySQL分片的问题讨论。

本文参考:

《MyCat权威指南》http://www.mycat.io/document/mycat-definitive-guide.pdf

 

你可能感兴趣的:(数据库,MySQL学习)