zoukankan      html  css  js  c++  java
  • Laxcus大数据管理系统2.0(5)- 第二章 数据组织

    第二章 数据组织

      在数据的组织结构设计上,Laxcus严格遵循数据和数据描写叙述分离的原则,这个理念与关系数据库全然一致。在此基础上,为了保证大规模数据存取和计算的须要,我们设计了大量新的数据处理技术。同一时候出于兼顾用户使用习惯和简化数据处理的目的,继续沿用了一些关系数据库的设计和定义,当中不乏对SQL做适量的修订。

    在这些变化中,核心仍然是以关系代数的理念去处理数据,以及类自然语言风格的数据描写叙述。所以用户在使用体验上。和关系数据库相比。不会感觉到有太多的差异。

      本章将介绍Laxcus数据结构的组成,并对当中的一些修订和修订原因做出说明。

    2.1 基础

      Laxcus沿袭了关系数据库的用户模型、逻辑模型、存储模型的三层结构。对于逻辑模型。遵循用户账号、数据库、表的结构序列,即用户账号下能够建立多个数据库。数据库下能够建立多个表,在表之下是数据文件。

    由于Laxcus的多集群架构,支持表跨节点跨集群存在。

    在逻辑描写叙述上。表是行的集合。行由多列构成,每一列相应一个数据值。实体的行,最多容纳32767列(0x7FFF),这个尺寸足以满足各种数据应用须要。

    在列的基础上,能够建立索引,通过索引实现对表的高速检索。

    用户的配置数据经过加密后。会保存到Top节点的数据字典里。

      在兼容SQL方面,SQL的管理控制语句、数据定义语句、数据操作语句,以及运算符、keyword、大部分SQL函数。被完整继承下来。

    用户依旧能够依照SQL标准进行操作。被支持的还有“空值”,包含NULL和EMPTY。二者的差别是,NULL表示数据值没有定义或者不知道。适用于全部数据类型;EMPTY仅仅用在字符或者字节数组上,表示数据值确定且是0长度。做为SQL核心的4个操作语句也得到支持,并在此基础上扩展了SELECT嵌套语句、ORDER BY、GROUP BY子句,另外也能够使用LIKEkeyword进行模糊检索。

     

    管理语句

    说明

    CREATE USER

    建立一个用户账号和password

    ALTER USER

    改动用户账号的password

    DROP USER

    删除一个用户账号及其下的全部数据资料

    GRANT

    对用户账号下的某个操作授权

    REVOKE

    收回用户账号下的某个操作权利

    表2.1.1 管理语句

    数据定义

    说明

    CREATE DATABASE

    建立一个数据库

    DROP DATABASE

    删除一个数据库及其下的全部表

    CREATE TABLE

    建立一个表

    DROP TABLE

    删除一个表和其下的全部数据

    表2.1.2 数据定义语句

    数据操作

    说明

    INSERT

    写入记录

    DELETE

    删除记录

    UPDATE

    更新记录

    SELECT

    查询记录

    JOIN

    连接查询

    表2.1.3 数据操作语句

    运算符类型

    运算符

    说明

    比較运算符

    =

    等于

    >

    大于

    <

    小于

    >=

    大于等于

    <=

    小于等于

    <>  !=

    不等于

    逻辑运算符

    not

    and

    or

    between ... and

    在某些数据范围内

    in

    满足多个条件之中的一个

    like

    模糊查询。匹配特定符串

    赋符运算符

    =

    对变量赋值

    表2.1.4 运算符

    2.2 数据类型

      眼下各种关系数据库上的数据类型,由于产品和版本号原因。数量也不尽同样。在实际应用中,最经常使用到的大约10余个。依据这样的现状。我们在设计数据类型时做了简化处理,取消了当中大部分比較少用的数据类型,保留了一批基础数据类型,另外考虑到网络应用需求,新添加了一批数据类型,同一时候对某些数据类型进行了合并。最后把它们分为两大类:固定长的数值类型、可变长的数组类型。见表2.2所看到的。

    数值类型在不同操作系统平台上都是统一的,数组类型的长度范围在0 - 2G字节之间,能够随输入数据自己主动调整。这个尺寸足以容纳当前各种文本、图片、视频、音频等多媒体内容。由于这个尺寸对用户来说已经足够大,用户在输入数据时,能够忽略列长度问题。在字符选择上,为了适用于多语言的混合环境,字符类型内码统一採用Unicode编码,因此就避免了乱码现象。Laxcus字符定义是。单字节的Char相应UTF8编码,双字节的WChar相应UTF16 Big Endian编码,四字节的HChar相应UTF32编码。

    用户在设计表的时候能够依据须要选择。比如英文环境应该使用Char,东亚语系内码和西里尔文字都是双字节,採用WChar更合适。

     

    数据类型

    标识

    字长

    范围

     

     

    数组

    类型

    字节

    原始类型

    RAW(BINARY)

    8

    0 - 2G

    媒体

    文档

    DOCUMENT

    8

    图像

    IMAGE

    音频

    AUDIO

    视频

    VIDEO

    字符

    单字符

    CHAR

    8

    宽字符

    WCHAR

    16

    大字符

    HCHAR

    32

     

     

     

     

     

    数值类型

     

    数值

    短整型

    SHORT (SMALLINT)

    16

    -32768 - 32767

    整型

    INT

    32

    -2147483648 - 2147483647

    长整型

    LONG (BIGINT)

    64

    -9223373036854775808 - 9223373036854775807

    单浮点

    FLOAT

    32

    -3.40E+38 - 3.40E+38

    双浮点

    DOUBLE

    64

    -1.79E+308 - 1.79E+308

    时间日期

    日期

    DATE

    32

    1年1月1日 - 9999年12月31日

    时间

    TIME

    32

    0时0分0秒0毫秒 - 23时59分59秒999毫秒

    时间戳 

    TIMESTAMP

    64

    1年1月1日0时0分0秒0毫秒 - 9999年12月31日23时59分59秒999毫秒

    表2.2 数据类型

    2.3 全局数据库

      在Laxcus大数据系统里,数据库被定义成“全局”的。

    这个“全局”意味着每个数据库的名称,在整个主域集群里都是唯一的。不同意出现重叠现象,即使分属两个用户也不能够。比方,当A用户建立一个名为“Product”的数据库后。B用户再建立“Product”数据库将被系统拒绝。

      採用全局数据库是出于简化系统设计和降低操作环节的考量。

    这样节点在执行过程中,由于数据库不存在同名歧义的可能性,系统能够非常easy推断每个数据库和用户的相应关系,能够降低很多不必要的作业流程。

    2.4 跨数据库操作

      我们在进行数据结构规划设计时。经常须要定义一个或者几个数据库,再这些数据库之下,又定义不同需求的表,然后录入不同性质的数据。同一时候。我们还须要设置一些公共參数,把它们放在一个或者几个表里,为了便于管理和使用,又经常希望放在一个数据库里。在数据处理时。能够给分散在不同数据库下的数据表共同使用。

      出于这种考虑,Laxcus大数据系统支持跨数据库的数据表操作。这样就形成了在一个用户账号下。在数据操作时。全部表与表之间。不用事先声明。就能够实现全然的互通互调用。在精简了系统设计和集中数据资源的同一时候,也降低了数据处理过程中非常多不必要的麻烦。方便了用户高速处理数据,提高了数据处理的灵活性和效率。 

      在实际应用中。这项功能对数据检索很有利,诸如连接查询 (Join)和嵌套查询(Sub select)这种操作。跨数据库操作不会出现数据混乱,由于它们都要接受Aid节点的管理,被Aid节点有序地依照所属条件分别运行。

    2.5 固定表

      在关系数据库里,表结构是能够随时改动变化的,可是在Laxcus,这项功能被停止使用。表结构一旦定义禁止改动。禁止的原因在于大数据所处的现实环境。试想一下,在一个由上千台计算机组成的集群环境里,假设同意改动表结构,会有什么反应?所有正在执行和关联的任务将被迫停止,新的任务将转入队列中堆积和等待。所有数据内容将依照新的表结构又一次组织和排列。

    这样的变化和等待的过程,是不论什么一个大数据集群所不能承受的。囿于这样的现实情况。Laxcus规定,表的结构一旦正式确定不同意改动。

      因为表的不可改动。同一时候被改变的还有对索引的定义。依照SQL规范。“CREATE INDEX”是在“CREATE TABLE”之后进行的操作。

    如今将它们合并到一起,在定义列的时候,指定这个列是否成为索引。

      对索引的解释,Laxcus也做了调整。

    新的规定是,一个表中仅仅能有一个列成为主索引(Prime Index)和随意多个列的副索引(Slave Index)。副索引概念与SQL没有区别,主索引除了具有副索引的功能。主要用于指示数据排列位置,即将有同样值的列组织到一起。

    例外的是,对于列存储模型,全部列成员,即使用户不定义索引,其列值也可以自己主动做为索引使用,同一时候不添加磁盘和内容开销。可是两种存储模型都须要定义一个主索引。由于涉及到数据内容在磁盘和内存上的排列。

      另外。为适应大数据处理须要。在建表命令中添加了一批新的内容,这些參数主要在“Create Table”和“数据库名.表名”之间声明,列声明中也有新的定义。

    这些參数都是可选的,不声明的时候。系统将使用默认值。

    请參见图2.5和表2.5。

     

    图2.5 数据库建表命令语句

     

    keyword

    说明

    SM

    存储模型。NSM:行存储模型;DSM:列存储模型

    CLUSTERS

    子域集群,一个或多个Home地址,或者指定数字

    CHUNKSIZE

    数据块尺寸,以兆为单位

    CHUNKCOPY

    同质数据块数据,包含一个主块和随意个从块

    HOSTMODE

    表对节点全部权。SHARE:共享主机;EXCLUSIVE:独亨主机

    HOSTCACHE

    数据块缓存,依据热度由节点选择是否自己主动载入

    PRIMEHOSTS

    表初始拥有的Data主节点数量,以后随数据诸量自己主动添加

    NULL|NOT NULL

    支持空值或者否(适用全部数据类型)

    EMPTY|NOT EMPTY

    支持这值或者否(仅仅限字符串和字节数组)

    CASE|NOT CASE

    字符串大写和小写敏感或者否

    LIKE|NOT LIKE

    字符串同意模糊查询或者否

    DEFAULT 

    列的默认值。依据类型支持数值、数组、字符串、SQL函数

    PRIME KEY|SLAVE KEY

    主/从索引。如是数组类型,指定从0下标開始的索引长度

    PACKING 

    数组列内容的加密、压缩,若加密提供password

     

    表2.5 数据库建表keyword

    2.6 取消视图

      在SQL的定义中,视图是一个虚拟表。是对实体表和其他视图的关联和映射,做为一个数据描写叙述存在于系统中,被视为用户和实体表之间的过渡而存在。视图具有向用户屏蔽实体表数据结构的作用,也具有在改变表数据结构时,不用改变上层描写叙述的能力。

    仅仅是在数据处理时,视图才将数据操作又一次定位到实体表上,然后向用户返回经过它处理重组后的新的数据集合。

      假设遵守SQL这套定义,把视图转移到大数据环境,它在处理海量数据时,就要进行视图和表之间的关联和转换,这无疑将添加执行开销。减少处理效率,同一时候也加大了系统设计难度,与我们追求简单、快捷的设计初衷相悖。另外Laxcus为代替视图提供了一套新的技术方案:数据构建。这项技术提供了对一个表或者多个表的分析、组合能力。而且具有比视图更大的灵活性和高效率。另外一个更重要的原因是:在Laxcus体系里,用户、数据之间的概念和关系已经与关系数据库大不一样。关系数据库提供视图的初衷是向部分用户屏蔽表数据结构,或者改变表数据结构而不用改变上层表述,而Laxcus的用户拥有对自己数据的所有管理权和使用权。表的数据结构也是固定的。这种设计假设移植到Laxcus显然有悖常理。鉴于这些原因,综合比較之后,Laxcus取消了视图。

    2.7 Where子句的Select检索

      在关系数据库上,SELECT检索不带WHERE语句将返回表下的所有记录。按此推理,计算机集群上的操作也应该返回一样的结果。可是这种操作转移大数据环境下。面对巨大的数据压力将导致灾难性的后果:计算机会由于瞬间暴发的庞大数据量,在还来不及处理时。就造成内存溢出和软件系统崩溃;网络也会由于这些瞬间涌现的巨大流量。出现数据风暴,造成网络堵塞。接下来的可能是大面积故障和连带的波及影响扩大化,造成整个集群的故障,从而被迫中断数据处理业务,造成不可挽回的损失。这种情况显然是不可接受的。另外,在现实的应用环境里,全网络全数据的检索操作事实上并没有太多实际意义。

      由于上述原因。Laxcus对数据检索提出这种规定,主要的数据检索操作必须是“SELECT-FROM-WHERE”语句块,否则将视为非法。拒绝运行。这项检查工作将在Front节点上分析运行,然后在集群里还有进一步的推断。

    2.8 数组列的压缩和加密

      我们在使用非常多网络应用的时候,常常会在当中保存一些敏感和关键的内容,比方银行卡password、电子邮件账号、手机电话、家庭地址等私密性非常强的信息。这些信息,一般是不希望被别人知道的,包含网络管理人员。另一些内容,比如像网页或者文档这种文本数据,一般会非常长。假设採用明文的方式保存会占用大量磁盘空间,将其压缩再保存就能有效降低空间占用量,况且文本数据的压缩比率都是非常高的。

      Laxcus提供了这样一个选项。能够对这类信息进行加密和压缩。见图2.5和表2.5,这里对格式进行说明。“Packing”是对数组列内容进行压缩和加密的keyword。压缩和加密能够同一时候声明,也能够任选其一声明,假设仅仅声明当中一种。要去掉连接它们的“AND”keyword。做加密声明时,同一时候须要提供password。password能够是不论什么语种的和不定长的字符串,在建表时会转换为UTF8码保存。压缩和加密的算法名称是固定的。已经支持的压缩算法有:GZIP、ZIP,以及加密算法:AES、DES、3DES、BLOWFISH。

      数组列的压缩和加密由用户定义,在建表时输入。

    在此后的处理过程中,算法和password也仅仅对用户可见。

      特别声明:不管数组列是否被压缩和加密。都不影响其做为索引的使用。

    2.9 事务 

      事务在2.0版本号是一个重要的模块,以管理器的形式运行在Aid网站上。

    全部数据处理工作都被默认要求运行事务处理流程。就是它们在运行数据操作前,须要通过事务管理器的审核才干实施。事务申请是一个同步串行操作过程,採用队列的“先到先得”原则,总是由排在最前面的申请获得优先使用权。申请成功后的事务会被记录到管理器队列,作为兴许事务申请时的推断比較根据,直到它的数据处理工作完毕后。才从管理器队列中撤销。没有申请成功的事务将被挂起,直到前面的事务从队列中撤销后才被唤醒。

      我们在兼顾大数据并发效率、平衡事务申请要求、保证事务操作精度这几个方面需求考虑下,依照事务操作范围,把事务分为三种类型:用户型事务、数据库型事务、表型事务。

    用户型事务拥有操纵账号下所有资源的权力,数据库事务可以操作一个或者几个数据库以及下属所有表,表事务仅仅能操作一个或者几个详细的表。

    三种事务在管理器上的地位是平等的,没有隶属关系。

    使它们产生关联的是它们所绑定的资源。这是决定一个事务可以获得申请通过、还是被拒绝挂起的根据。

      事务另外一个属性是操作状态。事务操作状态被分成“读”和“写”两种。

    不论什么一个"写“事务生效。即表示和它关联的资源对象被锁定,不同意再申请,直到这个事务完毕,这些资源被解锁。兴许“写”申请才干生效。假设是“读”操作事务生效,被关联的资源仅仅做标记,供兴许全部事务參考,其他“写”事务仍然拥有锁定这些资源的权力。

      综上所述,结合图2.9。在系统执行过程中。事务申请依照例如以下规则处理:

      1.全部类型的"读"事务都能够共享存在。

      2.假设队列都是“读”事务,兴许一个“写”事务能够获得批准。

      3.假设队列中有“写”事务,兴许一个“写”事务仅仅要不与它们存在资源冲突,就能够获得批准。否则被拒绝挂起。

      4.为了进一步提高数据库事务和表事务的并发效率,在它们之间有一个“数据库名称”比較。当这种两个"写“事务发生”数据库名称“冲突时。兴许“写”事务被挂起,即同名相互排斥。

      5.假设一个事务同一时候存在“读写”两种状态时,将依照“写”事务规则处理。

     

    图2.9 Laxcus事务处理

    2.10 分布描写叙述语言

      分布描写叙述语言(简称DDL)開始于Laxcus 0.1版本号,经过0.x、1.x版本号加强后,在2.0版本号又得到进一步完好。分布描写叙述语言由大量命令组成。使用者在操作界面上输入字符语句命令语句,通过语法解释器解释后,转换成计算机指令,分发到集群上运行。分布描写叙述语言经过这几个版本号的完好,如今已经与Laxcus大数据管理系统高度集成,提供了全方位的管理、操纵集群能力,而且贯穿到集群的每个环节。我们设计分布描写叙述语言的目的在于简化操作人员的工作,希望实现“仅仅须要操作人员通知集群做什么。而不须要去知道集群怎么做”。经过这几个版本号的使用调查证明,分布描写叙述语言所带来的效果,已经成为Laxcus大数据管理系统简单、高效处理的基本保证。

      下面我们对分布描写叙述语言的基本面貌做些简单的介绍

      2.10.1 三层结构模型 

      如图2.10.1所看到的。分布描写叙述语言是一个三层结构模型。命令从Front或者Watch节点发出。来自Front节点的命令属于用户命令,来自Watch节点的命令属于集群管理命令。不管是Front还要Watch,它们的命令都须要经过语法解释器翻译成计算机指令,才干发往集群。

    用户命令在进入集群运行操作前,首先要通过网关节点(Aid、Call)的检查。在推断是正确而且有效后,网关节点会把这个命令分配给兴许相关节点,去运行数据处理和数据管理工作。

    Watch节点由于位于集群内部。命令被翻译成计算机指令后。会直接发给与命令关联的节点去处理。

     

    图2.10.1 三层结构模型

    2.10.2 命令分类 

      如上所述。分布描写叙述语言中的命令分为两大类:集群管理命令、用户命令。

    集群管理命令由管理员从Watch节点发出,用来控制、检查集群和节点的工作状态、分布资源。

    用户命令由用户从Front节点发出,主要是运行数据操纵和数据管理。

    由于分布描写叙述语言兼容SQL,SQL中的全部命令被划入用户命令队列里。

    集群管理命令和用户命令在系统中是全然平行的,没有交集,也不同意互相使用。在权限等级上,全部集群管理命令都拥有比用户命令更高的操作权限。这体如今命令的被调用过程中。比方当两类命令同一时候出如今一个节点时,集群管理命令总是比用户命令优先获得运行的权力。

    只是在系统实际运行时,在集群中工作的基本都是用户命令,集群管理命令偶尔出现,并且也不会产生太多计算压力,所以这样的优先权并不easy体现出来。

     

    图2.10.2 集群管理命令和用户命令

    2.10.3 自己定义參数

      在过去几个版本号的演进过程中,有越来越多的用户要求系统提供一种在命令中存在、不须要系统理解、由用户自行处理的数据。这些数据的表现上。有时候可能是一个数字,有时候是一个字符串。也可能是一张图片。或者其他经过格式化处理的信息。

    它们成为命令的一部分,參与到用户的数据处理工作中。

      顺应这一项发展需求。同一时候也为了规范化数据样式,提高数据处理效率。在2.0版本号中,分布描写叙述语言正式支持自己定义參数。而且对自己定义參数做出这种规定:參数格式由Laxcus提供,内容由用户自己解释。如图2.10.3所看到的,自己定义參数被分解成三部分:名称、类型、数值。当中名称由用户自由定义,类型是系统规定,类型在名称之后。被括号包围。

    类型分为数字型和数组型两组。

    数字类型包含bool、short、int、long、ushort、uint、ulong、float、double,数组类型包含string(char)、byte、image、object。为保证传输过程时的内码一致,用户输入的string数值会被转为UTF8编码。假设自己定义參数是一个数组类型。那么数值须要被单括号包围,假设自己定义是数字类型则不须要。这种样式的自己定义參数被语法解释器解释后,将存入到命令的自己定义參数队列。随命令一起分发到集群上,在须要它发挥作用的位置參与数据处理工作。

     

    图2.10.3 分布描写叙述语言自己定义參数

  • 相关阅读:
    ubuntu 安装PHP
    修改rm 防止误删除
    游标输出
    微软已经提供了好几个开源的小项目供学习参考
    数据库存取时间比较
    UML建模工具比较
    16进制与BYTE类型转换
    显示有换行字符的提示框
    ORACLE数据库中主要字段类型的读写例子(包括:Long、Raw、Blob)
    .net 动态sql 参数应用 oracle和sql server的比较
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7233628.html
Copyright © 2011-2022 走看看