论文:NoSQL在云计算中的应用
前言
随着云计算热潮的到来,越来越多的人认识到云计算是未来技术发展的一个主流方向,未来更多应用和技术会附着于云计算的概念。
什么是云计算
狭义云计算是指IT基础设施的交付和使用模式,指通过网络以按需、易扩展的方式获得所需的资源(硬件、平台、软件)。提供资源的网络被称为“云”。“云”中的资源在使用者看来是可以无限扩展的,并且可以随时获取,按需使用,随时扩展,按使用付费。这种特性经常被称为像水电一样使用IT基础设施。
广义云计算是指服务的交付和使用模式,指通过网络以按需、易扩展的方式获得所需的服务。这种服务可以是IT和软件、互联网相关的,也可以使任意其他的服务。
关系型数据库
数据库是一种用来保存数据的技术手段,经过了几代的发展,目前主流的数据库是关系型数据库。
关系型数据库是指采用了关系模型来组织数据的数据库。关系模型是在1970年由IBM的研究员E.F.Codd博士首先提出,在之后的几十年中,关系模型的概念得到了充分的发展并逐渐成为数据库架构的主流模型。简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织。下面列出了关系模型中的常用概念。
关系:可以理解为一张二维表,每个关系都具有一个关系名,就是通常说的表名。
元组:可以理解为二维表中的一行,在数据库中经常被称为记录。
属性:可以理解为二维表中的一列,在数据库中经常被称为字段。
域:属性的取值范围,也就是数据库中某一列的取值限制。
关键字:一组可以唯一标识元组的属性。数据库中常称为主键,由一个或多个列组成。
hbase属于什么数据库关系模式:指对关系的描述,其格式为:关系名(属性1,属性2,…,属性N)。在数据库中通常称为表结构。
二维表结构是非常贴近逻辑世界的一个概念,关系模型相对网状、层次等其他模型来说更容易理解。
关系型数据库的优点是:通用的SQL语言使得操作关系型数据库非常方便,程序员甚至于数据管理员可以方便地在逻辑层面操作数据库,而完全不必理解其底层实现。
同时,关系型数据库易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大降低了数据冗余和数据不一致的概率。
技术发展
目前云计算已经得到充分的发展,各个厂商都看到云计算的商机,但是真正的发展还有一定局限性,很少有具体落地的技术。
在目前的互联网应用中,Facebook,Google等主流网站都在承受着巨大的访问压力和数据流量。
同时,通过研究发现,这类应用涉及到的数据事物相当少,主要是简单非事物处理,这样可以抛弃臃肿的关系型数据库。
针对这类业务,Google提出了基于GFS的BigTable技术,Facebook的Cassandra。什么叫做NOSQL
目前依据标准我们将BigTable,Cassandra归类为NOSQL。
我们将目前流行的Nosql的接口模型做一个比较:
NoSQL主要是针对频繁访问并数据结构简单的数据操作使用对象数据库来实现,即提高了访问速度,也可以灵活的进行扩展。
怎么将数据库技术同云计算技术结合?
先看一下下面的简单结构图:
在这个图中,基于虚拟化的技术来实现(当然,并非只有虚拟化的技术才能实现,虚拟化只是手段之一)。
对于关系型数据库,系统通过云存储的技术,虚拟一份磁盘空间,提供给关系型数据库使用,但是这存在局限性:一个表空间或一个表,只能放在实际上是同一个的物理磁盘上,不能将他分配到不同的实际物理磁盘上,否则会严重影响查询比较的性能,所以只能是一个
理论设想。
但是对于NOSQL,已经有了好多的技术来实现,比如HBase,BigTable等,不过这里需要说明的是,如果希望很好的发挥性能,对于云存储的技术要求还是很高,需要云存储提供类似RAID的技术,目前来说,有GFS和Hadoop,来实现云存储中文件系统的高可用性。
Bigtable的原理
Bigtable是一个比较典型的Nosql数据库,文件系统的基础是Google File System。
每个Table都是一个多维的稀疏图sparse map。Table 由行和列组成,并且每个存储单元cell 都有一个时间戳。在不同的时间对同一个存储单元cell有多份拷贝,这样就可以记录数据的变动情况。在他的例子中,行是URLs ,列可以定义一个名字,比如:contents。Contents 字段就可以存储文件的数据。或者列名是:”language”,可以存储一个“EN”的语言代码字符串。
为了管理巨大的Table,把Table根据行分割,这些分割后的数据统称为:Tablets。每个Tablets大概有100-200 MB,每个机器存储100个左右的Tablets。底层的架构是:GFS。由于GFS是一种分布式的文件系统,采用Tablets的机制后,可以获得很好的负载均衡。比如:可以把经常响应的表移动到其他空闲机器上,然后快速重建。
Tablets在系统中的存储方式是不可修改的immutable 的SSTables,一台机器一个日志文件。当系统的内存满后,系统会压缩一些Tablets。由于Jeff在论述这点的时候说的很快,所以我没有时间把听到的都记录下来,因此下面是一个大概的说明:压缩分为:主要和次要的两部分。次要的压缩仅仅包括几个Tablets,而主要的压缩时关于整个系统的压缩。主压缩有回收硬盘空间的功能。Tablets的位臵实际上是存储在几个特殊的BigTable的存储单元cell中。看起来这是一个三层的系统。
客户端有一个指向METAO的Tablets的指针。如果METAO的Tablets被频繁使用,那个这台机器就会放弃其他的tablets专门支持METAO这个Tablets。METAO tablets 保持着所有的META1的tablets的记录。这些tablets中包含着查tablets的实际位臵。(老实说翻译到这里,我也不太明白。)在这个系统中不存在大的瓶颈,因为被频繁调用的数据已经被提前获得并进行了缓存。
现在系统返回到对列的说明:列是类似下面的形式:
family:optional_qualifier。在他的例子中,行:www.search-analysis 也许有列:”contents:其中包含html页面的代码。“ anchor:cnn/news” 中包含着相对应的url,”anchor:www.search-analysis/” 包含着链接的文字部分。列中包含着类型信息。
注意这里说的是列信息,而不是列类型。列的信息是如下信息,一般是:属性/规则。比如:保存n份数据的拷贝或者保存数据n天长等等。当tablets 重新建立的时候,就运用上面的规则,剔出不符合条件的记录。由于设计上的原因,列本身的创建是很容易的,但是跟列相关的功能确实非常复杂的,比如上文提到的类型和规则信息等。为了优化读取速度,列的功能被分割然后以组的方式存储在所建索引的机器上。这些被分割后的组作用于列,然后被分割成不同的SSTables。这种方式可以提高系统的性能,因为小的,
频繁读取的列可以被单独存储,和那些大的不经常访问的列隔离开来。
在一台机器上的所有的tablets 共享一个log,在一个包含1亿的tablets的集中,这将会导致非常多的文件被打开和写操作。新的log块经常被创建,一般是64M大小,这个GFS的块大小相等。当一个机器down掉后,控制机器就会重新发布他的log块到其他机器上继续进行处理。这台机器重建tablets然后询问控制机器处理结构的存储位臵,然后直接对重建后的数据进行处理。
这个系统中有很多冗余数据,因此在系统中大量使用了压缩技术,压缩前先寻相似的行,列,和时间数据。
BMDiff 提供了非常快的写速度:100MB/s – 1000MB/s 。Zippy 是和LZW 类似的。Zippy 并不像LZW 或者gzip 那样压缩比高,但是他处理速度非常快。
系统举例介绍如下:
一个存储Web网页的例子的表的片断。行名是一个反向URL。contents列族存放的是网页的内容,anchor列族存放引用该网页的锚链接文本(alex注:如果不知道HTML的Anchor,请Google一把)。CNN 的主页被Sports Illustrater和MY-look的主页引用,因此该行包含了名为“anchor:cnnsi”和“anchhor:my.look.ca”的列。每个锚链接只有一个版本(alex 注:注意时间戳标识了列的版本,t9和t8分别标识了两个锚链接的版本);而contents列则有三个版本,分别由时间戳t3,t5,和t6标识。
表中的行关键字可以是任意的字符串(目前支持最大64KB的字符串,但是对大多数用户,10-100个字节就足够了)。对同一个行关键字的读或者写操作都是原子的(不管读或者写这一行里多少个不同列),这个设计决策能够使用户很容易的理解程序在对同一个行进行并发更新操作时的行为。
Bigtable通过行关键字的字典顺序来组织数据。表中的每个行都可以动态分区。每个分区叫做一个”Tablet”,Tablet是数据分布和负载均衡调整的最小单位。这样做的结果是,当操作只读取行中很少几列的数据时效率很高,通常只需要很少几次机器间的通信即可完成。用户可以通过选择合适的行关键字,在数据访问时有效利用数据的位臵相关性,从而更好的利用这个特性。举例来说,在Webtable里,通过反转URL中主机名的方式,可以把同一个域名下的网页聚集起来组织成连续的行。具体来说,系统可以把
列族
列关键字组成的集合叫做“列族“,列族是访问控制的基本单位。存放在同一列族下的所有数据通常都属
于同一个类型(系统可以把同一个列族下的数据压缩在一起)。列族在使用之前必须先创建,然后才能在列族中任何的列关键字下存放数据;列族创建后,其中的任何一个列关键字下都可以存放数据。根据系统的设计意图,一张表中的列族不能太多(最多几百个),并且列族在运行期间很少改变。与之相对应的,一张表可以有无限多个列。
列关键字的命名语法如下:列族:限定词。列族的名字必须是可打印的字符串,而限定词的名字可以是任意的字符串。比如,Webtable有个列族language,language列族用来存放撰写网页的语言。系统在language列族中只使用一个列关键字,用来存放每个网页的语言标识ID。Webtable中另一个有用的列族是anchor;这个列族的每一个列关键字代表一个锚链接,如图一所示。Anchor列族的限定词是引用该网页的站点名;Anchor列族每列的数据项存放的是链接文本。
访问控制、磁盘和内存的使用统计都是在列族层面进行的。在系统的Webtable的例子中,上述的控制权限能帮助系统管理不同类型的应用:系统允许一些应用可以添加新的基本数据、一些应用可以读取基本数据并创建继承的列族、一些应用则只允许浏览数据(甚至可能因为隐私的原因不能浏览所有数据)。
时间戳
在Bigtable中,表的每一个数据项都可以包含同一份数据的不同版本;不同版本的数据通过时间戳来索引。Bigtable时间戳的类型是64位整型。Bigtable可以给时间戳赋值,用来表示精确到毫秒的“实时”时间;
用户程序也可以给时间戳赋值。如果应用程序需要避免数据版本冲突,那么它必须自己生成具有唯一性的时间戳。数据项中,不同版本的数据按照时间戳倒序排序,即最新的数据排在最前面。
为了减轻多个版本数据的管理负担,系统对每一个列族配有两个设臵参数,Bigtable通过这两个参数可以对废弃版本的数据自动进行垃圾收集。用户可以指定只保存最后n个版本的数据,或者只保存“足够新”的版本的数据(比如,只保存最近7天的内容写入的数据)。在webtable的举例里,contents:列存储的时间戳信息是网络爬虫抓取一个页面的时间。上面提及的垃圾收集机制可以让系统只保留最近三个版本的网页数据。
对于性能来说

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。