NoSQL数据库技术分析与实践

摘要:现在是云计算的时代,传统的关系型数据库的缺点会慢慢地都体现出来,尤其是他无法应对大数据量的处理需求,导致目前关系型数据库在云计算的平台下已经成为制约整个WEB架构敏捷性和扩展性的瓶颈。为了弥补这些不足,NoSQL型数据库应运而生,NoSQL可扩展的松耦合类型数据模式,以及在易用性、高度伸缩性、支持海量数据等方面所表现出来的优点,使其在云计算领域被广泛应用。大数据的出现与发展促进了NoSQL数据库技术的发展及其产品应用,为大数据的存储、传输与处理创造了生态环境。本论文从最基本的NoSQL数据库的发展过程开始、介绍了memcached、Tokyo Tyrant、Redis和MongoDB这四种NoSQL数据库的使用背景、分析了NoSQL数据库技术特点,并对目前应用的几种典型NoSQL数据库进行了分析比较。
关键词:云计算;数据库;非关系型数据库;
   
   1 概述
   大家也许已经听说过“nosql”这个词了,但是这个词的含义到底是什么?有什么用途?有什么优点?有什么缺点等等一系列问题随之而来。Nosql数据库是为了弥补关系型数据库的不足而产生的。Nosql数据库是非关系型数据存储的广泛定义,它打破了长久以来关系型数据库与ACID理论大统一的局面。Nosql数据存储不需要固定的表结构,通常也不存在连接操作。Nosql数据库不使用传统的关系数据库模型,而是使用文档型的、列存储、图形数据库等方式存储数据模型。
   
   1.1关系型数据库技术特征分析及问题
   关系型数据库把所有的数据都通过行和列的二元表现形式表示出来,给人更容易理解的直观感受。关系型数据库可以使多条数据值来进行关联,这样就使数据可以独立存在,使得数据结构的变更变得简单易行。
   关系型数据库的特征,可以分为优点和缺点两个方面来考虑。关系型数据库的优点有两种:一种是通用性及高性能。虽然此篇论文是在介绍NoSQL数据库技术的特点,但是关系型数据库的性能高的这个优点是不能忽视的,它具有非常好的通用性和非常高的性能,当然,这些优点也就使得,在很多应用的实例面前,关系型数据库是一个很不错的解决方案,甚至是最好、最有效的解决方案;另一种是比较突出的优势。关系型数据库是一种应用相当普遍的,相当通用的数据库技术,他的比较突出的优势不仅仅是一条,比如:能保持数据的一致性(事务处理)这是关系型数据库技术最大的优势了,所以说,在需要严格保证数据一致性和处理完整性的情况下,用关系型数据库肯定是最正确的选择;由于以标准化为前提,数据更新的开销很小(相同的字段基本上都只有一处);存在很多实际成果和专业技术信息(成熟的技术)。
   关系型数据库的不足是不擅长的处理操作。首先,有大量数据的写入处理。在数据读入方面,由复制产生的主从模式(数据的写入由数据库负责,数据的读入由从数据库负责),可以比较简单地通过增加从数据库来实现规模化。但是,在数据的写入方面却完全没有简单的方法来解决规模化问题。其次,为有数据更新的表做索引或表结构(schema)变更。在使用关系型数据库时,为了加快查询速度需要创建索引,为了增加必要的字段就一定需要改变表结构。为了进行这些处理,需要对表进行共享锁定,这期间数据变更(更新、插入、删除等)是无法进行的。如果需要进行一些耗时操作(例如为数据量比较大的表创建索引或者变更其表结构),就需要特别注意:长时间内数据可能无法进行更新。再有,字段不固定时应用。如果字段不固定,利用关系型数据库也是比较困难的。也许你会想到,在需要的时候再加一个字段不就可以了吗,但是在实际的操作运用中,每次都进行反复的表结构变更是非常痛苦的。你也可以预先设定大量的预备字段,但这样的话,时间久了,很容易弄不清楚字段和数据的对应状态(即哪个字段保存哪些数据),所以不推荐使用。最后,对简单查询需要快速返回结果的处理。其实这个也不算是缺点,只是关系型数据库并不擅长对简单的查询快速返回结果,因为关系型数据库是使用专门的SQL语言进行数据读取的,他需要对SQL语言进行解析,同时还有对表的锁定和解锁这样的额外开销。这里不是说关系型数据库的速度太慢,而是想告诉大家若希望对简单查询进行高速处理,则没有必要非使用关系型数据库不可。在这种情况下,我推荐大家使用NoSQL数据库。
   1.2 NoSQL 技术的背景和发展过程。
   为了弥补关系型数据库的的不足之处,NoSQL数据库出现了,关系型数据库应用广泛,能进行事务处理和JOIN等复杂处理。相对的,NoSQL数据库只应用在特定领域,基本上不进行复杂的处理,但他恰恰弥补了之前所列举的关系型数据库的不足之处。
   1.2.1 NoSql的概念
   NoSQL数据库是非关系型数据存储的广泛定义,他打破了长久以来关系型数据库与ACID理论大统一的局面。NoSQL数据存储不需要固定的表结构,通常也不存在链接操作。NoSQL数据库不适用传统的关系型数据库模型,而是使用如文档型的、列存储、图形数据库等方式存储。NoSQL数据库基本上来说是为了“使大数据的写入处理更加容易”而设计的。但如果不是对大数据量数据进行操作的话,NoSQL数据库的应用就没有意义了吗?当然,答案是否定的。的确,他能在处理大数据量方面有很大的优势,但实际上NoSQL数据库还有各种各样的优点,到目前为止,竟然有122种NoSQL数据库了,如果他们的优点都能够恰当的被利用,将会是非常的有用。
   1.2.2NoSql背景和发展
   现在,提起数据库存储,一般都是针对关系型数据库来说的。但是,关系型数据库并不是万能的,他对于某些处理依然很是吃力的。NoSQL数据库就是为了弥补关系型数据库的不足应运而生的。在适当的情况下使用NoSQL数据库,可以为关系型数据库需要耗费大量时间才能完成的处理,提供高速、合理的解决方案。“NoSQL”不是“No SQL”的意思,而是“Not Only SQL”的缩写,他的意义是:适用关系型数据库的时候使用关系型数据库,不适用的时候也没必要非使用关系型数据库不可,可以考虑适用更加合适的数据库进行存储。NoSQL是在1998年由一个名叫Carlo Strozzi的人开发的数据库。并且于2009年,Johan Oskarsson发起了一场关于分布式开源数据库的讨论,来自全球三大云计算中心之一的Eric Evans再次提出了NoSQL的概念,这时的NoSQL主要指非关系型、分布式、不提供ACID的数据库设计模式。2009年在亚特兰大举行的no:sql(east)讨论会是一个里程碑,会上对NoSQL最普遍的解释是非关系型的,强调键——值对存储和文档数据库的优点,而不是单纯的关系型数据库。
   
   2 存储引擎及数据模型分析
   
   2.1 存储引擎分析
   存储引擎是存储系统的发动机,直接决定了存储系统能够提供的性能和功能。存储系统的基本功能包括:增、删、读、改,其中,读取操作又分为随机读取和顺序扫描。
   2.1.1 哈希存储引擎
   哈希存储引擎是哈希表的持久化实现,支持增、删、读、改,但不支持顺序扫描,对应的存储系统为键值(Key-Value)存储系统。Bitcask是一个基于哈希表结构的键值存储系统,它仅支持追加操作(append-only),即所有的写操作只追加而不修改老的数据。在Bitcask系统中,每个文件有一定的大小限制,当文件增加到相对应的大小时,就会产生一个新的文件,老的文件只读不写。在任意时刻,只有一个文件是可写的,用于数据追加,称为活跃数据文件(active data file)。而其他已经达到大小限制的文件,称为老数据文件(older data file)。
   2.1.2 B树存储引擎
   B树(B-tree)存储引擎是B树的持久化实现,不仅支持单条记录的增、删、改、读操作,还支持顺序扫描,对应的存储系统是关系型数据库。当然,键值系统也可以通过B树存储引擎实现。关系数据库中通过索引访问数据,在Mysql InnoDB中,有一个称为聚集索引的特殊索引,行的数据存于其中,组织成B+树(B树的一种)数据结构。
   2.1.3 LSM树存储引擎
    LSM树(Log-Structured Merge Tree)存储引擎和B树存储引擎一样,支持增、删、改、随机读取以及顺序扫描。他通过批量转储技术规避磁盘随机写入问题,广泛应用于互联网的后台存储系统。 LSM树思想非常朴素,就是将对数据的修改增量保持在内存中,达到指定的大小限制后将这些修改操作批量写入磁盘,读取时需要合并磁盘中的历史数据和内存中最近的修改操作。 LSM树的优势在于有效地规避了磁盘随机写入问题,但是读取时可能需要访问较多的磁盘文件。
   2.2 数据模型分椑
   如果说存储引擎相当于存储系统的发动机,那么,数据模型就是存储系统的外壳。存储系统的数据模型主要有三种:文件、关系以及随着NoSQL技术流行起来的键值模型。传统的文件系统和关系型数据库分别采用文件和关系模型。关系模型描述能力强,产业链完整,是存储系统的业界标准。然而,随着应用在可扩展性、高并发以及性能上提出越来越多的要求,大而全的关系数据库有时显得力不从心,因此,产生了一些新的数据模型,比如键值模型,关系弱化的表格模型,等等。
   2.2.1文件模型
   文件系统以目录树的形式组织文件,以类UNIX操作系统为例,根目录是/,包含/usr、/bin、/home等子目录,每个子目录又包含其他子目录或者文件。文件系统的操作涉及目录以及文件,例如:打开/关闭文件、读写文件、遍历目录、设置文件属性等。POSIX(Portable Operating System Interface)是应用程序访问文件系统的API标准,它定义了文件系统存储接口及操作集。
   2.2.2 关系模型
   每个关系是一个表格,由多个元组(行)构成,而每个元组又包含多个属性(列)。关系名、属性名以及属性类型称作该关系的模式(schema)。例如,Movie关系的模式为Movie(title,year,length),其中,title,year,length是属性,假设他们的类型分别为字符串、整数、整数。
   2.2.3 键值模型
   大量的NoSQL系统采用了键值模型(Key-Value模型),每行记录由主键和值两个部分组成,支持基于主键的如下操作:
   Put:保存一个Key-Value对。
   Get:读取一个Key-Value对。
   Delete:删除一个Key-Value对。
   4典型的NoSQL数据库存储架构分析
   4.1 面向列的存储架构
   普通的关系型数据库都是以行为单位来存储数据的,擅长进行以行为单位的读入处理,比如特定条件数据的获取。因此,关系型数据库也被称为面向行的数据库,相反,面向列的数据库以列为单位来存储数据的,擅长以列为单位读入数据。面向列数据库是最流行的一种非关系型数据库。Google Bigtable和Apache HBase(Hadop的一部分)都属于面向列数据库,Hypertable和Cloudata也是如此。他们各不相同,但有着共同的基础。面向列的数据库具有高扩展性,即使数据增加也不会降低相应的处理速度(特别是写入速度),所以它主要应用于需要处理大量数据的情况。另外,利用面向列的数据库的优势,把它作为批处理程序的存储器来对大量数据进行更新也是非常有用的。但是由于面向列的数据库跟现行数据库存储的思维方式有很大不同,应用起来十分困难。
   4.2 键/值存储架构
   键/值存储的数据是以键值的形式存储的。虽然他的处理速度非常快,但是基本上只能通过键的完全一致查询获取数据。根据数据的保存方法可以分为临时性、永久性和两者兼具3种。
   临时性就是“数据有可能丢失”的意思,memcached数据库把所有数据都保存在内存中,这样保存和读取的速度会非常快,但是,当数据库停止工作时,数据就不存在了。由于数据保存在内存中,所以无法操作超出内存容量的数据(旧数据会丢失)。
   永久性就是“数据不会丢失”的意思,这里的键值不是把数据存在内存中,而是存储在硬盘上,与memcached在内存中处理数据比起来,由于必然要发生对硬盘的I/O操作,所以性能上还是有差距的。但数据不会丢失是他最大的优点。这种类型的数据库有ToKyo Tyrant、Flare、ROMA等等。
   Redis属于这种类型。他有些特殊,临时性和永久性兼具,且集合了两种的优点。Redis首先把数据保存在内存中,在满足一定条件下(默认15分钟一次以上,5分钟内10个以上,1分钟内10000个以上的键发生变更)的时候将数据写入到硬盘中,这样既确保了内存中数据的处理速度,有可以通过写入硬盘来保证数据的永久性。这种类型的数据库特别适合于处理数组类型的数据。
   4.3 面向文档的存储架构
   MongoDB、CouchDB属于这种类型,他们属于NoSQL数据库,并且具有面向文档数据库的共同特点。即使不定义表结构,也可以像定义了表结构一样使用。关系型数据库在变更表结构的时候,比较费事,而且为了保持一致性还需修改程序。然而NoSQL数据库则可以省去这些麻烦(通常程序都是正确的),确实是方便快捷。
   跟键值不同的是,面向文档的数据库可以通过复杂的查询条件来获取数据。虽然不具备事务处理和JOIN这些关系型数据库所具有的处理能力,但除此之外的其他处理基本上都能实现。这是非常容易使用的NoSQL数据库。

原创文章,作者:Editor,如若转载,请注明出处:https://www.diyilunwen.com/lwfw/jsj/1756.html

(0)
EditorEditor
上一篇 2014年10月15日
下一篇 2014年10月15日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注