Skip to content

2 概述

2.1 数据切分概述

2.1.1 OLTP和OLAP

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

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

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

两者的主要区别如下:

OLTPOLAP
系统功能日常交易处理统计、分析、报表
DB设计面向实时交易类应用面向统计分析类应用
数据处理当前的, 最新的细节的, 二维的分立的历史的, 聚集的, 多维的集成的, 统一的
实时性实时读写要求高实时读写要求低
事务强一致性弱事务
分析要求低、简单高、复杂

2.1.2 关系型数据库和NoSQL数据库

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

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

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

两者的特点及优缺点如下:

维度关系型数据库NoSQL数据库
特点数据关系模型基于关系模型,结构化存储,完整性约束。
基于二维表及其之间的联系,需要连接、并、交、差、除等数据操作。
采用结构化的查询语言(SQL)做数据读写。
操作需要数据的一致性,需要事务甚至是强一致性。
非结构化的存储,基于多维关系模型。
具有特有的使用场景。
优点保持数据的一致性(事务处理), 可以进行join等复杂查询。
通用化,技术成熟。
高并发,大数据下读写能力较强。
基本支持分布式,易于扩展,可伸缩。
简单,弱结构化存储。
缺点数据读写必须经过sql解析,大量数据、高并发下读写性能不足。
对数据做读写,或修改数据结构时需要加锁,影响并发操作。
无法适应非结构化存储。
扩展困难。
昂贵、复杂。
join等复杂操作能力较弱。
事务支持较弱。
通用性差。
无完整约束复杂业务场景支持较差。

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

虽然在云计算时代,传统关系型数据库存在着先天性的弊端,但是NoSQL数据库又无法将其替代,NoSQL只能作为传统数据的补充而不能将其替代,所以规避传统数据库的缺点是大数据时代必须要解决的问题。如果传统关系型数据库易于扩展,可切分,就可以避免单机的性能缺陷。下面就来分析一下如何进行数据切分。

2.1.3 数据切分

简单来说,就是指通过某种特定的条件,将存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。

数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式。一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直(纵向)切分;另外一种则是将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分。

2.1.3.1 垂直切分

垂直切分的最大特点就是规则简单,实施也更为方便,尤其适合各业务之间的耦合度非常低,相互影响很小,业务逻辑非常清晰的系统。在这种系统中,可以很容易做到将不同业务模块所 使用的表分拆到不同的数据库中。根据不同的表来进行拆分,对应用程序的影响也更小,拆分规则也会比较简单清晰。如下图示例:

1543198942797

一个架构设计较好的应用系统,其总体功能肯定是由很多个功能模块所组成的,而每一个功能模块所需要的数据对应到数据库中就是一个或者多个表。而在架构设计中,各个功能模块相互之间的交互点越少,系统的耦合度就越低,系统各个模块的维护性以及扩展性也就越好。这样的系统,实现数据的垂直切分也就越容易。但是往往系统之有些表难以做到完全的独立,存在这扩库JOIN的情况,对于这类的表,就需要去做平衡,是数据库让步业务,共用一个数据源,还是分成多个库,业务之间通过接口来做调用。在系统初期,数据量比较少,或者资源有限的情况下,会选择共用数据源,但是当数据发展到了一定的规模,负载很大的情况,就需要必须去做分割。

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

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

优点:

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

缺点:

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

由于垂直切分是按照业务的分类将表分散到不同的库,但有些业务中表因为数据量过于庞大存在性能瓶颈,其就解决不了,所以就需要水平拆分来解决。

2.1.3.2 水平切分

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

1543199221371

拆分数据就需要定义拆分规则,例如上述的拆分规则就是对用户表,按照userid对5取模的方式进行拆分的。也就是整除的数据都在第一个分库中,余数为1的数据都在第二个分库中,以此类推。

下面来分析下水平切分的优缺点:

优点:

  • 拆分规则抽象好,JOIN操作基本可以数据库做。

  • 不存在单库大数据,高并发的性能瓶颈。

  • 应用端改造较少。

  • 提高了系统的稳定性跟负载能力。

缺点:

  • 拆分规则难以抽象。

  • 分片事务一致性难以解决。

  • 数据多次扩展难度跟维护量极大。

  • 跨节点JOIN性能较差。


上面对水平切分做了简单的阐述,为了更好的阅读后面的内容,关于水平切分有几个常用概念需要大家知晓:

  • 数据分片:将一张表的数据按照一定规则进行拆分,经过拆分后的每一部分数据叫做一个数据分片,简称分片。

  • 分片键 :具体的拆分过程,必须针对某一个业务属性,按照一定规则进行,这里的业务属性就是所谓的拆分键,拆分键一般都是表中的字段。例如,对“客户信息”表按照“客户号”取模的方式进行拆分,这里的“客户号”就是分片键,有时也叫拆分键。

  • **分片算法:**也叫拆分算法,上述示例中的取模就是一种常用的分片规则,常用的算法包括:取模、日期、范围、枚举、hash等,当然分片算法也可以根据业务实际需要自定义实现。

  • 数据节点 :简称节点,其概念有点类似于上述的分片,但分片主要是从数据的视角来看的,属于一个逻辑概念,而节点则泛指每个分片的物理体现。当然物理体现的方式又有多种,最常用的就是一个分片对应一个数据库实例;有时候一个分片对应一个数据库实例下的一个database(MySQL或DB2)或者schema(Oracle)。这种对应关系跟数据量及扩容策略等有密切的关系。

  • 分库:当一个分片对应一个数据库实例的时候,一般将这里的每一个数据库俗称为分库。

上面的分片、节点、分库容易混淆,可以简单的理解为:分片是逻辑概念,在物理上对应节点,但分库是一种具体的物理体现方式。后面在谈一些策略和算法的时候,用分片或者节点会更加准确。

2.2 LIBRA概述

2.2.1 LIBRA简介

LIBRA是神州数码分布式数据中间件的名称,其作为“分布式开发平台 galaxy 3.0”的重要组成部分,主要关注数据层面的分布式,为业务系统提供数据水平切分、读写分离及全局序列等相关功能,底层不跟具体的数据库耦合(主要功能均在MySQL、Oracle、DB2进行验证),对应用透明。其有如下一些特点:

  • 行业领先的SQL支持度
  • 灵活的拆分及路由策略
  • 开箱即用的间接路由机制
  • 支持自定义访问机制
  • 持多法人访问
  • 跨节点的强一致事务保证
  • 具有特色的读写分离策略
  • 满足不同需求的全局序列的支持
  • 后端支持多种数据库类型
  • 全方位的高可用保障

LIBRA在整个系统中的位置如下:

2.2.2 LIBRA整体架构介绍

LIBRA整体包含两部分:LIBRA服务端、LIBRA管理端。LIBRA服务端是分布式数据访问中间件的核心部分,主要包含集群管理、接入协议、访问控制、SQL处理、全局序列、数据切分、读写分离、事务处理和数据库管理九大功能模块。LIBRA管理端为配套的管理平台,包含集群管理、监控预警、运维管理、数据扩容、数据维护五大功能模块,从多个维度综合考虑系统的稳定、可靠运行。

LIBRA服务端主要功能:

  • **集群管理:**由于在运行期间多个LIBRA的服务端实例多活运行,集群管理部分主要对事务请求流量进行分配和控制,在实例数量进行变化时负责将其纳入整个运行体系。

    • **负载均衡:**主要负责数据库访问的流量分配。
    • **动态伸缩:**在集群的负载能力达到系统瓶颈,通过增加实例数量可将其纳入整个运行体系。
    • **流量控制:**服务端通过线程池和缓冲队列进行事务请求的流量控制,避免应用处理过载。
    • **超时控制:**外部系统到VIRGO集群访问时因整体压力较大,缓冲在队列中的事务请求就有可能处理超时。与流量控制机制相结合拒绝后续请求,避免因服务端的处理能力降低而引发的客户端卡死。
  • **接入协议:**客户端通过LIBRA提供的驱动与LIBRA进行数据交互。服务端在通讯接入层采用NIO非阻塞的I/O模型来保证系统的处理能力。

    • 协议处理: LIBRA对外提供MySQL的协议接入,客户端可以把LIBRA当做一个数据库,像访问MySQL数据库的方式来访问它。LIBRA服务端接收到MySQL的原生协议指令后内部进行处理,并将SQL请求通过JDBC的访问方式传递到具体的数据库,并将数据库返回的结果依据MySQL协议组织返回报文。
    • **NIO连接管理:**创建和维护基于Select、Buffer、Channel的网络事件模型,提供多路(non-blocking)非阻塞式的高伸缩行网络I/O处理。
  • **访问控制:**为Client提供了独立的逻辑数据库用户名及密码定义,并在通讯层对IP增加白名单控制避免匿名IP的数据访问,SQL执行层面可以细粒度对DML SQL操作权限进行控制,更全面的保证LIBRA访问安全。

    • **用户管理:**可定义数据库的逻辑用户名及密码供Client访问时输入,与直接访问MySQL的登录无差别。
    • **IP访问控制:**通过IP策略定义,在网络通讯层对请求地址进行限制,控制某些IP允许(或者拒绝)登录LIBRA服务访问数据库,从安全角度保证LIBRA不被匿名IP访问。
    • **SQL执行权限:**对用户的SCHEMA及表进行精细化的权限控制,可针对每张表配置INSERT、UPDATE、SELECT、DELETE访问权限。
  • SQL处理: LIBRA将接收到的SQL语句根据MySQL协议标准进行解析,在SQL处理层面主要涉及SQL解析及优化、依据路由计算确定SQL需要执行的数据分片,将SQL路由到指定分片数据库访问数据。在跨分片的业务场景中,支持全局表和ER表等方式的连接、分组查询,并将多个数据分片的数据结果进行结果集合并输出。还提供了跨分库基于小表的复杂SQL的支持。

    • SQL解析: SQL解析是LIBRA里面的SQL路由和SQL结果集合并的基础功能,在几大模块里面占据相当重要的位置。主要功能包含:判断SQL语法是否正确、SQL语句分类并对不同类型的SQL语句做不同的逻辑处理、为SQL路由模块提供服务、为SQL结果集后处理提供服务。
    • **SQL路由:**解析执行SQL获取访问的表和路由关键字段(含间接获取)的值,结合表和路由算法定义规则,运算出所访问的数据分区。主要包括:
      • **切分规则:**一个大表被分成若干个分片表,需要一定的规则把数据分到某个分片,数据切分选择合适的分片规则非常重要,将极大的避免后续数据处理的难度。
      • **切分算法:**支持多种切分算法,分片枚举、范围约定、取模、按日期天分片、一致性HASH等,支持算法扩展。
    • **SQL优化:**通过SQL拦截进行捕获并记录某些传入的SQL,出于性能考虑改写SQL,比如改变查询条件的顺序或者增加分页限制,在进行后续的SQL执行。将某些Select SQL设为Read模式,走读写分离。
    • 复杂SQL处理引擎:负责对复杂SQL的处理,主要包括:聚合函数、排序、分页、GROUP BY、JOIN、UNION、子查询等。
    • **SQL处理扩展机制:**对非常特殊的或者复杂SQL提供多种扩展机制支持,使用者可以根据实际情况进行自定义实现。
  • **全局序列:**在实际的业务场景中有多种序列的需求,有些只需要保证唯一,有些不仅唯一还必须递增,甚至有些还要求在递增的前提下还必须连续。这些需求在分布式的情况下变得更加复杂,LIBRA提供多种全局序列的实现。

    • **表序列:**采用数据库表方式存储序列信息,实现全局唯一自增序列。
    • **时间戳序列:**带时间戳的全局唯一、秒级有序的序列生成器。要求集群服务器的时钟必须同步。
    • **外部序列:**调用序列服务平台,获取全局唯一序列。
  • **数据库管理:**LIBRA作为一个分布式数据中间件,在底层不可避免的要面对多个具体的数据库,那么对这些数据库的数据源及连接的管理就非常重要,以最大限度的节省相关资源。

    • **数据源管理:**对具体的数据库对应的数据源进行管理,使相关属性满足LIBRA的正常运行。
    • **连接管理:**对每个数据源的连接通过连接池的方式进行管理,以最大限度的复用连接,并且提高访问性能。

**LIBRA管理端:**管理端主要用于配合服务端的工作,并提供相关的运维管理功能。主要包括:

  • **集群管理:**这里的集群管理主要是配合运行态的内容进行调配,例如对运行期间的负载机流量进行控制,增加新的运行实例并无缝的加入到运行体系,以及对已有实例进行版本更新时的综合考虑等。
  • **监控预警:**对于LIBRA在日常情况下的运行状况要纳入管控体系,以便及时的发现风险,并及时处理,从另外一个角度提升系统整体的可用性。
  • 运维管理: LIBRA主要完成数据的水平分片功能,以及读写分离等。这些部分都需要相关的配置进行支持,怎么进行必要的配置并根据实际情况进行调整,这都是运维管理部分最基础的功能。另外,在运行期间发现一些SQL的执行效率比较低下,可以提供相关的调优支持,给DBA或者业务人员提供必要的依据。